Apache のチューニング(その3)・DiceによるWindows再起動
Apache の再起動を周期的に行うことでメモリリークを回避する設定にしていますが、その2でお伝えした通り、再起動が正常に行われなかった場合、エラーが発生します。さらに Apache のプロセスが残る場合もあるようで(しかもそのプロセスが数十MBのメモリを喰ったまま)、あまりいい按配ではありません。
ということで Apache の方は現在の設定にして、Windows の再起動を行う方法を追加することにしました。Windows のタスクスケジューラで再起動できるようですが、Dice にプログラムスケジューラー機能があり、この中にシャットダウンや再起動も組み込まれていることを知りましたので、これを使って1日1回再起動を行ってみることにしました。以下 Windows XP での設定方法です。
これだけでは再起動時のログインパスワード入力で止まってしますので Windows 再起動時にパスワード入力を不要にする設定を実施します。
「スタート」→「ファイル名を指定して実行」を選択して、
- control userpasswords2
を入力して実行します。ユーザーアカウント画面が開くので「ユーザーがこのコンピュータを使うには、ユーザー名とパスワードの入力が必要」のチェックを外して「OK」をクリックします。その後自動ログオンの設定画面が開くので、ログオンする時のユーザー名とパスワードを設定して「OK」をクリックします。
参考サイトは下記です。ありがとうございました。
Apache のチューニング(その2)
先日、その1で MaxRequestsPerChild でリクエスト数の上限を設定し、子プロセスを再起動するようにしましたが、下記のエラーが時々発生しています。
[crit] [Mon Nov dd hh:mm:ss 2005] file .\\server\\mpm\\winnt\\child.c, line 1060, assertion "(rv >= 0) && (rv < threads_created)" failed
ネットで同様の事象を検索したところ、下記の1件しかヒットしませんでした。
対処は「バージョンを 2.1.8 にアップグレードする」と書かれています。Apache HTTP Server は現在 2.1.9-beta がリリースされていますが、Windows 版は 2.0.55 が最新のため、残念ながらこのエラーは回避できないようです。
Apache のチューニング(その1)
先日より続いているアクセス不具合についてチューニング(というほどのものではありませんが)を実施しました。何回か報告する機会がありそうなのでとりあえず「その1」に。
不具合に関連する事象で把握できているのは次の3点です。
- Apache プロセスのメモリが増加し続け(メモリリーク)、1日で数百MBに膨れ上がる
- 何らかの契機にレスポンスが突然遅くなる(お昼休み等、アクセスが集中すると×?)
- Apache を再起動すればアクセスは正常になる
チューニング関連の記事を調べた結果、下記の2つのディレクティブについて httpd.conf に設定することにしました。
MaxRequestsPerChild
これは個々の子サーバが稼働中に扱うリクエスト数の上限で、このディレクティブに設定された値を超えると子プロセスは終了(再起動)します。デフォルトは 0(=子プロセスを終了しない)ですが、現在は 5000 に設定しています。記事によっては2桁?3桁で書かれているものもあり、どの程度の値にすればよいか悩みましたが、やや大きめの値にしています。
この設定で1日稼動させてみたところ、レスポンスが遅くなるという事象は収まったようです。ただログを確認するとプロセス再起動の周期がやや短いようなので、値の調節はもう少し必要かもしれません。
参考記事は下記です。
- MaxRequestsPerChild ディレクティブ
- PHP-users:Apacheのメモリー使用量について
- @IT:Apacheパフォーマンス・チューニングの実践
- CGI Laboratory:WindowsでApacheを使うには?
Win32DisableAcceptEx
もうひとつのディレクティブ Win32DisableAcceptEx は上記の検索をしている時にたまたまみつけたもので、Windows の winsock が原因で AcceptEx のエラー
指定されたネットワーク名は利用できません。 : winnt_accept: Asynchronous AcceptEx failed.
セマフォがタイムアウトしました。 : winnt_accept: Asynchronous AcceptEx failed.
が頻繁に発生するようです。VirtualHost 別のエラーログばかり見ていたので気がつかなかったのですが全体のエラーログに上記のエラーがかなり大量に頻繁に発生していました。
アクセス不具合との関連がないにしてもこれは回避しておきたいので、MPM_WinNT モジュール部分に Win32DisableAcceptEx を追加。これで上記のメッセージは止まりました。
参考記事は下記です。
まとめ
現在の httpd.conf の(該当箇所の)設定は次のようになっています。
<IfModule mpm_winnt.c>
ThreadsPerChild 250
MaxRequestsPerChild 05000
Win32DisableAcceptEx
</IfModule>
MaxRequestsPerChild はデフォルト値 0 を書き換え、Win32DisableAcceptEx は1行追加。ThreadsPerChild はデフォルトで設定された値をそのまま利用しています。
また上記と併せてPHPやCGIエラー等もエラーログを参照しながら除去しました。

