Webサービスに対して負荷テストを実行しています。これは、fastcgiを使用してphp-fpmおよびnginxで実行されるphpアプリケーションです。小さな読み取り専用に使用されているMySQLバックエンドがあります。
常に、独特のパターンが見られます。パフォーマンスは安定しており、トラフィックが増加するにつれて予測どおりに増加しますが、ピーク時には不安定になります。CPU使用率は常に変動します。
これが私が見ているパフォーマンスパターンです(nmon
で視覚化されています):
ドロップオフは、負荷テストツール(locust.io)が、テスト用に設定したピークレベルまで上昇し終えたときの短い一時停止と常に一致します。
私の仮説:この短い瞬間に、php-fpm
マスターは負荷がなくなったと考え、労働者を殺し始めます。しばらくしてトラフィックが本格的に戻ったときは、十分な速さで応答できません。
私がよく理解していないのは、なぜそれがそのスイングに完全に戻ることができないのかということです。ロードバランサーの背後にある4つのアプリケーションサーバーすべてでこの変動が無期限に見られます。
これが私のphp-fpmプール設定です:
[www]
user = www-data
group = www-data
listen = /var/run/php5-fpm.sock
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 100
pm.start_servers = 40
pm.min_spare_servers = 40
pm.max_spare_servers = 100
pm.max_requests = 10000
データベースの問題ではないことをすでに確認しました。MySQL読み取りスレーブの数を2倍にした後、まったく同じ動作が見られました。
これは何が原因ですか?どうすれば停止できますか?
編集:
これが私が見ているものを示すグラフです。失敗率は通常、user_countがピークに達すると急上昇し、徐々に落ち着くことに注意してください。
ディスクIOとロックで何が起こっているのですか?おそらく、プロセスが変更されるポイントまでCPUにバインドされている場合、他の何かがビジーであり、それはディスクである可能性が高いです。
スワッピングを開始する原因となるメモリ制限に達していますか?どのくらいのRAMあなたのPHPプロセスは(RSS)を使用しますか?どれくらいのRAM利用できますか?あなたは得ますか? PHPプロセスの数をノックバックすると、同様に変動するパフォーマンス?変動はどのレベルで表示されますか?
ご了承ください pm.max_children = 100
はおそらく高すぎます。大量のダウンロードなどの長時間実行されるリクエストを処理しているのでない限り、それを大幅に減らす方がよいでしょう。システムが何をしているのかわからないまま番号を指定することを躊躇しますが、おそらく5〜40の範囲の何かがはるかにうまくいくでしょう。 pm.max_requestsも高すぎる可能性があります。 100を超えると、メリットがほとんどなく、大幅に低下する可能性が高くなります。phpによって実行されているものが非常に変動し、メモリを消費する場合、またはメモリリークがある場合は、より良い結果が得られます。それをかなり減らします。何が機能するのか本当にわからない場合は、これらの各設定から約30から始めて、実験してください。
PHPセッションを生成していますか?それらはどのように保存されていますか?ファイルシステム上にある場合、それはどのようなファイルシステムですか?場合によっては、それらが存在するディレクトリをロックすることでボトルネックが発生します。それらにハッシュ化されたディレクトリ構造を使用するか、たとえばmemcachedを使用するとそれが役立ちます。
PHPプロセスレポートに時間がかかっている場合、straceは何を実行しますか?次の行に沿った複合コマンドでそれを確認できます。
(ps wwaux | grep '^www-data.*php' | awk '{print $2}' \
| xargs -n 1 -P 32 strace -r -p ) 2>&1
| Perl -ne '($n) = /^ *(\d*\.\d*)/; print "$n\t$_" if ((defined $n) and ($n > 0.01))'