Heim  >  Artikel  >  Backend-Entwicklung  >  Zusammenfassung der Fähigkeiten zur Nginx PHP-FPM-Optimierung

Zusammenfassung der Fähigkeiten zur Nginx PHP-FPM-Optimierung

WBOY
WBOYOriginal
2016-07-29 09:16:141024Durchsuche
Das Obige hat eine Zusammenfassung der PHP-FPM-Optimierungskompetenzen von Nginx vorgestellt, einschließlich einiger Aspekte des Inhalts. Ich hoffe, dass es für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.

1. Unix-Domain-Socket-Kommunikation

Ich habe die Unix-Domain-Socket-Kommunikationsmethode bereits kurz vorgestellt, siehe: Domain-Socket-Konfigurationsmethode von Nginx+PHP-FPM

Unix-Domain-Socket kann tatsächlich die Leistung der Kommunikation zwischen Nginx und PHP-FPM verbessern, da es nicht durchgeht das Netzwerk, aber in

Es wird instabil sein, wenn die Parallelität hoch ist.

Nginx meldet häufig Fehler:
connect() to unix:/dev/shm/php-fcgi . Sock ist beim Herstellen einer Verbindung zum Upstream fehlgeschlagen (11: Ressource vorübergehend nicht verfügbar)

Die Stabilität kann auf die folgenden zwei Arten verbessert werden:

1) Erhöhen Sie den Rückstand in Nginx und PHP-FPM
Die Konfigurationsmethode lautet: Fügen Sie unter dem Server dieses Domänennamens in der Nginx-Konfigurationsdatei nach Listen 80 den Standard-Backlog = 1024 hinzu.

Konfigurieren Sie gleichzeitig listen.backlog in php-fpm.conf auf 1024, der Standardwert ist 128.

2) Erhöhen Sie die Anzahl der Sock-Dateien und PHP-FPM-Instanzen
Erstellen Sie eine neue Sock-Datei in Nginx Verwenden Sie das Upstream-Modul, um Lastausgleichsanforderungen auf zwei Sätze von PHP-FPM-Instanzen hinter zwei Sock-Dateien zu verteilen.
2.php-fpm-Parameteroptimierung
2.1 Anzahl der Prozesse

php-fpm Anfangs-/Leerlauf-/maximale Anzahl von Worker-Prozessen

pm.max_children = 300
pm.start_servers = 20
pm.min_spare_servers = 5

pm.max_spare_servers = 35


2.2 Maximale Anzahl verarbeiteter Anfragen

Die maximale Anzahl verarbeiteter Anfragen bezieht sich auf ein PHP -fpm worker Der Prozess wird nach der Verarbeitung einer Reihe von Anfragen beendet und der Masterprozess

wird einen neuen neu starten.

Der Hauptzweck dieser Konfiguration besteht darin, Speicherlecks zu vermeiden, die durch

verursacht werden, die durch Bibliotheken von Drittanbietern verursacht werden, auf die der PHP-Interpreter oder das PHP-Programm verweist .

pm.max_requests = 10240


2.3 Maximale Ausführungszeit
Die maximale Ausführungszeit kann sowohl in php.ini als auch in php-fpm.conf konfiguriert werden. Die Konfigurationselemente sind max_execution_time bzw. request_terminate_timeout.
Informationen zu seiner Rolle und seinen Auswirkungen finden Sie unter: Detaillierte Erklärung der 502- und 504-Fehler in Nginx
3.1CPU Nutzungsüberwachungsmethode
1) Top-Befehl Nachdem Sie den Top-Befehl direkt ausgeführt haben, geben Sie 1 ein, um die CPU-Auslastung jedes Kerns anzuzeigen. Und die Abtastzeit kann um top -d 0,1 verkürzt werden. Der SAR unten scheint nur 1 Sekunde zu sein.
2) sar-Befehl
Installation der sar- und iostat-Befehle:
sysstat.x86_64: Die sar- und iostat-Systemüberwachungsbefehle
yum install -y sysstat.x86_64
Führen Sie sar -P ALL 1 aus 100. -P ALL bedeutet, alle Kerne zu überwachen, 1 bedeutet, alle 1 Sekunde zu sammeln, 100 bedeutet, 100 Mal zu sammeln.
Die Ausgabeergebnisse lauten wie folgt:
CPU %user %nice %system %iowait %steal %idle
alle 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,0 0 0,00 9,00 0,00 0,00 16,00
5 9 4,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
3.2 Langsames Protokoll aktivieren
Konfigurieren Sie das ausgegebene PHP-FPM-langsame Protokoll. Der Schwellenwert beträgt 2 Sekunden:
request_slowlog_timeout = 2
slowlog = log/$pool.log.slow

