17

私は本当に奇妙な問題に遭遇しましたが、それをさらにデバッグする方法がわかりません。NGINX + PHP5-FPM + APC Amazon Ubuntuインスタンスがあり、複雑なPHPフレームワークであるWebサイトがインストールされています。問題をデバッグしようとしている間、フローをこれに減らしました:多くの大きなクラスが含まれ、メインオブジェクトが作成され、セッションが開始され、構成の配列がmemcachedから取得され、XMLファイルがmemcachedから取得されます。HTMLテンプレートが含まれ、出力がクライアントに送信されます。

次に、http_loadツールを使用して、Webサイトに1秒あたり20リクエストの負荷をかけます。http_load -timeout 10 -rate 20 -fetches 10000 ./urls.txt

次に起こることはかなり奇妙です。topは、それぞれがCPUの数%を使用して生成された一連のphp5-fpmプロセスを示しており、次のようにすべてがスムーズに実行されます。

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28440 www-data 20 0 67352 10m 5372 S 4.3 1.8 0:20.33 php5-fpm
28431 www-data 20 0 67608 10m 5304 S 3.3 1.8 0:16.77 php5-fpm
28444 www-data 20 0 67352 10m 5372 S 3.3 1.8 0:17.17 php5-fpm
28445 www-data 20 0 67352 10m 5372 S 3.0 1.8 0:16.83 php5-fpm
28422 www-data 20 0 67608 10m 5292 S 2.3 1.8 0:18.99 php5-fpm
28424 www-data 20 0 67352 10m 5368 S 2.0 1.8 0:16.59 php5-fpm
28438 www-data 20 0 67608 10m 5304 S 2.0 1.8 0:17.91 php5-fpm
28439 www-data 20 0 67608 10m 5304 S 2.0 1.8 0:23.34 php5-fpm
28423 www-data 20 0 67608 10m 5292 S 1.7 1.8 0:20.02 php5-fpm
28430 www-data 20 0 67608 10m 5300 S 1.7 1.8 0:15.77 php5-fpm
28433 www-data 20 0 67352 10m 5372 S 1.7 1.8 0:17.08 php5-fpm
28434 www-data 20 0 67608 10m 5292 S 1.7 1.8 0:18.56 php5-fpm
20648 memcache 20 0 51568 8192 708 S 1.3 1.3 2:51.06 memcached
28420 www-data 20 0 69876 13m 6300 S 1.3 2.3 0:20.89 php5-fpm
28421 www-data 20 0 67608 10m 5300 S 1.3 1.8 0:21.19 php5-fpm
28429 www-data 20 0 9524 2260 992 S 1.3 0.4 0:11.68 nginx
28435 www-data 20 0 67608 10m 5304 S 1.3 1.8 0:18.58 php5-fpm
28437 www-data 20 0 67352 10m 5372 S 1.3 1.8 0:17.87 php5-fpm
28441 www-data 20 0 67608 10m 5292 S 1.3 1.8 0:20.75 php5-fpm

次に、1秒から数分の間のどこかになり得るしばらくすると、いくつかの(通常は2つの)php5-fpmプロセスが突然すべてのCPUを消費します。

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28436 www-data 20 0 67608 10m 5304 R 48.5 1.8 0:23.68 php5-fpm
28548 www-data 20 0 67608 10m 5276 R 45.2 1.7 0:07.62 php5-fpm
28434 www-data 20 0 67608 10m 5292 R 2.0 1.8 0:23.28 php5-fpm
28439 www-data 20 0 67608 10m 5304 R 2.0 1.8 0:26.63 php5-fpm

この時点で、すべてがスタックし、すべての新しいHTTP要求がタイムアウトします。http_loadツールを停止すると、php5-fpmが何分間もハングします。興味深いことにphp5-fpm stop、そうすると、php5-fpmプロセスは消えますが、ファイルシステムを使用するコマンドは実行に問題があります。たとえば、ssh経由でファイルをダウンロードしようとするとtop、次のように表示され、実際のダウンロードを開始するのに何分もかかります。

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3298 sshd 20 0 7032 876 416 R 75.2 0.1 0:04.52 sshd
3297 sshd 20 0 7032 876 416 R 24.9 0.1 0:04.49 sshd

PHPエラーログには通常次のようなものがあります。

[05-Dec-2012 20:31:39] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 58 total children
[05-Dec-2012 20:32:08] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 0 idle, and 66 total children

