web-dev-qa-db-ja.com

Nginx + php-fpm-各php-fpmは実行時に70-100%cpuを処理します

次の状況が発生しています。

  • 8コア、8 GBのRAM、2.6 GHzのlinodeを使用しています-nginx + php-fpmを使用しています-CPU使用率の非常に高いグラフを取得しています(これは、このような悪いVPSネイバーになりたくない)...

  • 一度に約100人未満のユーザーがサイトにいるため、この状況も非常に厄介であり、CPU使用率が非常に高くなっています。

  • wordpressまたはdrupal nginx + php_fpmプラットフォーム上のphp(キャッシュを処理するプラグインと同様)のphpに関するドキュメントがたくさんあります。

  • したがって、実行中のphp-fpmプロセスは約6つあり、個別に大量(30以上、多くの場合99%に近い)のCPUを消費します。CPUが大量に使用されないようにする方法は、私にはまったくわかりません。 。これらのスパイクが常に発生しているため、どのphpスクリプトがこれらのスパイクを引き起こしているのかわかりません。通常、実行されているのは1つまたは2つだけです。ただし、6つすべて実行すると、8つすべてのCPUが最大化されます。

  • 私のpool.d/www.confファイルには次の設定があります。

    pm = dynamic
    pm.max_children = 10
    pm.start_servers = 4
    pm.min_spare_servers = 2
    pm.max_spare_servers = 6
    
  • 私がそれを解釈している方法で、私たちのメモリは実際に素晴らしいです(使用されている472/7000 + mb、スワッピングなしなど)、さらに多くのプロセスを処理し、取得するために待機している行を分解できるため、これを^セットアップしました処理済み-ただし、残念ながら、実行中の各プロセスはCPUで非常に負荷が高いため、CPUが屋根を通り抜けてしまうため、十分なプロセスを処理できません。

  • 質問-いったい何ができるかプロセスのphp-fpm cpu使用量を減らして、php-fpmのプールconfファイルの設定を増やすことができます-およびまた、はい、/ var/log/php5-fpm.logは、子供を増やし、min/max/startサーバーを調整/増やすように叫んでいます。しかし、そうすると、前述のように負荷平均が狂ってしまいます。必ずしもキャッシュを使用せずにこれを行うにはどうすればよいですか?

  • 私の考えは?私はcpulimitを使用して、割り当てられた量以上のCPUを使用するプロセスがないことを確認しましたが、それによって処理速度が低下し、使用できなくなりますか?または、そうすることで、いくつかのプロセスを実行する能力を高めることができます-2つのプールを実行することも考えました-1つは前向きのWebサイト(顧客が体験するもの)用で、もう1つはバックエンド(時間の前向きのサイトに影響を与える)用ですを消費するレポートが実行されています)。

  • 私はこのトピックについて数日間研究、グーグルなどを費やしてきました-そして、すべての人の状況は彼らのシステムに非常に独特であるので難しいです-問題はそのような特定の前代未聞の、おそらく不十分に書かれた-フレームワーク-が作っていることです解決策を見つけるのは難しい。まだこのフレームワークをスクラップすることもできません。ある種の解決策を見つける必要があります。


更新:私はphpセッションを保存するためにmemcacheを実装しました-フレームワークはユーザーセッションに大きく依存しており、システムの性質上、従業員は一度に複数のタブを使用することが多いので、各セッションをチェックして能力/ユーザーデータなどを確認します...したがって、これによってパフォーマンスがある程度向上することを期待しています-必要に応じてコメントを歓迎します-ボリュームのピークタイムが増えたときに明日どうなるかを確認します。

8
amurrell

考慮すべき2つの点(すでに考慮している場合は事前に謝罪):まず、nginx構成を最適化し、絶対に必要な場合にのみphp-fpmを呼び出すようにしてください。あなたがやりたい最後のことは、phpに静的なHTMLページのようなものを処理させることです(これは喜んで行います)。

次に、php-fpmを使用しているので、php-fpmの子の存続期間をもっと積極的にすることをお勧めします。短命のスレッド/子供と安定性の間のスイートスポットを見つける必要があります。 php-fpmのデフォルトは、IMHOの生産システムには寛大すぎます。ワーカーがリクエストに対応できる時間が長くなるほど、不安定になります。また、メモリリークのリスクが高くなります。また、参照するこのフレームワークに無限ループなどのバグがあり、それがCPU負荷の悲しみの原因になっている場合でも、害はありません。

本番環境プールのpm.max_requestsの数を減らします。デフォルトは200だと思います。50から始めて、どこに行くのか見てみましょう。

これに失敗/補足として、これらのグローバルオプションを試すこともできます(デフォルトではすべて無効になっています)。

emergency_restart_threshold 3
emergency_restart_interval 1m
process_control_timeout 5s

これは何を意味するのでしょうか? 3つのPHP-FPM子プロセスが1分以内にSIGSEGVまたはSIGBUS(つまりクラッシュ)で終了した場合、PHP-FPMは自動的に再起動するはずです。子プロセスは、マスターからの信号に対する反応を5秒待ちます。

ここで私がここで述べたすべての構成オプションとその他の素敵な概要があります: http://myjeeva.com/php-fpm-configuration-101.html

これらのヒントがお役に立てば幸いです。微調整して観察することを忘れないでください、残念ながら、これらすべての経験則はないようです。観察したように、PHPの動作と安定性に影響を与える変数が多すぎます。

最後に、問い合わせたCPU制限機能は here で文書化されていますが、他のすべてのオプションを使い果たした場合にのみ使用します。このパスを選択する場合は、PHP-FPMの微調整とlimits.conf構成の間で起こりうる相互作用に注意してください。その時点で etckeeper は命の恩人かもしれません! :)

幸運を!

ルーベン

6
Rouben

オペコードキャッシュを実行していますよね?

以前はここで主役だったAPCでしたが、かなりバグが多く、 Zend Opcache によって置き換えられました、これは現在PHPの5.5の一部であり、5.3および5.4のPECLにバックポートがあります。

3
Michael Hampton