ホームページ >バックエンド開発 >PHPチュートリアル >Nginx+PHP-FPM最適化スキルのまとめ

Nginx+PHP-FPM最適化スキルのまとめ

WBOY
WBOYオリジナル
2016-07-29 09:16:141084ブラウズ

1.Unixドメインソケット通信

Unixドメインソケット通信方法については以前簡単に紹介しました。参照:Nginx+PHP-FPMドメインソケット構成方法

Unixドメインソケットがないためネットワークを使用すると、Nginx と php-fpm 間の通信のパフォーマンスは確かに向上しますが、同時実行性が高い場合は不安定になります。

Nginx は頻繁にエラーを報告します:

アップストリームへの接続中に unix:/dev/shm/php-fcgi.sock への Connect() が失敗しました (11: リソースが一時的に利用できません)


はい、次の 2 つの方法で安定性を向上させます:

1) nginx と php-fpm のバックログを増やす 設定方法は次のとおりです: nginx 設定ファイルのこのドメイン名のサーバーの下に、listen の後にデフォルトの backlog= を追加します。 80 1024。


同時に、php-fpm.conf の listen.backlog を 1024 に設定します。デフォルトは 128 です。

2) sock ファイルと php-fpm インスタンスの数を増やします

新しい sock ファイルを作成し、Nginx のアップストリーム モジュールを使用して、背後にある 2 セットの php-fpm インスタンスへのリクエストの負荷を分散します。 2 つのソックス ファイルの方が優れています。 2.php-fpmパラメータチューニング

2.1 プロセス数


php-fpmのワーカープロセスの初期/アイドル/最大数

pm.max_children = 300

pm .start_servers = 20 pm.min_spare_servers = 5



pm.max_spare_servers = 35

2.2 最大処理リクエスト数


リクエストの最大数処理済みとは、php-fpm ワーカー プロセスがいくつかのリクエストを処理した後に終了し、マスター プロセスが新しいプロセスを再起動することを指します。
この構成の主な目的は、プログラムによって参照される PHP インタープリターまたはサードパーティのライブラリによって引き起こされるメモリ リークを回避することです。

pm.max_requests = 10240


2.3 最大実行時間
最大実行時間はphp.iniとphp-fpm.confの両方で設定できます。設定項目はそれぞれmax_execution_timeとrequest_terminate_timeoutです。
その役割と影響については、Nginx の 502 エラーと 504 エラーの詳細な説明を参照してください
3. php-fpm の高 CPU 使用率のトラブルシューティング方法
3.1CPU 使用率の監視方法
1) top コマンド
を直接実行した後top コマンドを実行して、1 を入力すると、各コアの CPU 使用率が表示されます。また、top -d 0.1 によりサンプリング時間を短縮できます。
以下のsarは1秒だけ短いようです。
2) sar コマンド
sar および iostat コマンドのインストール:
sysstat.x86_64: sar および iostat システム監視コマンド
yum install -y sysstat.x86_64
sar -P ALL 1 100 を実行します。 -P ALL はすべてのコアを監視することを意味し、1 は 1 秒ごとに収集することを意味し、100 は 100 回収集することを意味します。
出力結果は次のとおりです: pcpu%user%nice%System%System%Steal%Idle
all 85.54 0.00 5.69 0.00 8.76
0 74.75 0.00 0.00 0.00
0.00 0.00 0.00
2 0.00 92 0.00 0.00 6.86
3 91.00 0.00 2.00 0.00 0.00 7.00
4 75.00 0.00 9.00 0.00 0.00 16.00
5 94.95 0.00 5.05 0.00 0.00 0.00
6 95.00 0.00 4.00 0.00 0.00 1.00
7 87.88 0.00 4.04 0.00 0.00 8.08
8 93.94 0.00 3.03 0.00 0.00 3.03
9 88.00 0.00 3.00 0.00 0.00 9.00
10 89.11 0.00 2.97 0.00 0.00 7.92
11 82.35 0.00 3.92 0.00 0.00 13.73
12 73.27 0.00 7.92 0.00 0 .00 18.81
13 81.44 0.00 4.12 0.00 0.00 14.43
14 77.23 0.00 6.93 0.0 0 0.00 15.84
15 78.79 0.00 4.04 0.00 0.00 17.17

