> 백엔드 개발 > PHP 튜토리얼 > Nginx+PHP-FPM 최적화 팁

Nginx+PHP-FPM 최적화 팁

不言
풀어 주다: 2023-03-25 13:36:01
원래의
2535명이 탐색했습니다.

이 글은 주로 참고할만한 가치가 있는 Nginx+PHP-FPM의 최적화 기술을 소개합니다. 이제 필요한 친구들이 참고할 수 있도록 공유하겠습니다.

Nginx+PHP-FPM 최적화 기술 요약

여기까지입니다. 인터넷에서 글을 찾아 꼼꼼히 연습해 보았는데, 참고할 만한 부분이 많아서 이전 글의 구성이 너무 헷갈려서 공부하면서 이 글을 다시 작성해서 정리했습니다. 저작권은 원저자에게 있습니다

유닉스 도메인 소켓 통신

앞서 유닉스 도메인 소켓 통신 방법에 대해 간략하게 소개한 적이 있습니다. Nginx+PHP-FPM 도메인 참조 소켓 구성 방법Unix 도메인 소켓은 실제로 Nginxphp-fpm 네트워크를 사용하지 않기 때문에 동시성이 높을 경우 불안정합니다. 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

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"
로그인 후 복사
로그인 후 복사
🎜다음 두 가지 방법으로 안정성을 향상할 수 있습니다. 🎜🎜1 nginx 및 <를 늘립니다. code>php-fpm의 backlog
구성 방법은 nginx 구성에 있는 이 도메인 이름의 server입니다. file 그런 다음 listen 80 뒤에 default backlog=1024를 추가하세요.
또한 php-fpm.conflisten.backlog1024로 구성하고 기본값은 128</code입니다. > . <br/>2. <code>sock 파일과 php-fpm 인스턴스 수를 늘리고 Nginx<에 새 <code>sock 파일을 만듭니다. /code >는 upstream 모듈을 사용하여 두 개의 sock 파일
뒤에 있는 두 개의 php-fpm 인스턴스 세트에 대한 요청의 부하를 분산합니다. 🎜🎜php-fpm 매개변수 조정🎜

2.1 프로세스 수

rrreee

2.2 처리된 최대 요청 수

🎜처리된 최대 요청 수는 php-fpm< 하나를 나타냅니다. /code> <code>worker 프로세스는 특정 수의 요청을 처리한 후 종료되고 master 프로세스는 새 요청을 다시 생성합니다.
이 구성의 주요 목적은 php 인터프리터 또는 프로그램에서 참조하는 타사 라이브러리로 인해 발생하는 메모리 누수를 방지하는 것입니다🎜rrreee

2.3 최대 실행 시간

🎜 최대 실행 시간은 php.iniphp-fpm.conf에서 구성할 수 있습니다. 구성 항목은 max_execution_timerequest_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 명령:🎜rrreee

2. 느린 로그 켜기

🎜구성 php-fpm 느린 로그 출력, 임계값은 2초: 🎜rrreee🎜sort/uniq 명령을 사용하여 php-fpm 느린 로그 분석 및 요약: 🎜rrreee

3. strace 추적 프로세스 사용

🎜1. attach의 php-fpm이 있을 때까지 strace를 백그라운드 실행으로 변환하려면 nohup를 사용하세요. code> 프로세스가 종료될 때까지: 🎜rrreee🎜2 -c 매개변수를 사용하여 strace가 요약하도록 할 수도 있습니다. 이는 매우 편리하고 강력합니다. ! 🎜rrreee

4. PHP 해석 및 실행 가속화

🎜프로그램에 실제로 문제가 없다면 너무 많은 작업을 수행하므로 더 이상 최적화할 수 없습니다. 그런 다음 APC 또는 xcache와 같은 PHP 가속기를 사용하여 CPUphp 파일을 해석하는 데 걸리는 시간을 줄이는 것이 좋습니다. .
이러한 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/xcachereadonly_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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