2007年6月30日土曜日

winnt_acceptエラーとの戦い、そして敗北

 ある日気付いた。Apacheのログにエラーが出てることに。

[warn] (OS 121)セマフォがタイムアウトしました。 : winnt_accept: Asynchronous AcceptEx failed.
[warn] (OS 64)指定されたネットワーク名は利用できません。 : winnt_accept: Asynchronous AcceptEx failed.
 大量にと言う程ではないが、少なからず出ている。動作は特におかしいところが無かったので気付かなかった。でもそういえば、稀にResponseが帰ってこないことがあった。Windows+Apacheのサーバはいくつか見ているが、エラーが出てるのは1つだけ。

 Webで調べてみると、WindowsではデフォルトでAcceptEx()を使う設定になっているが、環境によってはこれがうまく動かない場合があるらしい。たしかに今回エラーが出てるのはちょっと特殊な環境かも。
 対策としてはこのAcceptEx()を使わないように、httpd.confにWin32DisableAcceptEx ディレクティブを追加すること。そうすると"BSD 形式の accept() API"を使うようになるらしい。

 mpm_winnt - Apache HTTP サーバ

 Apache2.0では <IfModule mpm_winnt.c> のところに追加すればいいらしいが、Apache2.2ではどこに追加するの?とりあえずhttpd.confの最後に追加してみたら、それでOKだった。

 ところが問題発生。ぐんぐんメモリ使用量が増えていく。止まらない。MaxRequestsPerChildを1000に下げても、メモリ使用量はWin32DisableAcceptExを追加する前に比べてずいぶん多い。

 結局、winnt_acceptエラーを回避するのは諦めた。エラーログが汚れるけどそれほど実害は無いので。メモリが逼迫するよりはマシでしょう。
 ところでこれについての情報が少ないのはWindowsだからだろうね。

0 件のコメント:

ブログ アーカイブ

tags