apache で初回アクセスに妙に時間がかかる現象
apacheで、初回アクセスに妙に時間がかかる現象が発生して、困惑していたんだけど結局基本的なapacheの設定が原因だったので、メモを残しておきます。
サーバーでLAMP構成のサービスを動かしています。このサーバーのメモリ使用量が増える問題が起こっていました。とりあえずphpのプロセス数を制御するために MaxClients
を制限して、PHPプロセスでメモリを無駄に使用している処理を改善する修正をしたり、mysqlの設定を変更してメモリ使用量を抑える等の対策をしたところ、サーバーのメモリ使用量が増えすぎることはなくなり、ロードアベレージも上昇しなくなりました。
しかし、ある時間帯になるとページを表示するのに時間がかかり、1回表示されるとサクサク動く、という謎の現象が発生するようになりました。この時サーバーのメモリ使用量もロードアベレージも上昇していません。
結論
アクセスする利用者が増えた時に、apacheの MaxClient
が制限にひっかかり、phpのプロセスが処理できるようになるまで待ってしまうということだったようです。KeepAlive
ONであり、 KeepAliveTimeout
がデフォルトの15秒なので、この待ち時間のせいで問題を大きくしてしまっていたようです。
対策としては、以下を行ないました。
- メモリ削減対策を行なって余裕ができた分
MaxClients
とServerLimit
の値を増やしました。 KeepAliveTimeout
のデフォルト値 15秒から、3秒に変更しました。
この修正により、処理しおわったPHPプロセスが3秒経ったら次の接続を受付けることができるようになるので、妙な待ち時間が減るはずです。
この対応でも類似問題が続くようだったら、KeepAlive
をOFFにすることを検討する必要があるかもです。
振り返ってみれば、apacheの基本的な設定の問題だったのですが、いろいろな対策を行なった後だったこともあり、fail2ban 等を疑ったりして回り道してしまいました。