渋谷「シーサーズ」にて。
会社で管理してるサーバ(IBM Netfinity3000, Kondara MNU/Linux 2000)、落ちる(泣)。なんで帰る直前に・・・
# まあ家に帰った直後に気づくよりはいいんだけど。
kernel: VM: do_try_to_free_pages failed for httpd...
というメッセージが延々コンソールに流れてる。ログイン不能。ネットワーク経由でも、ping に反応するだけで telnet 等は出来ず。カーネルのエラーなんぞ分からん(^^;; が、仮想メモリ関係でページ割り当てに失敗した、てな雰囲気。メモリ割り当てられなきゃ新しいプロセスも生成できんし、ログインも出来ないのは道理。暫く待って、祈りながらリセット(涙)。
# 幸い(ReiserFS の効果もあってか)ファイル損傷等はなし。ふう。
ネットワークケーブル引っこ抜いて(お客さん来ないようにね)、
$ find . '*.c' -exec grep -l do_try_to_free_pages {} \;
./mm/vmscan.c
とカーネルのソースを grep してみる(見て分かるわけではないが)。予想通り、仮想メモリ、スワップ関係らしい。
時間がないので、とりあえず物理メモリを増やす。メモリ買ってきたばっかりでよかった・・・<力技。よろしくない。
手元の 2.2.17 のソースと diff を取って見ると、2.2.16 とはここら辺のコードが変更されているようなので、ついでにカーネルも上げることに。
kernel-common をアップデート
# rpm -Uvh kernel-common-2.2.17-10k.i586.rpm
kernel, kernel-headers, kernel-source をインストール(not アップデート)
# rpm -ivh kernel-2.2.17-10k.i586.rpm
# rpm -ivh kernel-source-2.2.17-10k.i586.rpm
# rpm -ivh kernel-headers-2.2.17-10k.i586.rpm
SCSI 構成のマシンなので、initrd を作る。
# /sbin/mkinitrd /boot/initrd-2.2.17-10k.img 2.2.17-10k
/etc/lilo.conf に新カーネルの記述を追加、/sbin/lilo して、リブート。
さらに、mod_perl でスクリプト起動毎に @INC の更新を検査するように
PerlInitHandler Apache::StatINC と設定してたけど、これも外す。(モジュール更新時には httpd の再起動必要)
しかし mod_perl 、httpd (Apache) が太るなぁ。起動直後で素の httpd の倍近いサイズだし、スクリプトが走るとコンパイル結果をメモリ上にキャッシュするからその分(モジュール含む)だけ太る。1プロセスで 5MB 太ったら20 プロセス起動したときには 100MB 余計に消費するわけで・・・確かにパフォーマンス上がるけど、ハードウェア(特にメモリ)はけちっちゃ駄目らしい(^^;