Hier sind meine MPM-Einschränkungen:
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 10
MaxClients 10
MaxRequestsPerChild 2000
</IfModule>
Trotzdem laufen bei mir derzeit über 20 Apache-Prozesse, und in den letzten ein oder zwei Stunden waren es sogar 40-50. Sollten MaxClient und MaxSpareServers die Anzahl der Prozesse nicht unter Kontrolle halten (also auf etwa 10)?
Übersehe ich etwas?
Antwort1
Apache gibt es in verschiedenen Varianten, die zwei häufigsten sindVorgabelUndArbeiter. Das Prefork-Modell erzeugt mehrere Prozesse, aber jeder Prozess verarbeitet jeweils nur eine Anfrage. Das Worker-Modell hingegen erzeugt mehrere Prozesse und jeder Prozess hat mehrere Threads, wobei jeder Thread jeweils eine Anfrage verarbeitet.
Abhängig von Ihrer Distribution verwenden Sie möglicherweise ein anderes Modell als das, das Sie erwarten. Sie erwarten Prefork, aber sind Sie sicher, dass dies der Typ ist, der ausgeführt wird? So finden Sie es heraus:
$httpd -V Serverversion: Apache/2.2.15 (Unix) Server erstellt: 28. Mai 2010 07:58:25 Magische Zahl des Servermoduls: 20051115:24 Server geladen: APR 1.4.2, APR-Util 1.3.9 Kompiliert mit: APR 1.4.2, APR-Util 1.3.9 Architektur: 32-Bit Server-MPM: Prefork Gewinde: nein gegabelt: ja (variable Prozessanzahl)
In diesem Fall Server MPM
ist es meines Prefork
, aber Ihres kann anders sein. Auf meinem Debian-Server mit Apache2 ist es Worker
:
#/usr/sbin/apache2 -V Serverversion: Apache/2.2.9 (Debian) Server-MPM: Arbeiter
Auf manchen Rechnern (wie RedHat) ist es nicht ungewöhnlich, dass sowohl Prefork- als auch Worker-Binärdateien vorhanden sind (eine wird aufgerufen httpd
und eine andere httpd.worker
oder etwas Ähnliches). Sie sollten noch einmal überprüfen (mit ps
oder top
oder cat /etc/init.d/httpd
), welche tatsächlich gestartet wird.
Antwort2
Für alle anderen, die über diese Frage stolpern: Es gibt noch eine andere mögliche Ursache.
Ich weiß, Sie glauben, Sie hätten Ihre Antwort bereits gefunden, aber bei Prefork sollten Sie unabhängig von der Betrachtungsweise der Prozesse dasselbe sehen. Sie haben Prefork wohl nicht verwendet.
Aus diesem Grund:
http://httpd.apache.org/docs/2.4/mod/prefork.html
Dieses Multi-Processing-Modul (MPM) implementiert einen nicht-threaded, vorgegabelten Webserver.
Eine andere Erklärung, die ich gefunden habe
Das Laden des Prefork-Moduls vor den Konfigurationsoptionen funktioniert, aber wenn Sie es danach laden, werden anscheinend stattdessen einige Standardwerte geladen, wodurch Ihre IfModule-Direktive inaktiv wird. Sie werden dies wahrscheinlich nur bei einer angepassten Apache-Konfiguration sehen, da Distributionen es zum Starten korrekt eingerichtet haben.
Werke- Konfiguration wird angewendet
LoadModule mpm_prefork_module /usr/lib/apache2/modules/mod_mpm_prefork.so
<IfModule mpm_prefork_module>
StartServers 1
MinSpareServers 1
MaxSpareServers 0
ServerLimit 4
MaxClients 4
MaxRequestsPerChild 4000
</IfModule>
Funktioniert nicht- Konfiguration hat keinen Effekt
<IfModule mpm_prefork_module>
StartServers 1
MinSpareServers 1
MaxSpareServers 0
ServerLimit 4
MaxClients 4
MaxRequestsPerChild 4000
</IfModule>
LoadModule mpm_prefork_module /usr/lib/apache2/modules/mod_mpm_prefork.so
Antwort3
Ich komme mir jetzt irgendwie blöd vor, aber das hier:Warum zeigt htop viele Apache2-Prozesse an, ps aux jedoch nicht?erklärt mein Problem.