Maison  >  Article  >  développement back-end  >  Conseils d'optimisation pour Nginx+PHP-FPM

Conseils d'optimisation pour Nginx+PHP-FPM

不言
不言original
2018-05-07 11:29:472429parcourir

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

Compétences d'optimisation de Nginx+PHP-FPM. Résumé

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

Communication Socket de domaine Unix

J'ai brièvement présenté Unix Domain Socket cette méthode de communication auparavant, voir : Nginx+PHP-FPM domaine Socket méthode de configuration
domaine Unix ne passe pas par le réseau, il peut effectivement améliorer les performances de communication entre Socket et Nginx, 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 de nginxphp-fpm dans backlog est : sous
de ce nom de domaine dans le fichier de configuration nginx, ajouter server après listen 80. default backlog=1024En même temps, configurez
dans php-fpm.conf pour être listen.backlog, et la valeur par défaut est 1024. 1282. Augmentez le nombre de
fichiers et sock instances et créez un nouveau fichier php-fpm Dans sock, équilibrez la charge sur les deux Nginx fichiers upstream via le module. Deux ensembles d'instances sock.
php-fpmRéglage des paramètres php-fpm

2.1 Nombre de processus

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

Le nombre maximum de demandes de traitement fait référence à un

Le processus

sera terminé après avoir traité un certain nombre de demandes, et le processus php-fpm sera redémarré worker avec un nouveau. masterLe but principal de cette configuration est d'éviter respawnles fuites de mémoire provoquées par des bibliothèques tierces référencées par l'interpréteur ou le programme
php

2.3 Temps d'exécution maximum
pm.max_requests = 10240

Le temps d'exécution maximum le temps d'exécution est

et

peuvent être configurés, et les éléments de configuration sont respectivement php.ini et php-fpm.conf. max_execution_timePour 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

1.

commande supérieure :

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

commande 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

Configurez la sortie

journal lent, le seuil est de 2 secondes :

php-fpm

request_slowlog_timeout = 2
slowlog = log/$pool.log.slow
Utilisez la commande sort/uniq pour analyser et résumer le journal lent php-fpm :

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行数据

1. Utilisez

pour convertir

en exécution en arrière-plan jusqu'à ce que le processus nohup sur strace meure : attach php-fpm

2. Vous pouvez également utiliser le paramètre
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 主进程号
pour laisser

aider à résumer, ce qui est très pratique et puissant ! -cstrace

4. Accélérez l'interprétation et l'exécution de PHP
[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

S'il n'y a effectivement aucun problème avec votre programme, il effectue simplement trop d'opérations et ne peut plus être optimisé. Pensez ensuite à utiliser des accélérateurs PHP tels que

ou
pour réduire le temps nécessaire à APC pour interpréter xcache fichiers. CPUCes php accélérateurs généreront du code intermédiaire
lorsque le fichier PHP sera interprété pour la première fois, donc l'exécution ultérieure sera beaucoup plus rapide et réduira certaines php opérations. Prenons opcode comme exemple pour voir comment installer et configurer CPU. xcache
La commande pour installer
est la suivante. Il existe de nombreux paramètres de

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

La configuration dans
 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
est la suivante. Les plus importants sont les deux paramètres marqués en rouge. Il est généralement recommandé que

soit déterminé en fonction du nombre de <.> fichiers. Le nombre de cœurs de php.ini et xcache.size est le même : phpxcache.countCPUUn problème courant est qu'au démarrage de

, une erreur sera signalée :
[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-fpmC'est parce que

est un fichier et ne peut pas être créé en tant que répertoire.
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

pour observer et vous constaterez que le

(y compris la zone php-fpm) de chaque top processus a la taille de worker, mais le VIRT Il est devenu tout petit. swapL'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, CPUcette méthode de configuration entraîne souvent 90% des erreurs.
et allumer /dev/zero sont très stables. Nginx 502

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

Conseils doptimisation pour Nginx+PHP-FPM

结束语

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

相关推荐:

Nginx+Php-fpm运行原理详解


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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn