Cet article présente principalement les compétences d'optimisation de Nginx+PHP-FPM, qui ont une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer
Voici un article que j'ai trouvé sur Internet. Je l'ai pratiqué avec soin. Il existe de nombreux endroits dignes de référence qui peuvent être appris. La mise en page de l'article précédent étant très déroutante, je vais réécrire et organiser. cet article pendant mes études. Tous les droits d'auteur appartiennent à l'auteur original
J'ai brièvement présentéUnix Domain Socket
cette méthode de communication auparavant, voir :Nginx+PHP-FPM
domaineSocket
méthode de configuration
domaineUnix
ne passe pas par le réseau, il peut effectivement améliorer les performances de communication entreSocket
etNginx
, mais il sera instable lorsque la concurrence est élevée.php-fpm
signalera fréquemment des erreurs : Nginx
connect() to unix:/dev/shm/php-fcgi.sock failed (11: Resource temporarily unavailable) while connecting to upstream
Vous pouvez améliorer la stabilité des deux manières suivantes :
1.La méthode de configuration denginx
php-fpm
dansbacklog
est : sous
de ce nom de domaine dans le fichier de configurationnginx
, ajouterserver
aprèslisten 80
.default backlog=1024
En même temps, configurez
dansphp-fpm.conf
pour êtrelisten.backlog
, et la valeur par défaut est1024
.128
2. Augmentez le nombre de
fichiers etsock
instances et créez un nouveau fichierphp-fpm
Danssock
, équilibrez la charge sur les deuxNginx
fichiersupstream
via le <🎜. > module. Deux ensembles d'instancessock
.php-fpm
Réglage des paramètres php-fpm
# php-fpm初始/空闲/最大worker进程数 pm.max_children = 300 pm.start_servers = 20 pm.min_spare_servers = 5 pm.max_spare_servers = 35
sera terminé après avoir traité un certain nombre de demandes, et le processus php-fpm
sera redémarré worker
avec un nouveau. master
Le but principal de cette configuration est d'éviter respawn
les fuites de mémoire provoquées par des bibliothèques tierces référencées par l'interpréteur ou le programmephp
pm.max_requests = 10240
peuvent être configurés, et les éléments de configuration sont respectivement php.ini
et php-fpm.conf
. max_execution_time
Pour sa fonction et son impact, veuillez vous référer à : Explication détaillée des erreurs 502 et 504 dans Nginxrequest_terminate_timeout
Méthode de dépannage pour une utilisation élevée du processeur de php-fpm
Après avoir exécuté la commande directement, entrez 1 pour voir l'utilisation
de chaque cœur. De plus, la durée d'échantillonnage peut être raccourcie via top
. CPU
Le top -d 0.1
suivant semble durer au moins 1 seconde sar
2. Activez le journal lent
# 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
request_slowlog_timeout = 2 slowlog = log/$pool.log.slow
3. Utilisez strace pour suivre le processus
[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行数据
en exécution en arrière-plan jusqu'à ce que le processus nohup
sur strace
meure : 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 主进程号
aider à résumer, ce qui est très pratique et puissant ! -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
pour réduire le temps nécessaire àest la suivante. Il existe de nombreux paramètres deAPC
pour interpréterxcache
fichiers.CPU
Cesphp
accélérateurs généreront du code intermédiaire
lorsque le fichierPHP
sera interprété pour la première fois, donc l'exécution ultérieure sera beaucoup plus rapide et réduira certainesphp
opérations. Prenonsopcode
comme exemple pour voir comment installer et configurerCPU
.xcache
La commande pour installer
et je ne sais pas à quoi ils servent. Il n'y a aucune explication sur le site officiel, j'ai donc seulement activé. 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
soit déterminé en fonction du nombre de <. 🎜> fichiers. Le nombre de cœurs de php.ini
et xcache.size
est le même : php
xcache.count
CPU
Un problème courant est qu'au démarrage de
[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
C'est parce que
Cannot open or create file set by xcache.mmap_path, check the path permission or check xcache.size/var_size against system limitation
Après avoir redémarré le service /tmp/xcache
, utilisez la commande
(y compris la zone php-fpm
) de chaque top
processus a la taille de worker
, mais le VIRT
Il est devenu tout petit. swap
L'utilisation de la configuration ci-dessus a raccourci l'heure de pointe d'utilisation xcache.size
, mais tous les cœurs atteindront toujours au-dessus de REQ
à l'heure de pointe. Je ne sais pas s'il n'y a pas de configuration correcte.
De plus, lorsque la simultanéité est élevée, CPU
cette méthode de configuration entraîne souvent 90%
des erreurs.
et allumer /dev/zero
sont très stables. Nginx 502
常用的方法就是开启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
程序优化工作总结出的一些优化方法,针对每个地方的配置请详细阅读官方文档进行修改,并不一定要以本文为依据,本文档只阐述方法
相关推荐:
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!