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 Offxcache.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 = onxdebug.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教程有興趣的朋友有所幫助。
|