首頁 >後端開發 >php教程 >Nginx+PHP-FPM的最佳化技巧

Nginx+PHP-FPM的最佳化技巧

不言
不言原創
2018-05-07 11:29:472522瀏覽

這篇文章主要介紹了關於Nginx PHP-FPM的優化技巧,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

Nginx PHP-FPM優化技巧總結

這裡是從網路上找到的一片文章,認真的實踐了一遍,有很多值得參考的地方可以學習,由於之前的文章排版非常混亂,所以本人一邊學習一邊加重寫整理此文,所有版權歸原作者所有

Unix域Socket通訊

之前簡單介紹過Unix Domain Socket這種通訊方式,請參閱:Nginx PHP-FPM的域Socket配置方法
UnixSocket因為不走網絡,的確可以提高Nginxphp- fpm通訊的效能,但在高並發時會不穩定。

Nginx會頻繁地報錯:

connect() to unix:/dev/shm/php-fcgi.sock failed (11: Resource temporarily unavailable) while connecting to upstream

#可以透過下面兩種方式提高穩定性:

1.調高nginxphp-fpm中的backlog
#設定方法為:在nginx設定檔中這個網域的 server下,在listen 80後面加上default backlog=1024
同時配置php-fpm.conf中的listen.backlog1024,預設為128
2.增加sock檔案和php-fpm實例數再新建一個sock文件,在Nginx中透過upstream模組將請求負載平衡到兩個sock檔案
背後的兩套php-fpm實例上。

php-fpm參數調優

2.1行程數

# php-fpm初始/空闲/最大worker进程数
 pm.max_children = 300
 pm.start_servers = 20
 pm.min_spare_servers = 5
 pm.max_spare_servers = 35

2.2最大處理請求數

最大處理請求數是指一個php -fpmworker進程在處理多少個請求後就終止掉,master進程會重新respawn一個新的。
這個配置的主要目的是避免php解釋器或程式引用的第三方函式庫造成的記憶體外洩

pm.max_requests = 10240

2.3最長執行時間

最大執行時間在php.iniphp-fpm.conf裡都可以配置,配置項目分別為max_execution_timerequest_terminate_timeout
其作用及其影響參見:Nginx中502和504錯誤詳解

php-fpm的高CPU使用率檢查方法

1. CPU使用率監控方法

top指令:
直接執行top指令後,輸入1就可以看到各核心的CPU使用率。而且透過top -d 0.1可以縮短取樣時間。
  下面的sar看起來最短只能是1秒

sar指令:

# sar和iostat命令的安装:
 sysstat.x86_64 : The sar and iostat system monitoring commands
 yum install -y sysstat.x86_64
 
# 执行sar -P ALL 1 100。-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      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.00      0.00     15.84
 15     78.79      0.00      4.04      0.00      0.00     17.17

2. 開啟慢日誌

#配置輸出php-fpm慢日誌,閥值為2秒:

request_slowlog_timeout = 2
slowlog = log/$pool.log.slow

利用sort/uniq指令分析總php-fpm慢日誌:

#
[root@boole 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
   5156 filter() /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/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 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
 
# 参数解释:
     sort:  对单词进行排序
     uniq -c:  显示唯一的行,并在每行行首加上本行在文件中出现的次数
     sort -k1,1nr:  按照第一个字段,数值排序,且为逆序
     head -10:  取前10行数据

3. 用strace追蹤進程

1.利用nohupstrace轉為後台執行,直到attach上的php-fpm進程死掉為止:

nohup strace -T -p 13167 > 13167-strace.log &
# 参数说明:
-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 主进程号

2.也可以用利用-c參數讓strace幫助匯總,非常方便非常強大!

[root@b28-12 log]# strace -cp 9907
Process 9907 attached - interrupt to quit
Process 9907 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
56.61    0.016612           5      3121           read
11.11    0.003259           1      2517       715 stat
  8.04    0.002358           7       349           brk
  6.02    0.001767           1      1315           poll
  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 access
  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           socket
  0.23    0.000068           0       725           close
  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 connect
  0.00    0.000000           0        15         2 accept
  0.00    0.000000           0        39           recvmsg
  0.00    0.000000           0        26           shutdown
  0.00    0.000000           0        13           bind
  0.00    0.000000           0        13           getsockname
  0.00    0.000000           0        65           setsockopt
  0.00    0.000000           0        13           getsockopt
  0.00    0.000000           0         8           getdents
  0.00    0.000000           0        26           chdir
  0.00    0.000000           0         1           futex
------ ----------- ----------- --------- --------- ----------------
100.00    0.029344                 18000       986 total

4.加速PHP解釋執行

如果自己的程式的確沒有問題,只是執行了太多操作,沒辦法再做優化了。則考慮使用APCxcache等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-config=/usr/local/php/bin/php-config --enable-xcache
     make
     make install

php.ini中配置如下,最重要的是標紅的兩個參數,一般推薦xcache.size根據php檔案多少來定,xcache.countCPU核心數相同:

[xcache.admin]
xcache.admin.enable_auth = Off
xcache.admin.user = "xcache"
xcache.admin.pass = ""
 
[xcache]
xcache.shm_scheme ="mmap"
xcache.size=1024M
xcache.count =16
xcache.slots =8K
xcache.ttl=0
xcache.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 =""

常見問題是啟動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

這是因為/tmp/xcache是一個文件,而不能建立成目錄。

重啟php-fpm服務後,用top指令觀察會發現每個worker進程的VIRT(包含了swap區)都是xcache.size大小,但REQ變得很小了。
使用上面的配置在使CPU使用率的峰值時間變短了,但峰值時還是所有核心都會達到90%以上,不知道是不是哪裡沒有配置對。
另外高並發時,/dev/zero這種設定方式常常會導致Nginx 502錯誤。 /tmp/xcache和開啟readonly_protection則很穩定。

php程序性能监控

常用的方法就是开启xdebug的性能监控功能,将xdebug输出结果通过WinCacheGrind软件分析。
xdebug的安装和配合IDE调试的方法参见:Vim+XDebug调试PHP

php.ini中配置的这几项是输出性能信息的:

xdebug.auto_trace = on
xdebug.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"

这样XDebug会输出所有执行php函数的性能数据,但产生的文件也会比较大。可以关闭一些选项如collect_params、collect_return,
来减少输出的数据量。或者关闭自动输出,通过在想要监控的函数首尾调用xdebug函数来监控指定的函数。

输出的文件名类似cachegrind.out.1277560600trace.3495983249.txt,可以拿到Windows平台下用WinCacheGrind进行图形化分析。
WinCacheGrind使用方法网上有很多介绍,这里就不详细说明了,WinCacheGrind for github

Nginx+PHP-FPM的最佳化技巧

结束语

以上都是近期做php程序优化工作总结出的一些优化方法,针对每个地方的配置请详细阅读官方文档进行修改,并不一定要以本文为依据,本文档只阐述方法

相关推荐:

Nginx+Php-fpm运行原理详解


以上是Nginx+PHP-FPM的最佳化技巧的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn