あーかいぶすハイディフィニション

ここはもう更新しとらんのじゃ

わしはディスクか 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 ごと捨てれば問題ない……と思うんだけどどうだろう?