Lösung für das Problem einer großen Anzahl von php-cgi.exe-Prozessen auf dem Server, die dazu führen, dass die CPU 100 % belegt

Lösung für das Problem einer großen Anzahl von php-cgi.exe-Prozessen auf dem Server, die dazu führen, dass die CPU 100 % belegt

Optimieren Sie die FastCGI-Konfigurationsdatei fcgiext.ini in Windows 2003+IIS6, um die Anzahl der php-cgi.exe-Prozesse und die Größe des belegten Speichers zu reduzieren.

Ich habe gehört, dass FastCGI besser ist als ISAPI, also habe ich es auf dem Server installiert. Die Konfigurationsumgebung ist Windows 2003+IIS6+FastCGI(FCGI)+PHP5.2.17. Nach längerer Beobachtung habe ich festgestellt, dass PHP, das im FastCGI-Modus arbeitet, immer mehr Speicher beansprucht. Wenn die Anzahl der Besuche etwas höher ist, gibt es N weitere PHP-CGI-Prozesse. Unter den gleichen Umständen kann es Hunderte von MB mehr beanspruchen als im ISAPI-Modus. Mein Server hat nur 2 GB Speicher und das kann ich mir nicht leisten.

Ich habe online gesucht und festgestellt, dass viele Leute das gleiche Problem haben. Eine formellere Erklärung von PHP-Verantwortlichen besteht darin, dass es im PHP-CGI-Prozess keinen Speicherverlust gibt. PHP-CGI wird am Ende jeder Anforderung den gesamten vom Skript verwendeten Speicher wiederverwenden, ihn jedoch nicht an das Betriebssystem freigeben, sondern ihn weiterhin halten, um die nächste PHP-Anforderung zu bewältigen. Dies geschieht wahrscheinlich, um die Speicherfragmentierung zu verringern oder das Problem der unkontrollierbaren Zeit zu lösen, die erforderlich ist, um Speicher vom System anzufordern und ihn wieder an das Betriebssystem freizugeben. Wenn eine PHP-Anforderung jedoch gelegentlich einen großen Speichervorgang wie FTP oder Zlib verwendet, wird ein großer Block des Systemspeichers kontinuierlich von PHP-CGI belegt und kann nicht verwendet werden.
Die Lösung für dieses Problem besteht darin, die Parameter der FastCGI-Konfigurationsdatei in der Webserverkonfiguration zu optimieren.

In der Datei C:\WINDOWS\system32\inetsrv\fcgiext.ini können Sie die mit dem PHP-CGI-Prozess verbundenen Parameter festlegen, beispielsweise:

[Typen]
php = PHP
[PHP]
ExePath=C:\php-5.3.8-nts-Win32-VC9-x86\php-cgi.exe
maxInstanzen=100
InstanceMaxRequests=10000
Umgebungsvariablen=PHP_FCGI_MAX_REQUESTS:10000
RequestTimeout=600
AktivitätsTimeout = 900

In der obigen Konfiguration:

ExePath gibt den Pfad des FastCGI-Parsers an.
instanceMaxRequests gibt die maximale Anzahl von Anfragen an, die jede Instanz verarbeiten kann.
maxInstances gibt die maximale Anzahl von Instanzen an, die gestartet werden können.
EnvironmentVars erstellt eine Umgebungsvariable PHP_FCGI_MAX_REQUESTS mit einem Standardwert von 10000.
requestTimeout gibt das Anforderungs-Timeout mit 600 Sekunden an.
activityTimeout gibt das Timeout der Aktivitätssitzung auf 900 Sekunden an.
Folgende Werte werden empfohlen:
maxInstances=
Ändern Sie diesen Wert auf einen kleineren Wert

Anregung

Für 512 MB Speicher ändern Sie maxInstances=50
Für 1G Speicher ändern Sie maxInstances auf 80
Für 2G Speicher ändern Sie maxInstances auf 140

Erneut ändern
InstanceMaxRequests=
Ändern Sie diesen Wert auf einen kleineren Wert

Anregung

Für 512 MB Speicher ändern Sie InstanceMaxRequests=200
Für 1G Speicher ändern Sie InstanceMaxRequests=300
Für 2G Speicher ändern Sie InstanceMaxRequests=500

Starten Sie IIS nach der Änderung neu.