Verwenden Sie den Befehl sort/uniq um PHP-FPM-Slow-Protokolle zu analysieren und zusammenzufassen:
[root@b28-12 log]# grep -v "^$" www.log.slow.tmp |. cut -d " " -f 3,2 | 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
Parametererklärung:
sort: Wörter sortieren
uniq -c: Eindeutige Zeilen anzeigen und am Anfang jeder Zeile angeben, wie oft diese Zeile in der Datei vorkommt
sort -k1,1nr: Entsprechend Das erste Feld ist numerisch sortiert und in umgekehrter Reihenfolge
head -10: Holen Sie sich die ersten 10 Datenzeilen
3.3 Verwenden Sie Strace, um den Prozess zu verfolgen
1) Verwenden Sie Nohup, um Strace zu konvertieren zur Hintergrundausführung, bis der PHP-FPM-Prozess beim Anhängen stirbt:
nohup strace -T -p 13167 > 13167-strace.log &

Parameterbeschreibung:

-c zählt die Ausführungszeit, Anzahl und Fehlerzeiten jedes Systemaufrufs
-d gibt Strace-Debugging-Informationen zu Standardfehlern aus.
-f Verfolgt den durch den fork-Aufruf generierten untergeordneten Prozess.
-o Dateiname. Die Tracking-Ergebnisse aller Prozesse werden in den entsprechenden Dateinamen ausgegeben.
-F versucht, den vfork-Aufruf zu verfolgen. Wenn -f, ist vfork nicht Trace.
-h Gibt kurze Hilfeinformationen aus.
-i Gibt den Eingabezeiger des Systemaufrufs aus.
-q Deaktiviert die Ausgabe von Meldungen über die Trennung.
-r Gibt die relative Zeit über,, aus. Jeder Ein Systemaufruf.
-t Zeitinformationen vor jeder Zeile in der Ausgabe hinzufügen.
-ttt Mikrosekundenebene Sekunden.
-T zeigt die von jedem Aufruf verbrauchte Zeit an.
-v gibt alle Systemaufrufe aus. Aufgrund der häufigen Verwendung erfolgt die Ausgabe nicht.
-V Gibt Informationen zur Strace-Version aus.
-x Gibt nicht standardmäßige Zeichenfolgen in hexadezimaler Form aus.
-xx Alle Zeichenfolgen werden in hexadezimaler Form ausgegeben.
- Eine Spalte
legt die Ausgabeposition von fest Der Rückgabewert ist 40.
-e execve zeichnet nur Systemaufrufe wie execve
-p Hauptprozessnummer

2) Sie können auch den Parameter -c verwenden, damit strace beim Zusammenfassen hilft, was sehr praktisch und leistungsstark ist!
[root@b28-12 log]# strace -cp 9907
Prozess 9907 angehängt – zum Beenden unterbrechen
Prozess 9907 getrennt
% Zeit     Sekunden  usecs/Aufruf     Aufrufe    Fehler Systemaufruf
--- --- ----------- ----------- --------- --------- ------- -------
  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 Schließen
0,00 0,000000 0 13 RT_SIGACTACE
0,00 0,000000 0 13 RT_SIGPROCMASK
0,00 0,000000 0 1 RT_SIGRETURN
0,0000000000 0 78 SETITIMER
0,00000000 🎜 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26). > 00,000,00 0,000000 0 26 Shutdown
0,00 0,000000 0 13 bind
0,0 0 0,000000 0 13 getsockname
0,00 0,000000 0 65 setsockopt
0,00 00 0 13 getockopt
0,00 0,000000 0 8 8 getdents
0.00 0.000000 0       26           chdir
0.00   0.000000           1           futex
------ ----------- ----------- ------- - - -------------------------
100,00 0,029344 18000 986 insgesamt
ps: Sie können Strace verwenden, um die Interpretation und Ausführung zu lernen Prozess des PHP-Interpreters
3.4 PHP-Interpretation und -Ausführung beschleunigen
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 eines PHP-Beschleunigers wie APC oder xcache, um die Zeit zu verkürzen, die die CPU für die Interpretation von PHP-Dateien benötigt.
Diese PHP-Beschleuniger generieren Zwischencode-Opcode, wenn die PHP-Datei zum ersten Mal interpretiert wird, sodass die nachfolgende Ausführung viel schneller erfolgt und einige CPU-Vorgänge reduziert werden. Nehmen wir xcache als Beispiel.
Sehen wir uns an, wie man es installiert und konfiguriert.
Der Befehl zum Installieren von xcache lautet wie folgt. Es gibt viele Parameter in ./configure und ich weiß nicht, wofür sie verwendet werden. Auf der offiziellen Website gibt es keine Erklärung, daher habe ich einfach --enable- aktiviert. xcache:
tar zxvf xcache-3.0.3.tar .gz
/usr/local/php/bin/phpize
./configure --with-php-c/local/php/bin/php -config --enable-xcache
make
Die Konfiguration in make install
php.ini ist wie folgt. Die wichtigsten sind die beiden rot markierten Parameter. Es wird allgemein empfohlen, xcache.size zu bestimmen entsprechend der Anzahl der PHP-Dateien entspricht xcache.count der Anzahl der CPU-Kerne:


