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エラー等もエラーログを参照しながら除去しました。
- PHPをビルドしてApacheと連携させる方法
- ApacheのCGIでソースが表示される場合の対処
- Apache 2.4 系をソースからインストール
- 「php_flag short_open_tag off」の意味
- mod_rewriteの動作を確認する方法
- WindowsにApacheを簡単にインストールする方法
- Windows+ApacheでSSLを有効にする方法
- Apacheログのリクエスト時間にミリ秒・マイクロ秒を表示する
- Windows + XAMPP + OpenSSL
- PHP における「モジュール版」と「CGI 版」の比較 + WordPress の適用例
- Apache のチューニング(その3)・DiceによるWindows再起動
- Apache のチューニング(その2)