時々毎秒最大400のリクエストを処理できるLAMPサーバーがあります。サーバー構成は次のとおりです。
CPU: Intel Quad Core Xeon X3430 (4 x 2.40 GHz, 8MB Cache)
RAM: 16 GB REG ECC DDR3
HD: 500 GB Enterprise Grade SATA II
OS: CentOS 64 Bit (Latest Stable)
Apache2プリフォーク設定:
StartServers 128
MinSpareServers 16
MaxSpareServers 64
ServerLimit 1500
MaxClients 1500
MaxRequestsPerChild 10000
ピーク時には、サーバーの負荷が非常に高く、CPU使用率は約90%、負荷平均は約1
サーバーのハードウェア制限か、プリフォーク構成に問題があるかわかりません-何が問題なのですか?
Apacheがリクエストを処理するために最大1500の子を生成することを許可しています(ServerLimit
/MaxClients
)-サーバーの負荷(実行キューで待機しているプロセスの数)が膨大になるのも不思議ではありません!!
質問で引用している数値を使用した1秒あたり400リクエストでの私の最初の提案は、「MySQLサーバーを独自のボックスに移動する」または「別のWebサーバーを追加してリクエストの負荷を分散する」というより良い選択です。
追加のサーバーのサイズを決定する方法を理解するには、Apacheプロセスの平均サイズを計算するためにHDDP500が回答で示したアドバイスに従ってください。新しいサーバーで実行するApacheプロセスの数を把握し、それらを処理するために必要なRAM)の量を決定します。安全マージン(ギガバイトまたは2ギガバイト)を追加することを忘れないでください。
CPU要件(速度/コア数)を把握するのは少し難しいです-各ページを生成するためにサーバーが実行する必要のある「作業」の量を考慮する必要があります。 XDebug のようなツールは、ページの生成にかかる時間を通知することで、ここで役立ちます(このテストは、アンロードされたサーバーとロード中のサーバーで実行する必要がありますが、notほとんどの場合、運用サーバーでXDebugなどのツールを使用します。)
Httpdプロセスの平均サイズはどれくらいですか?
サーバーに負荷がかかっているときに次のコマンドを実行します。
ps -ylC httpd --sort:rss | awk '{sum+=$8; ++n} END {print "Tot="sum"("n")";print "Avg="sum"/"n"="sum/n/1024"MB"}'
これにより、Apacheプロセスのおおよその平均サイズがわかります。
MaxClientsが高すぎる可能性があります。
CPU割り込みを調べて、ボトルネックがどこから始まるかを確認します(top
経由)。前に述べたように、ServerLimit
/MaxClients
をダイヤルダウンすることをお勧めします。
消費量によっては、ボックスがCPUを使い果たす能力が低下するため、速度が上がる可能性があります(すべきです)。