[xcache.admin]
xcache.admin.enable_auth = Aus
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 =Aus
xcache.readonly_protection = Aus
;xcache.readonly_protection = Ein
xcache.mmap_path ="/dev/zero"
; 🎜>xcache.optimizer =Aus
[xcache.coverager]
;;xcache.coverager =On
;;xcache.coveragedump_directory =""



Ein häufiges Problem ist das Beim Starten von php-fpm wird ein Fehler gemeldet:
Die von xcache.mmap_path festgelegte Datei kann nicht geöffnet oder erstellt werden. Überprüfen Sie die Pfadberechtigung oder überprüfen Sie xcache.size/var_size anhand der Systemeinschränkung.Dies liegt daran, dass/tmp/xcache vorhanden ist eine Datei und kann nicht als Verzeichnis erstellt werden. Beobachten Sie nach dem Neustart des PHP-FPM-Dienstes mit dem Befehl top, dass die VIRT (einschließlich des Swap-Bereichs) jedes Arbeitsprozesses die Größe von xcache.size hat, die REQ jedoch sehr klein wird.
Die Verwendung der oben genannten Konfiguration hat die Spitzenzeit der CPU-Auslastung verkürzt, aber alle Kerne erreichen in der Spitze immer noch mehr als 90 %. Ich weiß nicht, ob es keine richtige Konfiguration gibt.
Außerdem führt die Konfigurationsmethode /dev/zero bei hoher Parallelität häufig zu Nginx 502-Fehlern. /tmp/xcache und die Aktivierung von readonly_protection sind sehr stabil.

4.php-Programmleistungsüberwachung

Die übliche Methode besteht darin, die Leistungsüberwachungsfunktion von xdebug zu aktivieren und die xdebug-Ausgabeergebnisse über die WinCacheGrind-Software zu analysieren.
Informationen zur Installation von xdebug und zur Methode zum Debuggen mit der IDE finden Sie unter: Vim+XDebug debugging PHP
Diese in php.ini konfigurierten Elemente geben Leistungsinformationen aus:
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"

Auf diese Weise wird XDebug Geben Sie die Leistungsdaten aller ausgeführten PHP-Funktionen aus, die generierten Dateien sind jedoch größer. Sie können einige Optionen wie „collect_params“, „collect_return“ und
deaktivieren, um die Menge der Ausgabedaten zu reduzieren. Oder schalten Sie die automatische Ausgabe aus und überwachen Sie die angegebene Funktion, indem Sie die xdebug-Funktion am Anfang und am Ende der Funktion aufrufen, die Sie überwachen möchten.
Die Namen der Ausgabedateien ähneln „cachegrind.out.1277560600“ und „trace.3495983249.txt“, die für die grafische Analyse mit WinCacheGrind auf der Windows-Plattform abgerufen werden können.
Es gibt viele Einführungen zur Verwendung von WinCacheGrind im Internet, daher werde ich sie hier nicht im Detail erklären. -c zählt die Ausführungszeit, Anzahl und Fehler jedes Systemaufrufs.
-d gibt Strace-Debugging-Informationen zu Standardfehlern aus.
-o Dateiname , die Tracking-Ergebnisse aller Prozesse werden in den entsprechenden Dateinamen ausgegeben.
-F versucht, vfork-Aufrufe zu verfolgen. Wenn -f, wird vfork nicht nachverfolgt.
-i Drucken der Eingabezeiger des Systemaufrufs.
-q Deaktiviert die Ausgabe von Meldungen über die Trennung.
-t gibt für jede Zeile in der Ausgabe Zeitinformationen aus Jede Zeile in der Ausgabe.
-tt Zeitinformationen vor jeder Zeile in der Ausgabe hinzufügen.
-ttt Ausgabe auf Mikrosekundenebene, die die Zeit in Sekunden ausdrückt Ein Aufruf.
-v gibt alle Systemaufrufe, die sich auf Umgebungsvariablen, Status, Eingabe und Ausgabe usw. beziehen, aufgrund häufiger Verwendung nicht aus.
-x Nicht standardmäßige Zeichenfolgen in hexadezimaler Form ausgeben
-xx Alle Zeichenfolgen werden in hexadezimaler Form ausgegeben
-a Spalte
Legen Sie die Ausgabeposition des Rückgabewerts fest.
-e execve zeichnet nur Systemaufrufe wie execve





-p Hauptprozessnummer

Copyright-Erklärung: Dies Der Artikel ist ein Originalartikel des Bloggers und darf nicht ohne die Erlaubnis des Bloggers reproduziert werden.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn