MySQL と Apache の発狂
Posted by yoosee on Debian at 2004-08-29 23:42 JST1 __alloc_pages: 0-order allocation failed (gfp=0xf0/0)
朝起きてみたら、どうもこのサーバの HTTP に繋がらない。幸い ssh での接続は出来たので、login して見てみると dmesg に__alloc_pages: 0-order allocation failed (gfp=0xf0/0) VM: killng process ......が大量に出ている。どうやら何かのプロセスが暴走したか何かで swap を含めてメモリを食い尽してしまったようだ。
但し殆んどのプロセスは一度 kill された後に自動復旧していて、死んだままになっているのは bind9, apache, mysql 程度らしい。ともあれ bind9 無しでは何も出来ないのでその場で start させておく。
2 原因判明?
幸い、snmpd 経由で CPU, memory, bandwidth, I/O usage, num of processes の他に、apache や mysqld のプロセス数も定期記録していたものが残っていた。そこから状況を見るに、メモリを食い尽す直前の apache, mysqld の process 数がバーストしているのが見て取れる。これらが同時にバーストすると言うことは、apache 経由でmysql 処理を必要とする cgi に高い負荷がかかった可能性がある。と言うことでログファイルを調べてみると、MovableType の mt-comments.cgi に DoS 的な POST アクセスがあり、これによって MT の rebuild が際限無く発生し、apache と backend の mysqld を巻き込んで死んだのが直接原因のようだ。
3 apache process 99%
改めて apache を起動しようとするが、どうも 80 番 port が上がってこない。apache process を見てみると %CPU が 99.8 になっていて、全く起動してこないようだ。ちなみにこの apache は apache 1.3.31-4 。lock file も出来てないところを見ると、本当に初期の段階で死んでいるっぽい。なのでまず設定ファイル httpd.conf を疑ってみる。あれこれしてみると VirtualHost の設定を全て取り除くとうまく動くようだ。しかしもちろんこのままでは実用にならない。しばらく見ていくと、
<VirtualHost yoosee.net>のように VirtualHost Directive を名前ベースで宣言していると駄目で、
NameVirtualHost *:80 ... <VirtualHost *:80> ServerName yoosee.netのように受けておけば暴走せずに起動することが分かった。恐らくは apache 側のバグだろうが、とりあえずこれで動くし設定的にも不具合ではないのでこれで復旧しておく。やれやれ。