MySQL と Apache の発狂

Posted by yoosee on Debian at 2004-08-29 23:42 JST

*1  __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 側のバグだろうが、とりあえずこれで動くし設定的にも不具合ではないのでこれで復旧しておく。やれやれ。

*4  問題のサイトの方

荒らしコメントが連続投稿されているのが問題なのは明らかなので、とりあえずその IP を ban しておく。mt-comments.cgi へのアクセス数を個別に制御したいんだが、mod_tsunami では VirtualHost 単位でしか出来ないのだよな。何かよい module はないだろうか。コメント数もやたら多い(1500以上…)ので、一度 close して記事を分離した。少しは落着くだろうか。

( Permalink | Comments (0) | tags: security  )
Comments

Please write your comment. email address won't appear. Cannot use any HTML tags in comment.
コメントをお書き下さい。メールアドレスは公開されません。 またHTMLタグは利用できません。
Name   E-mail   URL
Comment

About W.W.Walker

World Wide Walker は yoosee による blog です。PDA, Web・サーバ技術, 美味しい食べ物などの話題を取り上げています... read more

このエントリーのブックマーク

Monthly Archives

Select Month to read