17

私は最近、php-fpm プロセスの使用量 (アクティブなプロセスの量と同様) が利用可能な最大プロセスに達し、問題のあるプロセスが終了するまで他のスクリプトの実行を停止するという問題に遭遇しました。

もう少し詳しく説明すると、現在の php-fpm 設定は次のとおりです。

pm = static
pm.max_children = 100

ほとんどの場合、php-fpm のステータス ページを見ています。

total processes: 100
idle processes: 95-99
active processes: 1-5

これは正常です。ただし、アクティブなプロセスのカウントが数秒間 100 に跳ね上がり、その後、通常の 1 ~ 5 に戻ります。その間、サーバー上で実行されている他のすべてのスクリプトは、その期間停止します。(ブラウザからは、待機中のページが表示されます)。

今、特定のトラフィックの急増があるかどうかを確認しましたが、そうではありません。また、その日のトラフィック数が最も少ない場合にも発生する可能性があります。

おそらく特定の状況でのみ、特定のスクリプトが何らかの理由でphpに利用可能なすべてのプロセスを単純に使用させていると思います。

この問題は、PHP 5.2.X から 5.4.X に移行したときに始まりました。

現在60ほどのサイトがあり、各サイトのページをめくって確認するのはちょっと大変です。

nginx のログには何もありません (重要なことは何もありません。いくつかの通知などがあります)。

私がやろうとしているのは、どのphp-fpmスクリプトがプロセスを使用しているかをトレース/プロファイル/モニターすることです。そのため、どこから問題を探し始めればよいかがわかります。

これは可能ですか?多分別のアプローチ?

アップデート

以下は、1 時間の PHP-FPM プロセス数を 1 分間隔で表したグラフです。

グラフ

私が話しているジャンプを赤でマークしました。スパイク時のメモリ使用量は変わらない

4

1 に答える 1

38

php-fpm ログ ファイルには、次のような内容が表示されるはずです。

 WARNING: [pool www-images] server reached pm.max_children setting (5), consider raising it.

アクティブなプロセスの数が制限に達したとき。それを、入ってくるリクエストと関連付けることができるはずです。

問題の原因となっているリクエストのパターンが表示されない場合は、php-fpm 構成にスロー ロギングを追加する必要があります。

request_slowlog_timeout = 10
slowlog = /var/log/php-fpm/slow.$pool.log

は、slowlog_timeout の制限を超えるリクエストごとにスタック トレースをログに記録します。

それでも何も表示されない場合は、内部アプリケーションのログにスローダウンが発生した場所が表示されるはずです。

それでも十分な詳細がない場合は、最後の手段としてstraceを使用できます。これにより、どのシステム コールが行われているかが表示されます。それは情報の奔流を生み出すでしょう。strace -p PIDPID が php-fpm インスタンスのプロセス ID である単一のプロセスにのみアタッチすることをお勧めします。

また、その日のトラフィック数が最も少ない場合にも発生する可能性があります。

これは、php-fpm のスロー ログに確実に表示されるはずです。ただし、どのリクエストが遅いかを示しているだけで、その理由を理解するのに役立たない場合は、PHP-FPM 構成ファイルで auto pre および post-pend ファイルを使用してデバッグを追加できます。

php_value[auto_prepend_file]=/php_shared/prepend.php
php_value[auto_append_file]=/php_shared/postpend.php

または本当に単純に

PHP-FPM ステータス ページを設定できます。

これを PHP-FPM プール構成に追加します。

pm.status_path = /www-status

そしてリクエストをnginx経由でPHP-FPMに渡します

location ~ ^/(www-status)$ {
    include       %mysite.root.directory%/conf/fastcgi.conf;
    fastcgi_pass   unix:%phpfpm.socket%/php-fpm-www.sock;

    # or IP address
    # fastcgi_pass 127.0.0.1:9000;

    #If you're fastcgi.conf doesn't set the query_string
    #pass the query string here instead.
    # fastcgi_param  QUERY_STRING  $query_string;


    fastcgi_index index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

    allow 127.0.0.1;
    allow stats_collector.localdomain;
    allow watchdog.localdomain;
    deny all;
}

次に、yoursite.com/www-status?full にアクセスすると、次のようなすべての php-fpm プロセスが大きく表示されます。

pool:                 www
process manager:      dynamic
start time:           18/Mar/2013:20:17:21 +1100
start since:          243
accepted conn:        3
listen queue:         0
max listen queue:     0
listen queue len:     0
idle processes:       3
active processes:     1
total processes:      4
max active processes: 1
max children reached: 0
slow requests:        0

************************
pid:                  6233
state:                Idle
start time:           18/Mar/2013:20:17:21 +1100
start since:          243
requests:             1
request duration:     631
request method:       GET
request URI:          /www-status
content length:       0
user:                 -
script:               /documents/projects/intahwebz/intahwebz/basereality/www-status
last request cpu:     0.00
last request memory:  262144

ところで、データベースをロックしているばかげたクエリに賭けます。

于 2013-03-18T09:23:59.740 に答える