わしはディスクか inode を 100% 使い切ると「no space left on device」を出力すると言ったな、あれはウソだ
ウソです(白目)。
事の発端
Rails 1.1.6 環境で運用してるアプリケーションの production.log にちょいちょいこんなものが出力されておりました。
No space left on device - /var/www/rails/orenosaito/tmp/sessions//ruby_sess.1145141919893810.tmp (あとでちゃんとしたメッセージに差し替えておきます…)
なんでや!該当のサーバはセッション生成する処理なんぞはさんどらんで!いやそもそも 3Tbyte 近いディスク積んどったやろ!
[root@production ~]# df -h 10%位しか使ってないよーん [root@production ~]# df -ih 5%位しか使ってないよーん
えええ……。
1ディレクトリあたりの総ファイル数
原因はこっちでした。セッションのファイルが多くなりすぎたんが問題なんやね。ちなみにファイルがいっぱいだと「Too many links」が出力されると思い込んでましたが、そっちはディレクトリ(とシンボリックリンク?)の数がいっぱいの時にだけ出力されるらしい、ふんがー。
というわけでサービスを停止してから、該当の sessions ディレクトリを rm もしくは mv してから、再度 mkdir すれば問題解決です!なおこの時、cp や rm を実行すると inode の移動が発生するため、クッソ大量のI/O が発生して場合によってはハードウェアが死にます。なので、問題を回避したい場合は、mv で inode を動かさず、名前だけ変更して逃げることで無用な混乱を回避できます。
おまけ:どうしてもファイルを消したいとき
screen で仮想ターミナルを一つ立ち上げて、その中で rm なりを実行すれば、ハングアップしても screen ごと捨てれば問題ない……と思うんだけどどうだろう?