Nginx+PHP-FPM最佳化技巧總結

WBOY
發布: 2016-07-29 09:16:14
原創
1036 人瀏覽過

1.Unix域Socket通訊

之前簡單介紹Unix Domain Socket這種通訊方式,請參閱:Nginx+PHP-FPM的域Socket配置方法🜎不走網絡,的確可以提高Nginx和php-fpm通訊的效能,但在

高並發時會不穩定。

Nginx會頻繁報錯:

     connect() to unix:/dev/shm/php-fcgi.sock failed (11: Re pailed

可以以下兩種方式提升穩定性:

1)調高nginx和php-fpm中的backlog
     設定方法為:在nginx設定檔中這個網域的server下,在listen 80後面加入default backlog= 1024。

     同時配置php-fpm.conf中的listen.backlog為1024,預設為128。

2)增加sock文件和php-fpm實例數     再新建一個sock上。

2.php-fpm參數調優

2.1進程數



php-fpm初始/閒置/最大worker進程數
php-fpm .max_children = 300
     pm .start_servers = 20
     pm.min_spare_servers = 5

     pm.max_spare_

2.2最大處理請求數


最大處理請求數是指一個php-fpm的worker行程在處理多少請求後就終止掉,master程序

會重新respawn一個新的。 這個配置的主要目的是避免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指令
3.1CPU使用率監控方法

1)top指令
top指令後直接執行指令後,輸入1就可以看到各核心的CPU使用率。而且透過top -d 0.1可以縮短取樣時間。
下面的sar貌似最短只能是1秒。
2)sar指令
sar和iostat指令的安裝:🎜     sysstat.x86_64 : The sar and iostat system monitoring commands🎜     yum install -y 0statsys.x86_66498 執行 - 7070 -y 000777777dd - 707077dd -y 070777d。 -P ALL表示監控所有核心,1表示每1秒採集,100表示​​採集100次。
輸出結果如下:
CPU     %user     %nice   %system   %iowait    %steal     %idle
all     85.54      0.00      5.69      0.00      0.00      8.76
  0     74.75      0.00     25.25      0.00      0.00      0.00
  1     98.00      0.00      2.00      0.00      0.00      0.00
  2     89.22      0.00      3.92      0.00      0.00 6.86
  3     91.00      0.00      2.00           0.00      9.00      0.00      0.00     16.00
  50       0.00      0.00      0.00
  6     95.00     0.00 1.00
  7     87.88      0.00      4.04      0.00      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.00      0.00     15.84
15     78.79 0.00      4.04      0.00      0.00     17.17

3.2開啟慢日誌
. log_timeout = 2

slowlog = log/$pool.log. slow
利用sort/uniq指令分析匯總php-fpm慢日誌:[root@b28-12 log]# grep -v "^$" www.log.slow.tmp | cut -d " " -f 3,2 | sort | uniq -c | sort -k1,1nr | head -n 50   5181 run() /www/test.net/framework/web/filters/CFilter.php:41  fil ter56 fil ter( /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 action() /www/test.net/application/controllers/survey/index.php:18
   2625 run() /www/test.net/framework/web/actions/CActionphp:75
   2605 runWithParams() /www/test.net/framework/web/CController.php:309
   2604 runAction() /www/test.net/framework/web/filters/CFilterChain。 www/test.net/framework/web/CController.php:292
   2484 runActionWithFilters() /www/test.net/framework/web/CController.php:266
   2251 run() /frame/test.net/ web/CWebApplication.php:276
   1799 translate() /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
/test.net/framework/web/CWebApplication.php:135
:135 sort:  對單字進行排序
     uniq -c:  顯示唯一的行,並在每行行首加上本行在文件中出現的次數
     sort -k1,1nr  依照第一個為欄位依第一個排列,且欄位為逆序
     head -10:  取前10行資料
3.3用strace追蹤進程
1)利用nohup將strace轉為後台執行,直到attach上的php-fpm進程死掉為止:
-T -p 13167 > 13167-strace.log &

系統調用的所執行的時間,次數與出錯的次數等.-d 輸出strace關於標準錯誤的調試信息.-f 跟踪由fork調用所產生的子進程.-o filename,則所有進程的跟踪結果輸出到相應的filename -F 嘗試追蹤vfork調用.在-f時,vfork不被追蹤.-h 輸出簡要的幫助資訊.-i 輸出系統調用的入口指針.-q 禁止輸出關於脫離的消息.-r 打印出相對時間關於,,每一個系統呼叫.

-t 在輸出中的每一行前加上時間資訊.

-tt 在輸出中的每一行前加上時間資訊,微秒級.-ttt 微秒級輸出,以秒了表示時間.-T 顯示每一調用所耗的時間.-v 輸出所有的系統調用.一些調用關於環境變量,狀態,輸入輸出等調用由於使用頻繁,默認不輸出. -V 輸出strace的版本資訊.
-x 以十六進位形式輸出非標準字串
-xx 所有字串以十六進位形式輸出.
-a column
設定回傳值的輸出位置.預設為40.
-e execve 只記錄execve 這類系統呼叫
-p 主進程號













