이 글은 주로 참고할만한 가치가 있는 Nginx+PHP-FPM의 최적화 기술을 소개합니다. 이제 필요한 친구들이 참고할 수 있도록 공유하겠습니다.
여기까지입니다. 인터넷에서 글을 찾아 꼼꼼히 연습해 보았는데, 참고할 만한 부분이 많아서 이전 글의 구성이 너무 헷갈려서 공부하면서 이 글을 다시 작성해서 정리했습니다. 저작권은 원저자에게 있습니다
앞서유닉스 도메인 소켓
통신 방법에 대해 간략하게 소개한 적이 있습니다.Nginx+PHP-FPM
도메인 참조소켓
구성 방법Unix
도메인소켓
은 실제로Nginx
와php-fpm
네트워크를 사용하지 않기 때문에 동시성이 높을 경우 불안정합니다.Unix Domain Socket
这种通信方式,参见:Nginx+PHP-FPM
的域Socket
配置方法Unix
域Socket
因为不走网络,的确可以提高Nginx
和php-fpm
通信的性能,但在高并发时会不稳定。
Nginx
会频繁报错:
connect() to unix:/dev/shm/php-fcgi.sock failed (11: Resource temporarily unavailable) while connecting to upstream
可以通过下面两种方式提高稳定性:
1.调高nginx
和php-fpm
中的backlog
配置方法为:在nginx
配置文件中这个域名的server
下,在listen 80
后面添加default backlog=1024
。
同时配置php-fpm.conf
中的listen.backlog
为1024
,默认为128
。
2.增加sock
文件和php-fpm
实例数再新建一个sock
文件,在Nginx
中通过upstream
模块将请求负载均衡到两个sock
文件
背后的两套php-fpm
实例上。
# php-fpm初始/空闲/最大worker进程数 pm.max_children = 300 pm.start_servers = 20 pm.min_spare_servers = 5 pm.max_spare_servers = 35
最大处理请求数是指一个php-fpm
的worker
进程在处理多少个请求后就终止掉,master
进程会重新respawn
一个新的。
这个配置的主要目的是避免php
解释器或程序引用的第三方库造成的内存泄露
pm.max_requests = 10240
最大执行时间在php.ini
和php-fpm.conf
里都可以配置,配置项分别为max_execution_time
和request_terminate_timeout
。
其作用及其影响参见:Nginx中502和504错误详解
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
配置输出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行数据
1.利用nohup
将strace
转为后台执行,直到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
如果自己的程序的确没有问题,只是执行了太多操作,没法再做优化了。则考虑使用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-config=/usr/local/php/bin/php-config --enable-xcache make make install
php.ini
中配置如下,最重要的是标红的两个参数,一般推荐xcache.size
根据php
文件多少来定,xcache.count
与CPU
核心数相同:
[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
Nginx
는 오류를 자주 보고합니다. 🎜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"
nginx
및 <를 늘립니다. code>php-fpm의 backlog
nginx
구성에 있는 이 도메인 이름의 server
입니다. file 그런 다음 listen 80
뒤에 default backlog=1024
를 추가하세요. php-fpm.conf
의 listen.backlog
를 1024
로 구성하고 기본값은 128</code입니다. > . <br/>2. <code>sock
파일과 php-fpm
인스턴스 수를 늘리고 Nginx<에 새 <code>sock
파일을 만듭니다. /code >는 upstream
모듈을 사용하여 두 개의 sock
파일php-fpm
인스턴스 세트에 대한 요청의 부하를 분산합니다. 🎜🎜php-fpm 매개변수 조정🎜php-fpm< 하나를 나타냅니다. /code> <code>worker
프로세스는 특정 수의 요청을 처리한 후 종료되고 master
프로세스는 새 요청을 다시 생성
합니다. php
인터프리터 또는 프로그램에서 참조하는 타사 라이브러리로 인해 발생하는 메모리 누수를 방지하는 것입니다🎜rrreeephp.ini
및 php-fpm.conf
에서 구성할 수 있습니다. 구성 항목은 max_execution_time
및 request_terminate_timeout<입니다. /코드> 각각 . <br/>역할 및 영향은 다음을 참조하세요. Nginx의 502 및 504 오류에 대한 자세한 설명🎜🎜php-fpm의 높은 CPU 사용량 문제 해결 방법🎜<h3>CPU 사용량 모니터링 방법</h3>🎜< Strong>top 명령:</strong> <br/><code>top
명령을 직접 실행한 후 1을 입력하면 각 코어의 CPU
사용량을 확인할 수 있습니다. 그리고 top -d 0.1
로 샘플링 시간을 단축할 수 있습니다. sar
는 최소 1초 이상인 것 같습니다🎜🎜sar 명령:🎜rrreeephp-fpm
느린 로그 출력, 임계값은 2초: 🎜rrreee🎜sort/uniq 명령을 사용하여 php-fpm 느린 로그 분석 및 요약: 🎜rrreeeattach의 php-fpm
이 있을 때까지 strace
를 백그라운드 실행으로 변환하려면 nohup
를 사용하세요. code> 프로세스가 종료될 때까지: 🎜rrreee🎜2 -c
매개변수를 사용하여 strace
가 요약하도록 할 수도 있습니다. 이는 매우 편리하고 강력합니다. ! 🎜rrreeeAPC
또는 xcache
와 같은 PHP 가속기를 사용하여 CPU
가 php
파일을 해석하는 데 걸리는 시간을 줄이는 것이 좋습니다. . PHP
가속기는 php
파일이 처음 해석될 때 중간 코드 opcode
를 생성하므로 후속 실행이 훨씬 빨라집니다. 일부 CPU
작업을 줄입니다. xcache
를 예로 들어 설치 및 구성 방법을 살펴보겠습니다.xcache
를 설치하는 명령은 다음과 같습니다. ./configure
에 많은 매개변수가 있는데 어떤 용도로 사용되는지는 모르겠습니다. 공식 웹사이트이므로 --enable -xcache
를 켜면 됩니다. 🎜rrreee🎜php.ini
는 다음과 같이 구성됩니다. 가장 중요한 것은 빨간색으로 표시된 두 매개변수입니다. .php
파일 수에 따라 일반적으로 xcache.size
를 권장합니다. xcache.count
는 숫자와 같습니다. CPU
코어 수: 🎜rrreee🎜일반적인 문제는 php-fpm</code 코드>를 시작하는 것입니다. 🎜rrreee🎜이는 <code>/tmp/xcache< 때문입니다. /code>는 파일이므로 디렉터리로 생성할 수 없습니다. 🎜🎜<code>php-fpm
서비스를 다시 시작한 후 top
명령을 사용하여 관찰하면 VIRT
( swap 포함)를 찾을 수 있습니다.
영역)은 모두 xcache.size
크기이지만 REQ
는 매우 작아집니다. CPU
사용량의 피크 시간이 단축되었지만 피크 시간에도 모든 코어는 여전히 90%
이상에 도달합니다. 이것이 사실인지 알 수 있습니다. /dev/zero
구성 방법으로 인해 Nginx 502
오류가 발생하는 경우가 많습니다. /tmp/xcache
및 readonly_protection
활성화는 매우 안정적입니다. 🎜常用的方法就是开启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.1277560600
和trace.3495983249.txt
,可以拿到Windows
平台下用WinCacheGrind
进行图形化分析。WinCacheGrind
使用方法网上有很多介绍,这里就不详细说明了,WinCacheGrind for github
以上都是近期做php
程序优化工作总结出的一些优化方法,针对每个地方的配置请详细阅读官方文档进行修改,并不一定要以本文为依据,本文档只阐述方法
相关推荐:
위 내용은 Nginx+PHP-FPM 최적화 팁의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!