3.2 スローログを有効にする出力 php-fpm スローログを設定します。しきい値は 2 秒です:
request_slowlog_timeout = 2
slowlog = log/$pool.log。
sort/uniq コマンドを使用して、php-fpm の遅いログを分析して要約します。
[root@b28-12 log]# grep -v "^$" www.log.slow.tmp | " " -f 3,2 | ソート -k1,1nr | ヘッド -n 50
5181 run() /www/test.net/framework/web/filters/CFilter.php:41
フィルター() /www/test.net/framework/web/filters/CFilterChain.php:131
2670 = /www/test.net/index.php
2636 run() /www/test.net/application/controllers/survey /index .php:665
2630 アクション() /www/test.net/application/controllers/survey/index.php:18
2625 実行() /www/test.net/framework/web/actions/CAction.php :75
2605 runWithParams() /www/test.net/framework/web/CController.php:309
2604 runAction() /www/test.net/framework/web/filters/CFilterChain.php:134
2538 run( ) / www/test.net/framework/web/CController.php:292
2484 runActionWithFilters() /www/test.net/framework/web/CController.php:266
2251 run() /www/test.net/ Framework/web/CWebApplication.php:276
1799 translation() /www/test.net/application/libraries/Limesurvey_lang.php:118
1786 load_tables() /www/test.net/application/third_party/php-gettext/gettext.php:254
1447 runController() /www/test.net/framework/web/CWebApplication.php:135
パラメータの説明:
sort: 単語を並べ替えます
Uniq -c: 固有の行を表示し、ファイル内でこの行が出現する回数を各行の先頭に追加します
Sort -k1,1nr: 最初のフィールド、値、および逆順で並べ替えます
Head -10: データの最初の 10 行を取得します
3.3 strace を使用してプロセスを追跡します
1) nohup を使用して、アタッチ時の php-fpm プロセスが終了するまで strace をバックグラウンド実行に変換します:
nohup strace - T -p 13167 > 13167-strace.log &

パラメータの説明:

-c Co各システムコールの実行時刻、回数-d は、標準エラーに関する strace デバッグ情報を出力します。 -f は、fork 呼び出しによって生成された子プロセスを追跡します。
-o ファイル名は、すべてのプロセスの追跡結果を対応するファイル名に出力します。 F は、vfork 呼び出しをトレースしようとします。
-h は、システム コールのエントリ ポインタを出力します。
- r 各システム呼び出しの相対時間を出力します。
-t 出力の各行に時間情報を追加します (マイクロ秒単位)。秒単位で時間を示します。
-T は、各呼び出しに費やされた時間を表示します。
-v は、環境変数、ステータス、入出力などに関する一部の呼び出しを出力します。
-V 出力 strace
-x 標準以外の文字列を 16 進形式で出力します。
-a 列
戻り値の出力位置を設定します。
-e はシステムのみを実行します。 execve
-p などの呼び出し メインプロセス番号







