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


8

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

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

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

  • 私たちは、ワードプレスやdrupalなどのよく知られ、よく文書化され、巧妙に細工された他のフレームワークではなく、非常に未知の、おそらくCPUを集中的に使用するphp指向の恐ろしいフレームワークを使用しています。キャッシングを処理する)nginx + php_fpmプラットフォーム上の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子供たちを増やし、最小/最大/開始サーバーを調整/増加するように叫んでいます。しかし、そうすると、前述のように負荷平均が狂ってしまいます。必ずしもキャッシュを使用せずにこれを行うにはどうすればよいですか?

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

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


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


Nginxは、CPUを集中的に使用するWebアプリケーションにはあまり適していません。ただし、CPUの使用率が高く、非常に悪いので、現在、修正に取り組んでいます。適切な数のクライアントをサポートできるため、最大のクライアント設定はありません。ただし、プロセスごとのCPU使用率が高いと、その機能が損なわれます。apacheに切り替えたのは、CPU使用率が高い方がLITTLEが優れているからです。ただし、最終的にはこの問題はWebアプリの問題を示しており、対処に時間がかかる場合がありますが、現在のように修正を開始する時間はありません。
amurrell 2014

あなたが医者に行くと、彼はあなたに「薬を飲むのをやめてファーストフードを食べるのを止める」という言葉を聞かないことを知っているので、特定の薬を飲むようにあなたに言います-これがまさに私に大きな答えがなかった理由です-真実は、実際に適用されたセットアップやクイックフィックスはありません。Webアプリ自体を劇的に変更しなければならないという悲しい真実のみです。
amurrell 2014

ありがたいことに、一般的なフレームワークでこの問題が発生した場合、キャッシングとそれに関する豊富なドキュメントを活用するオプションがあるかもしれませんが、フレームワーク自体を除いて変更できない、あいまいでランダムなものがあります。わーい!
amurrell 2014

1
したがって、私が理解していることから、opcacheはPHPコードをバイナリとして格納し、php-fpmによってより速く(キャッシング)使用できますが、オブジェクトキャッシングも利用する必要があります。例として、ページ全体の出力を「オブジェクト"memcachedのようなもの。これは実際にページ出力(またはphpセッションなどの必要なもの)をキャッシュします...次に、リバースプロキシであるvarnishを使用することもできますが、基本的にはリクエストとサーバーの間の仲介者であるため、サーバーはリクエストで直接ヒットされていません-キャッシュされたURLを提供するためにメモリから機能します。
amurrell 14

1
Varnishはこれに最適です。サーバーから取得したもののキャッシュされたコピーをメモリに保存するので、varnishは負荷の多くを占めます。私の現在の雇用主はnginxを使用しており、ワニスとmemcachedを使用しています。幸い、現在使用しているフレームワークには、ページキャッシュ(出力されたページデータ)を決定するための独自のキャッシュメカニズムがあります。私の最後の仕事で私はそれを自分でフレームワークに書き込む必要がありました-面白くはありませんでしたが、動作しました.Apache-nginxを修正する時間がなければ、元に戻すことはありませんでした。私がキャッシュメカニズムを書いている間、プロジェクトを完全に殺さないための唯一の解決策です。
amurrell 14

回答:


6

考慮すべき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制限機能がここに記載されていますが、他のすべてのオプションを使い果たした場合にのみ、この機能を使用します。このパスを選択する場合は、PHP-FPMの微調整とlimits.conf構成の間で起こりうる相互作用に注意してください。その時点でetckeeperは命の恩人かもしれません!:)

幸運を!

ルーベン


明日、max_requestsを制限してみましょう-許可する各プロセスがCPUを使い果たしたいので、これは良いアイデアかもしれません。緊急時の再起動のしきい値を使用していますが、私の数値はわずかに高かったです。誠にありがとうございます。キャッシュについてのあなたの考えを知りたいですか?PHPキャッシングを利用することで、フレームワークを処理できるようにフレームワークを調整する必要があるかどうか、疑問に思っています。私はその概念にかなり新しいです。
amurrell 2014

3

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

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


私はこのZend OpCacheに興味があります-私たちは5.3にいます-この答えをさらに詳しく説明していただければ幸いです。
amurrell 2014

私たちはxcacheを持っていました-しかし今私はZend Opcacheを選択しました、そしてそれをインストールして、それがphpinfo()で稼働中であることを確認しました。結果が指を越え
amurrell

私は今のところzend opcacheを無効にする必要がありました-dynamic-phpで生成されたcssまたはjsファイルを除いてすべてが機能していました。これらのファイルをopcacheからブラックリストに登録しようとしましたが、ブラックリストが機能しなかったか、opcacheがnginxにこれらのファイルのみの502不正なゲートウェイエラーを発生させている理由がわかりません。これらはテンプレートに必要であり、それらは悪いフレームワークの一部です。nginxログで、大量のreadvを受け取ったが失敗した-104ピア接続エラー。
amurrell 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.