Heim > Artikel > Backend-Entwicklung > Optimierungstipps für Nginx+PHP-FPM
In diesem Artikel werden hauptsächlich die Optimierungsfähigkeiten von Nginx + PHP-FPM vorgestellt, die einen gewissen Referenzwert haben. Jetzt können Freunde in Not darauf zurückgreifen.
Hier ist ein Artikel, den ich im Internet gefunden habe. Ich habe ihn sorgfältig geübt. Da das Layout des vorherigen Artikels sehr verwirrend ist, werde ich ihn neu schreiben Während des Studiums dieses Artikels liegen alle Urheberrechte beim ursprünglichen Autor.
Ich habe diese Kommunikationsmethode zuvor kurz vorgestellt, siehe:meldet häufig Fehler:Unix Domain Socket
Domain-Nginx+PHP-FPM
-KonfigurationsmethodeSocket
Domäne
das Netzwerk nicht nutzt, kann es zwar die Kommunikationsleistung zwischenUnix
undSocket
verbessern, ist jedoch instabil, wenn die Parallelität hoch ist.Nginx
php-fpm
connect() to unix:/dev/shm/php-fcgi.sock failed (11: Resource temporarily unavailable) while connecting to upstream
Nginx
Sie können die Stabilität auf zwei Arten verbessern: 1 und Die Konfigurationsmethode von
in2.2 Maximale Anzahl der VerarbeitungsanforderungenDie maximale Anzahl der Verarbeitungsanforderungen bezieht sich auf einennginx
lautet: Fügen Sie unterphp-fpm
dieses Domänennamens in derbacklog
-Konfigurationsdatei
nachnginx
hinzu.server
Konfigurieren Sie gleichzeitiglisten 80
indefault backlog=1024
als
, und der Standardwert istphp-fpm.conf
.listen.backlog
2. Erhöhen Sie die Anzahl der1024
-Dateien und128
-Instanzen und erstellen Sie in
einen Lastausgleich für die beidensock
-Dateienphp-fpm
> Modul. Zwei Sätze vonsock
Instanzen.Nginx
upstream
PHP-FPM-Parameteroptimierungsock
2.1 Anzahl der Prozessephp-fpm
# php-fpm初始/空闲/最大worker进程数 pm.max_children = 300 pm.start_servers = 20 pm.min_spare_servers = 5 pm.max_spare_servers = 35
Der Hauptzweck dieser Konfiguration besteht darin, Speicherverluste zu vermeiden, die durch php-fpm
Bibliotheken von Drittanbietern verursacht werden, auf die der Interpreter oder das Programm verweist worker
pm.max_requests = 10240
master
2.3 Maximale Ausführungszeit respawn
php
und konfigurierbar, und die Konfigurationselemente sind Informationen zu Funktion und Auswirkungen finden Sie unter: Detaillierte Erklärung der 502- und 504-Fehler in Nginxphp.ini
php-fpm.conf
Methode zur Fehlerbehebung bei hoher CPU-Auslastung von PHP-FPMmax_execution_time
request_terminate_timeout
1
-Nutzung jedes Kerns anzuzeigen. Darüber hinaus kann die Probenahmezeit durch verkürzt werden. Der folgende
scheint mindestens 1 Sekunde lang zu sein top
CPU
top -d 0.1
sar-Befehl: 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.172. Aktivieren Sie die langsame Protokollierung
Konfigurationsausgabe Langsames Protokoll, der Schwellenwert beträgt 2 Sekunden:
request_slowlog_timeout = 2 slowlog = log/$pool.log.slowVerwenden Sie den Befehl sort/uniq, um das langsame PHP-FPM-Protokoll zu analysieren und zusammenzufassen:
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 . Verwenden Sie strace, um den Prozess zu verfolgen
1. Verwenden Sie , um
in die Hintergrundausführung zu übertragen, bis dernohup 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 主进程号
nohup
2. Sie können auch verwenden strace
Parameter werden durch attach
zusammengefasst, was sehr praktisch und leistungsstark ist! php-fpm
[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 total4. Beschleunigen Sie die PHP-Interpretation und -Ausführung
-c
Wenn tatsächlich kein Problem mit Ihrem Programm vorliegt, führt es einfach zu viele Operationen aus und kann nicht mehr optimiert werden. Erwägen Sie dann die Verwendung von PHP-Beschleunigern wie strace
oder
DieseAPC
Beschleuniger generieren Zwischencodexcache
, wenn dieCPU
-Datei zum ersten Mal interpretiert wird, sodass die nachfolgende Ausführung viel schneller erfolgt und einigephp
-Vorgänge reduziert werden. Nehmen wir
als Beispiel und sehen wir uns an, wiePHP
installiert und konfiguriert wird.php
opcode
Der Befehl zum Installieren vonCPU
lautet wie folgt. Es gibt viele Parameter vonxcache
und ich weiß nicht, wofür sie verwendet werden. Auf der offiziellen Website gibt es keine Erklärung, daher aktiviere ich sie
:
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
xcache
Die wichtigsten sind die beiden rot markierten Parameter. Es wird generell empfohlen, ./configure
entsprechend der Anzahl der --enable-xcache
-Dateien zu bestimmen .
haben die gleiche Anzahl an Kernen: php.ini
[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 =""
xcache.size
FAQ Beim Starten von php
wird ein Fehler gemeldet: xcache.count
Cannot open or create file set by xcache.mmap_path, check the path permission or check xcache.size/var_size against system limitation
CPU
Dies liegt daran, dass ein ist Datei und kann nicht als Verzeichnis erstellt werden. php-fpm
Nachdem Sie den
, um zu beobachten, dass der /tmp/xcache
(einschließlich des
-Prozesses die Größe von , aber das php-fpm
Es wurde sehr klein. top
Die Verwendung der oben genannten Konfiguration hat die Spitzenzeit der worker
-Nutzung verkürzt, aber alle Kerne werden zur Spitzenzeit immer noch über VIRT
hinausreichen. Ich weiß nicht, ob es keine richtige Konfiguration gibt. swap
Darüber hinaus führt xcache.size
diese Konfigurationsmethode bei hoher Parallelität häufig zu REQ
Fehlern.
und Einschalten CPU
sind sehr stabil. 90%
常用的方法就是开启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
程序优化工作总结出的一些优化方法,针对每个地方的配置请详细阅读官方文档进行修改,并不一定要以本文为依据,本文档只阐述方法
相关推荐:
Das obige ist der detaillierte Inhalt vonOptimierungstipps für Nginx+PHP-FPM. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!