2) -c パラメーターを使用して、strace に要約を支援させることもできます。これは非常に便利で強力です。
[root@b28-12 log]# strace -cp 9907
プロセス 9907 接続 - 終了のための中断
プロセス 9907 切り離されました
% time 秒 usecs/call calls errors syscall
------ ------- ---- ----------- --------- ------------- ----------------
56.61 0.016612 5 3121 read
11.11 0.003259 1 2517 715統計
8.04 0。 002358 7 349 brk
6.02 0.001767 1 1315 世論調査
4.28 0.001255 6 228 recvfrom
2.71 0.000796 1 671 open
2.54 0.000745 0 2453 fcntl
2.37 0.000696 1 1141 write
1.69 0.000497 1 593 13 アクセス
1.37 0.000403 0 1816 lseek
0.89 0.000262 1 451 22 sendto
0.56 0.000163 1 276 208 lstat
0.49 0.000145 0 384 getcwd
0.31 0.000090 0 1222 fstat
0.28 0.000082 0 173 munmap
0.26 0.000077 0 174 mmap
0.24 0.000069 2 41 ソケット
0.23 0.000068 0 725 閉じる
0.00 0.000000 0 13 rt_sigaction
0.00 0.000000 0 13 rt_sigprocmask
0.00 0。 000000 0 1 rt_sigreturn
0.00 0.000000 0 78 setitimer
0.00 0.000000 0 26 26 接続
0.00 0.000000 0 15 2 受け入れる
0.00 0.000000 0 39 recvmsg
0.00 0.000000 0 26 シャットダウン
0.00 0.000000 0 13 バインド
0.00 0.000000 0 13 getsockname
0.00 0.000000 0 65 setsockopt
0.00 0.00 0000 0 13 を取得ockopt
0.00 0.000000 0 8 getdents
0.000000 ,、、、、、 、、、 、、、、、、、、、、、、、、、、、、、、、、、、''' ---- ----------- --- -------- --------- --------- ------ ----------
100.00 0.029344 18000 986 total
ps : strace を使用すると、PHP インタプリタの解釈と実行プロセスを学習できます

3.4 PHP の解釈と実行を高速化します
プログラムに問題がない場合は、そのまま実行してください操作が多すぎて、実行する方法がありませんそれを最適化します。次に、APC や xcache などの PHP アクセラレータを使用して、CPU が PHP ファイルを解釈するのにかかる時間を短縮することを検討してください。 これらの PHP アクセラレータは、PHP ファイルが最初に解釈されるときに中間コードのオペコードを生成するため、その後の実行が大幅に高速になり、CPU オペレーションの一部が軽減されます。 xcache を例として、インストールおよび構成方法を見てみましょう。
xcache をインストールするコマンドは次のとおりです。 ./configure には多くのパラメーターがあり、それらが何に使用されるのかがわかりません。ので、--enable-xcache をオンにしました。
tar zxvf xcache-3.0.3.tar.gz
/ usr/local/php/bin/phpize
./configure --with-php-c/local/php/bin/php-config --enable-xcache
make
make install
php.ini の設定は次のとおりです。最も重要なのは、赤でマークされた 2 つのパラメータです。一般に、xcache.size は、xcache.count が同じであるように決定することをお勧めします。 CPU コアの数として:


[xcache.admin]xcache.admin.enable_auth = Offxcache.admin.user = "xcache"
xcache.admin.pass = ""
[xcache ]
xcache.shm_scheme ="mmap"

xcache.size=1024M

xcache.count =16
xcache .slots =8Kxcache.ttl=0xcache.gc_interval =0
xcache.var_size=16M
xcache.var_count =1
xcache.var_slots =8K
xcache.var_ttl=0
xcache.var_maxttl=0
xcache.var_gc _interval =300
xcache.test =Off
xcache.readonly_protection = Off
;xcache.readonly_protection = On
xcache.mmap_path ="/dev/zero"
;xcache.mmap_path ="/tmp/xcache"
xcache.coredump_directory =" "
xcache.cacher =On
xcache.stat=On
xcache.optimizer =Off
[xcache .coverager]
;;xcache.coverager =On
;;xcache.coveragedump_directory =""


FAQ php-fpm の起動時にエラーが報告されます: xcache.mmap_path で設定されたファイルを開いたり作成したりできません。パスの権限を確認するか、xcache.size/var_size をシステムの制限に照らして確認してください これは、/tmp/xcache がファイルであり、ディレクトリに作成できないためです。
php-fpm サービスを再起動した後、top コマンドを使用して、各ワーカー プロセスの VIRT (スワップ領域を含む) が xcache.size のサイズであるにもかかわらず、REQ が非常に小さくなっていることを確認します。
上記の構成を使用すると、CPU 使用率のピーク時間が短縮されましたが、どこかに設定ミスがあるかどうかはわかりませんが、依然としてすべてのコアがピーク時に 90% を超えます。
さらに、同時実行性が高い場合、/dev/zero の設定方法では Nginx 502 エラーが発生することがよくあります。 /tmp/xcache と readonly_protection の有効化は非常に安定しています。

4.php プログラムのパフォーマンス監視

一般的な方法は、xdebug のパフォーマンス監視機能を有効にし、WinCacheGrind ソフトウェアを通じて xdebug の出力結果を分析することです。
xdebugのインストールとIDEでのデバッグ方法については、Vim+ .auto_profile = on
xdebug.collect_params = on
xdebug.collect_return = on
xdebug.profiler_enable = on
xdebug.trace_output_dir = "/tmp"を参照してください。 xdebug.profiler_output_dir = "/tmp"
は、PHP関数を実行するためのすべてのパフォーマンスデータを出力しますが、生成されるファイルも大きくなります。出力データの量を減らすために、collect_params、collect_return、 などの一部のオプションをオフにすることができます。または、自動出力をオフにして、監視する関数の最初と最後で xdebug 関数を呼び出して、指定した関数を監視します。
出力ファイル名は、cachegrind.out.1277560600 およびtrace.3495983249.txt に似ており、Windows プラットフォームで WinCacheGrind を使用してグラフィカル分析のために取得できます。
WinCacheGrind の使用方法はインターネット上に多数紹介されているため、ここでは詳しく説明しません。 -c は各システムコールの実行時間、回数、エラーをカウントします。
-d は標準エラーに関する strace デバッグ情報を出力します。
-f は fork 呼び出しによって生成された子プロセスを追跡し、追跡結果を出力します。
-F は、vfork 呼び出しを追跡しようとします。
-h は、システム コールのエントリ ポインターを出力します。 q は、切断に関するメッセージの出力を無効にします。
-r は、各システム呼び出しの相対時間を出力します。
-tt は、出力の各行に時間情報を追加します (マイクロ秒レベル)。 -ttt マイクロ秒レベルの出力。時間は秒単位で表示されます。 -T は、各呼び出しで消費された時間を表示します。
-v は、環境変数、ステータスに関連する呼び出しを出力します。デフォルトでは、入力呼び出しと出力呼び出しは出力されません。
-V は strace のバージョン情報を出力します。
-x は非標準の文字列を 16 進形式で出力します。
-a 列は、戻り値の出力位置を設定します。デフォルトは 40 です。
-e execve は execve などのシステムコールのみを記録します







-p メインプロセス番号










著作権声明:この記事はブロガーによるオリジナル記事であり、ブロガーの許可なしに転載することはできません。 以上、内容の側面も含めて Nginx+PHP-FPM 最適化スキルの概要を紹介しましたが、PHP チュートリアルに興味のある友人の参考になれば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。