instanceMaxRequests PHP_FCGI_MAX_REQUESTS Diese beiden Parameter bestimmen die maximale Anzahl von PHP-Anfragen, die ein php-cgi-Prozess nach seiner Erstellung akzeptieren kann. Die Standardkonfiguration in lighttpd ist 10000. Das heißt, dieser PHP-CGI-Prozess wird nach dem Empfang von 10.000 PHP-Anfragen beendet, gibt den gesamten Speicher frei und wird vom Verwaltungsprozess neu gestartet. Wenn Sie den Wert beispielsweise auf 100 senken, wird der Neustartzyklus von PHP-CGI erheblich verkürzt und auch die Auswirkungsdauer von Problemen, die durch gelegentliche Vorgänge mit hohem Speicherbedarf verursacht werden, wird verkürzt.
maxInstances: Dieser Parameter gibt die maximale Anzahl der Instanzen an, die gestartet werden können, d. h. die Anzahl der php-cgi.exe-Prozesse. Wenn Sie diesen Wert beispielsweise auf 100 senken, befindet sich in den Prozessen des Taskmanagers höchstens der Prozess php-cgi.exe und der von php-cgi.exe belegte Gesamtspeicher wird erheblich reduziert.
Der Server, den ich jetzt verwende, hat das Betriebssystem Windows 2003, 4 GB Arbeitsspeicher und ein php-cgi.exe-Programm belegt 7-25 MB Arbeitsspeicher. Ich habe den maxInstances-Wert auf 300 angepasst, wodurch die Gesamtzahl der php-cgi.exe-Prozesse und der belegte Arbeitsspeicher reduziert wurden. Die Reaktionsgeschwindigkeit ist viel schneller als zuvor. Der minimale Anpassungswert kann anhand der Anzahl der Besuche auf Ihrer Site bestimmt werden.

Win2008-Server, Tutorial zur perfekten FastCGI-Einstellung

Wenn Sie FASTCGI verwenden, um PHP-CGI.EXE auf IIS7 von WIN2008 aufzurufen, gibt es standardmäßig nur 4 Prozesse. Bei Websites mit hohem Datenverkehr ist die Prozesswarteschlange aufgrund einer unzureichenden Anzahl von Prozessen sehr schwerwiegend. Die Lösung lautet wie folgt.

32-Bit-Systeme http://www.iis.net/Downloads/files/AdminPack/TP2/AdminPack_x86.msi
64-Bit-Systeme http://www.iis.net/Downloads/files/AdminPack/TP2/AdminPack_amd64.msi

Laden Sie das folgende Tool herunter und installieren Sie es wie unten gezeigt.

修改WIN2008下IIS調用FASTCGI進程數! - 小三子 - 怪叟博客
修改WIN2008下IIS調用FASTCGI進程數! - 小三子 - 怪叟博客

Hinzufügen zu

PHP_FCGI_MAX_REQUESTS = 10000

Nach dem Hinzufügen können Sie den Effekt im Prozessmanager sehen, ohne IIS neu zu starten.

修改WIN2008下IIS調用FASTCGI進程數! - 小三子 - 怪叟博客

Der eingestellte Wert scheint zwar nicht erreicht zu sein, beim Surfen auf der Website ist die Leistungsverbesserung jedoch deutlich zu erkennen.

修改WIN2008下IIS調用FASTCGI進程數! - 小三子 - 怪叟博客

Speichernutzung~~ Tatsächlich besteht ein Nachteil des Microsoft-Systems darin, dass der Speicherverbrauch des Servers so weit wie möglich von Diensten genutzt werden sollte, anstatt genügend Speicher für Benutzeranwendungen wie den Client übrig zu lassen.

Ich möchte Sie daran erinnern, dass es sich lohnt, die folgenden beiden Parameter festzulegen:

InstanceMaxRequests: Die maximale Anzahl von Anfragen, die der Fastcgi-Prozess (php-fcgi.exe) verarbeiten kann. Wenn das Limit überschritten wird, wird es recycelt. Der Standardwert ist 200

PHP_FCGI_MAX_REQUESTS: Die maximale Anzahl von Anfragen, die von PHP selbst gesteuert werden, der Standardwert ist 500

Da Sie FastCGI zum Ausführen von CGI verwenden möchten, möchten Sie auf keinen Fall, dass PHP selbst die maximale Anzahl von Anfragen begrenzt! !

Stellen Sie daher sicher, dass InstanceMaxRequests kleiner oder gleich PHP_FCGI_MAX_REQUESTS ist, sodass PHP selbst nie die Möglichkeit hat, den Prozess erneut zu starten.

Sie können sehen, was Microsoft gesagt hat:

Stellen Sie sicher, dass FastCGI Php-cgi.exe-Prozesse immer recycelt, bevor die native PHP-Wiederherstellung beginnt. Die Konfigurationseigenschaft instanceMaxRequests steuert das FastCGI-Prozesswiederherstellungsverhalten. Diese Eigenschaft gibt an, wie viele Anfragen FastCGI vor der Wiederverwendung verarbeitet. PHP verfügt auch über eine ähnliche Prozesswiederherstellungsfunktion, die von der Umgebungsvariable PHP_FCGI_MAX_REQUESTS gesteuert wird. Indem Sie instanceMaxRequests auf einen Wert setzen, der kleiner oder gleich PHP_FCGI_MAX_REQUESTS ist, können Sie sicherstellen, dass die native PHP-Prozesswiederherstellungslogik niemals gestartet wird.

Lösung für das Problem zu vieler php-cgi.exe-Prozesse auf dem Server, die eine CPU-Auslastung von 100 % verursachen

Bei der Verwendung eines IIS-Servers gibt es häufig zu viele php-cgi.exe-Prozesse, wodurch die CPU zu 100 % ausgelastet ist und die Website letztendlich zu langsam läuft oder sogar einfriert. Ein Neustart von IIS ist für eine Weile kein Problem, aber nach einer Weile tritt diese Situation erneut auf. Warum passiert das und wie kann es gelöst werden? Zu Beginn habe ich das php-cgi-Programm immer manuell beendet. Obwohl dies das Problem vorübergehend lösen kann, ist es keine langfristige Lösung. Ich habe auf Baidu gesucht und festgestellt, dass dieses Problem im Allgemeinen ein Programmproblem ist, z. B. wenn das Programm Fastcgi zum Ausführen von PHP verwendet und die vom Programm festgelegten StartProcesses zu groß sind, z. B. 6 oder sogar noch größer. Nachfolgend finden Sie meine Lösung für das Problem übermäßiger php-cgi.ext, die zu Server-Cup% führen. Ich hoffe, sie hilft Ihnen weiter. Meistens passiert es beim vierten Punkt.

Lösungsreferenz:

1. Überprüfen Sie den Speicherplatz des Systems. Überprüfen Sie, ob sich zu viele temporäre Dateien im System befinden. Die temporären Dateien der MySQL-Datenbank werden standardmäßig in c:/windows/temp gespeichert, was zur Ansammlung von Zehntausenden oder sogar Millionen kleiner Dateien führt und die Systemfestplatte überlastet.

del *.* alle Dateien löschen

Wenn der obige Befehl nicht leistungsfähig genug ist, können Sie den folgenden Code verwenden

del /f /q /s tmp\*.*

2. PHP ist eine weit verbreitete dynamische Skriptsprache, allerdings gibt es in IIS keine integrierte Unterstützung für die PHP-Sprache. Wenn Sie PHP verwenden müssen, müssen Sie es also selbst installieren. PHP kann im CGI-Modus oder im ISAPI-Modus installiert werden. Da der ISAPI-Modus eine höhere Leistung bietet, empfehle ich Ihnen, den ISAPI-Modus zu verwenden.

3. Wenn das Programm geändert werden kann, wird empfohlen, den StartProcesses-Wert in der Programmkonfigurationsdatei auf 2 zu reduzieren, um zu sehen, ob sich die Situation dadurch verbessert.

4. Überprüfen Sie, ob ein Problem mit dem Server oder ein Angriffsphänomen vorliegt.

Das könnte Sie auch interessieren:
  • Linux Cron geplante Ausführung von PHP-Code mit Parametern
  • Ideen und Codes zur zeitlichen Steuerung der Seitengenerierung in ASP und PHP
  • PHP-Datei zur Linux-Serverkonfiguration herunterladen, chinesische verstümmelte Schriftzeichen, wie man Download-Fehler behebt
  • So lösen Sie das Problem des Hochladens großer Dateien in Teilen mit PHP
  • Installieren Sie die PHP7.3-Version unter einem Linux-System
  • PHP Local Outlier Factor Algorithmus - Spezifische Implementierungsanalyse des Local Outlier Factor (LOF) Algorithmus

<<:  Was ist COLLATE in MYSQL?

>>:  HTML Einführungstutorial HTML Tag Symbole schnell beherrschen

Artikel empfehlen

Ausführliche Erklärung der Iteratoren in ECMAScript

Inhaltsverzeichnis Vorwort Frühere Iterationen It...

Zwei Möglichkeiten zur Visualisierung von ClickHouse-Daten mit Apache Superset

Apache Superset ist ein leistungsstarkes BI-Tool,...

Transkript der Implementierung berechneter Vue-Eigenschaften

In diesem Artikel wird das Implementierungszeugni...

Faint: „Nutzen Sie Web 2.0, um standardkonforme Seiten zu erstellen“

Heute sprach jemand mit mir über ein Website-Entw...

Detaillierte Erklärung des Vue-Lebenszyklus

Inhaltsverzeichnis Warum den Lebenszyklus versteh...

Zusammenfassung der Linux-Befehlsmethoden zum Anzeigen verwendeter Befehle

Im System werden viele Befehle verwendet. Wie kön...

Was sind Web Slices?

Neue Funktion von IE8: Web Slices (Web Slices) Mi...

Zusammenfassung zum horizontal scrollenden Website-Design

Horizontales Scrollen ist nicht in allen Situation...

Lösung für das Problem des verstümmelten Codes in MySQL 5.x

MySQL ist eine häufig verwendete Open-Source-Date...

JS Canvas realisiert die Funktionen von Zeichenbrett und Signaturtafel

In diesem Artikel wird der spezifische Code von J...

MySql-Lerntag 03: Verbindungs- und Abfragedetails zwischen Datentabellen

Primärschlüssel: Schlagwort: Primärschlüssel Funk...

JS implementiert einen einfachen TodoList-Effekt (Notizblock)

Das Notizblockprogramm wird mithilfe der drei wic...

Detailliertes Tutorial zur Verwendung des Plugins tomcat8-maven-plugin in Maven

Ich habe viele Artikel online durchsucht, aber ke...