2)也可以用利用-c參數讓strace幫忙匯總,非常方便非常強大!
[root@b28-12 log]# strace -cp 9907
附加程序9907 - 中斷退出
分離程序9907
% 時間     秒  usecs/call     - ---- ----------- --------- --------- ----------------
56.61    0.016612           5      3121           閱讀
11.111         2517       715 stat
  8.04    0. 002358           7        0.001767           1      1315           228           接收自
  2.71    0.000796           1 000745           0     2453           fcntl
  2.37    0.000696 1      1141           寫
  1.69 0.000497           1      0.000403           0      1816           lseek 51        22 sendto
  0.56    0.000163           1               0      384           getcwd
  0.31          fstat
  0.28    0.000082           0       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.0 00000           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 接受               recvmsg
0.00    0.000000           0        26                  13           bind
  0.00    0.000000        
  0.00    0.000000           0        65           0        13           getsockopt
  0.00    0.000000    0.00    0.000000   getdents
  0.00    0.000000           0        26         0         1           futex
-- ---- ----------- ----------- --------- --------- ------ ----------
100.00    0.029344                 18000       986 total
ps:使用新的解釋者使用說明的確沒有問題,只是執行了太多操作,沒辦法再做優化了。則考慮使用APC或xcache等PHP加速器來減少CPU解釋php檔案的耗時。
這些PHP加速器在php檔案第一次解釋時會產生中間程式碼opcode,所以之後的執行會快很多,並且減少了一些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
 的是標紅的兩個參數,一般建議xcache.size依php檔案多少來定,xcache.count與CPU核心數相同:







[xcache.admin]
xcache Off
xcache.admin.user = "xcache"
xcache.admin.pass = ""
[xcache]

xcache.shm_scheme ="mmap"xcache.size=1024Mache
.slots =8K
xcache.ttl=0
xcache.gc_interval =0
xcache.var_size=16M
xcache.var_count =1
xcache.var_slots =8K
xcache.var_count =1xcache.var_slots =8Kxcache。 =300
xcache.test =Offxcache.readonly_protection = Off;xcache.readonly_protection = On
xcache.mmap_path ="/dev/zero"
;xcache.mm "
xcache.cacher =On
xcache.stat=On
xcache.optimizer =Off
[xcache.coverager]
;;xcache.coverager =On
是啟動php-fpm時會錯誤:
     Cannot open or create file set by xcache.mmap_path, check the path permission or check xcache.size/var_size against system limitation
這是因為/mp/mp成目錄。
重啟php-fpm服務後,用top指令觀察會發現每個worker行程的VIRT(包含了swap區)都是xcache.size大小,但REQ變得很小了。
使用上面的配置在使CPU使用率的峰值時間變短了,但峰值時還是所有核心都會達到90%以上,不知道是不是哪裡沒有配置對。
另外高併發時,/dev/zero這種配置方式常會導致Nginx 502錯誤。 /tmp/xcache和開啟readonly_protection則很穩定。

4.php程式效能監控

常用的方法就是開啟xdebug的效能監控功能,將xdebug輸出結果通過WinCacheGrind軟體分析。
xdebug的安裝和配合IDE調試的方法請參考:Vim+XDebug調試PHP
php.ini中配置的這幾項是輸出效能資訊的:
xdebug.auto_trace .auto_profile = onxdebug.collect_params = onxdebug.collect_return = on
xdebug.profiler_enable = on
xdebug.trace_output_dir = "/tmp".
這樣XDebug會輸出所有執行php函數的效能數據,但產生的檔案也會比較大。可以關閉一些選項如collect_params、collect_return,
來減少輸出的資料量。或關閉自動輸出,透過在想要監控的函數首尾呼叫xdebug函數來監控指定的函數。
輸出的檔名類似cachegrind.out.1277560600和trace.3495983249.txt,可以拿到Windows平台下用WinCacheGrind進行圖形化分析。
WinCacheGrind使用方法網路上有很多介紹,這裡就不詳細說明了。 -c 統計每一系統呼叫的所執行的時間,次數和出錯的次數等.
-d 輸出strace關於標準錯誤的調試信息.
-f 跟踪由fork調用所產生的子進程.
-o filename,則所有進程的追蹤結果輸出到對應的filename
-F 嘗試追蹤vfork調用.在-f時,vfork不被追蹤.-h 輸出簡要的幫助資訊.-i 輸出系統調用的入口指針.
- q 禁止輸出關於脫離的消息.
-r 印出相對時間關於,,每一個系統呼叫.
-t 在輸出中的每一行前加上時間資訊.
-tt 在輸出中的每一行前加上時間資訊,微秒級.
-ttt 微秒級輸出,以秒了表示時間.
-T 顯示每一調用所耗的時間.
-v 輸出所有的系統調用.一些調用關於環境變量,狀態,輸入輸出等呼叫由於使用頻繁,預設不輸出.
-V 輸出strace的版本資訊.
-x 以十六進位形式輸出非標準字串
-xx 所有字串以十六進位形式輸出.
-a column
設置返回值的輸出位置.默認為40.
-e execve 只記錄execve 這類系統調用







-p 主進程號


版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 以上就介紹了Nginx+PHP-FPM優化技巧總結,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!