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