子プロセスが産まれへんらしい
シリアスで性質の悪い障害にもかかわらず、ぐぐっても出てこず、かつしょーもない原因でもあり、ハマるにはアホらしいので、記事にする価値はあるだろうと言うことで久々のコンピューター関係のエントリー。
perl 5.8.4 apache 2.2.0 solaris10 最下位モデル位のsun4uでの話。
業務で使っているwebサーバーがちょっと前からエラーを出すようになった。
機器とOSとシステムの選定から構築まで全部俺がやったというと聞こえはいいけど、用はあまっていた古いハードで、俺の趣味を存分に生かして作ったもの。
むちゃくちゃ古いハードに最新のOSと最新のサービスが突っ込んである。
落ちて当然のような気もするけど、愛着もあるので落としたくない。
症状としては掲示板にアクセスすると子プロセスが作れない旨のエラーを出してエラーコード500で止まると言うもの。
毎回落ちるのではなく、時々正常に動作するのが性質が悪い。
最初はDOS攻撃するワームがどこかで動いているのかと思ったけど、apacheのプロセスは死んでいないし、PHPは問題なくちゃんと動いているし、apacheのプロセス上限にきているわけでもない。
エラーを吐くのはperlのCGIのみ。
apacheに残るログは
「(12)Not enough space: couldn’t create child process: 12: xxxxx.cgi ~」
「(12)Not enough space: couldn’t spawn child process:/xxx/xxx/cgi-bin/xxx/xxx.cgi,~」
って感じ。何が「Not enough space」なのかと言うと、どうやらメモリらしく、子プロセス作られへんくらいに、実メモリ、仮想メモリを使い切ってるということらしい。
考えてみればこんな状態でも細々と息絶え絶えにでも動いているsolarisとsparcすげーと感心するも、とりあえずファイルベースのswapを割り当ててやるとまともに動き出した。
solarisの場合なら、
# swap -a /export/swap
で/export/swapとして256mのswap領域を追加。
# swap -a
でちゃんと追加されているのを確認。
再起動したら元に戻るので、適時/etc/vfstabに追記して起動時に/sbin/swapaddされるようにしてやる。
/etc/vfstabには
と追加。
/sbin/swapaddが自動実行されるように
ってのは強引か?
現象としては過負荷なので、本来なら隙を見て物理メモリを追加してやるか、ディスク増設してswap領域作ってやるの正道やと思うけど、手を加えるほどの価値のあるハードでもないので、別マシンにIIS+windowsでサーバーを作り直し、ドメイン統合認証を使いたいという色気が出てきた。