Nginxエラーログは次のエントリで溢れています:

2012/12/05 20:31:36 [error] 4800#0: *5559 connect() to unix:/dev/shm/php-fpm-www.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: ..., server: ec2-....compute-1.amazonaws.com, request: "GET /usa/index.php?page=contact_us HTTP/1.0", upstream: "fastcgi://unix:/dev/shm/php-fpm-www.sock:", host: "ec2-....compute-1.amazonaws.com"

PHP-FPMの遅いログには興味深いものは何も表示されず、スワッピングは発生せず、問題に関する他の興味深い事実を収集することはできませんでした。私は設定ファイルの変更を何度も繰り返しましたが、最新のものは

nginx.conf: http: //pastebin.com/uaD56hJF

pool.d/www.conf: http: //pastebin.com/mFeeUULC

===更新1===

サイトの設定:http://pastebin.com/qvinVNhB

===更新2===

dmesgまた、このようなエラーを報告することがわかりました

[6483131.164331] php5-fpm[28687]: segfault at b6ec8ff4 ip b78c3c32 sp bff551f0 error 4 in ld-2.13.so[b78b5000+1c000]

===更新3===

念のため、ハードウェアの問題を排除するために、新しいAmazonEC2マイクロインスタンスを用意しました。また、現在php-fastcgiを使用して、fpmのバグの可能性を排除しています。その他の違いはわずかですが、変更されるのはUbuntu->Debianだけだと思います。サーバーがmax_execution_time秒後にわずかに回復する(そして再びスパイクする)ことを除いて、同じ問題が引き続き発生します。

別のtest.phpで遊んでみましたが、同じ問題かどうかはわかりませんが、少なくともtop同じように見えます。test.phpを作成し、フレームワークに属する一連のライブラリを含めました。ライブラリは、クラスを定義するか、クラスを定義する他のライブラリを含めることを除いて、何もしません。私はAPCに確認しましたが、これらすべてがAPCによって正常に処理されます。私は毎秒200リクエストでtest.phpにプレッシャーをかけ始めましたが、しばらくすると同じことが起こりました。それを除いて、「開いているファイルが多すぎます」というエラーが発生しました。ただし、常に発生するとは限りません。エラーを出力せずにタイムアウトが開始され、いくつかのphpプロセスがスタックしてすべてのCPUを消費する場合があります。私はそれで少し遊んだだけですが、ここには相関関係があると思います-含まれるライブラリの数またはわずかに変化するリクエスト/秒レートを制御することで、CPUスパイクがいつ発生するかを制御できます。

fs.file-max = 70000
...
*       soft    nofile   10000
*       hard    nofile  30000
...
worker_rlimit_nofile 10000;
...
(reloaded all the configs and made sure the new system vars actually took affect)

したがって、これまでに思いついた次善の唯一の説明は、APCはメモリからファイルをプルすることになっていますが、内部的には、PHPinclude-sが呼び出されるたびにファイル記述子を使用する方法で実装されているということです。そして、遅延してリリースするか、不幸な瞬間に同時に到着するリクエストが多すぎるため、システムは記述子を実行し、新しく到着したHTTPリクエストはすぐに巨大なキューにスタックされます。どういうわけかこれをテストしてみます。

4

5 に答える 5

13

私は同様の構成で何ヶ月もダウンタイムなしで Web サイトを運営してきました。設定を確認しましたが、問題ないようです。そうは言っても、私はかなり前に設定を行いました。

pm.max_requests = 10000のようなより合理的なものに減らすことを検討しpm.max_requests = 500ます。これは単に「各インスタンスを X 数を超えるリクエストに使用しない」ことを意味します。この数値を高くしすぎないようにすることをお勧めします。これにより、PHP エンジンのバグの可能性に対する回復力が得られるからです。

本当の問題は、PHP スクリプトにある可能性が最も高いと思います。詳しくわからないとなんとも言えません。

編集:コメントを外し;request_terminate_timeout = 0て、のようなものに設定することを検討してくださいrequest_terminate_timeout = 20。スクリプトは 20 秒以内に完了する必要があります。動作の変化が見られる可能性が最も高いですが、サイトは稼働し続ける可能性があると思います. これは、PHP スクリプト エラーを示します。

EDIT2: 私自身の php-fpm 構成は次のとおりです。

[example.com]
listen = /var/run/sockets/example.com.socket
user = www-data
group = www-data
pm = dynamic
pm.start_servers = 5
pm.max_children = 15
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_requests = 500
php_flag[expose_php] = off
php_flag[short_open_tag] = on

EDIT3: nginx 構成で予期しないものを見つけましたが、何もない可能性があります。

fastcgi_ignore_client_abort on;古いバージョンのnginxの下でワーカープロセスで問題を引き起こすものを使用しています。最近のバージョンのカスタム コンパイルを実行しているので、私自身はこの問題を見ていません。nginx サイトの問題の説明は次のとおりです。

1.0.2 では、fastcgi_ignore_client_abort が on に設定されている場合、POST リクエストが正しく処理されず、ワーカー プロセスのセグメンテーション違反が発生する可能性があります。fastcgi_ignore_client_abort をデフォルト (オフ) に戻すと、この問題が解決するはずです。

于 2012-12-05T21:17:41.800 に答える
4

簡単なトリックですが、プロセッサの使用率を最大 50% 削減するのに非常に便利です。php-fpm 構成を編集するだけです。

pm = dynamic

次のように変更します。

pm = ondemand
于 2016-09-01T07:14:10.530 に答える
3

私のサーバーでの PHP-FPM の動作はあなたと同じです。確かにどこかでボトルネック。
問題は次のとおりです。Nginx - PHP-FPM - Mysql でボトルネックを見つける方法は? 最も速い方法は、PHP-FPM の Slowlog を有効にすることです。
以下の行を php-fpm.conf プールに追加し、パスが存在することを確認します

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

ログのバックトレースを読むと、PHP-FPM が大量の CPU やタイムアウトを消費した理由がわかります。これが私のケースです:

[28-Dec-2018 14:56:55]  [pool laravel] pid 19061
script_filename = /public_html/index.php
[0x00007efdda4d8100] hasChildren() /public_html/laravel/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php:75
[0x00007ffe31cd9e40] hasChildren() unknown:0
[0x00007ffe31cda200] next() unknown:0
[0x00007ffe31cda540] next() unknown:0
[0x00007ffe31cda880] next() unknown:0
[0x00007efdda4d7fa8] gc() /public_html/laravel/vendor/laravel/framework/src/Illuminate/Session/FileSessionHandler.php:91
[0x00007efdda4d7e50] gc() /public_html/laravel/vendor/laravel/framework/src/Illuminate/Session/Middleware.php:159
[0x00007efdda4d7d48] collectGarbage() /public_html/laravel/vendor/laravel/framework/src/Illuminate/Session/Middleware.php:128
[0x00007efdda4d7c20] closeSession() /public_html/laravel/vendor/laravel/framework/src/Illuminate/Session/Middleware.php:79
[0x00007efdda4d7ac8] handle() /public_html/laravel/vendor/laravel/framework/src/Illuminate/Cookie/Queue.php:47
[0x00007efdda4d7930] handle() /public_html/laravel/vendor/laravel/framework/src/Illuminate/Cookie/Guard.php:51
[0x00007efdda4d7818] handle() /public_html/laravel/vendor/stack/builder/src/Stack/StackedHttpKernel.php:23
[0x00007efdda4d76e0] handle() /public_html/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:641
[0x00007efdda4d7598] run() 
/public_html/index.php:51

バックトレースは、これらのキーワードについて言及しています:

"cookie" "session" "collectGarbage()" "laravel"

私は検索を続け、TADA、Laravel は RANDOM メソッドを使用して期限切れのセッションをクリアします。私の設定では、PHP は SSD を使用してセッションを処理します。
セッション数が「非常に大きく」なると、PHP の処理時間が長くなります => CPU 使用率が高くなります。

さまざまな種類のボトルネックが発生する可能性があり、 「デバッグ」したときにそれを知ることができます。

よく調べてください。

于 2018-12-28T08:24:53.217 に答える
0

私も同じ問題を抱えていました。PHP-FPM と NGINX を再構成しようとしましたが、あまりうまくいきませんでした。私たちの担当者の 1 人が v8js.php ( http://php.net/manual/en/book.v8js.php ) を無効にして、問題を解決しました。トラブルメーカーが見つかるまで、php モジュールを無効にすることをお勧めします。うまくいけば、それは誰かを助けます。

于 2013-04-22T16:47:13.447 に答える