Frage So tun Sie Apache auf Ubuntu 14.04 Server


Momentan auf meinem Apache 2 (Apache 2.4.7 um genau zu sein) auf Ubuntu 14.04 habe ich diese Einstellung:

/etc/apache2/mods-enabled/mpm_prefork.conf

<IfModule mpm_prefork_module>
StartServers                    20
MinSpareServers                 100
MaxSpareServers                 250
MaxRequestWorkers               150
MaxConnectionsPerChild          0
</IfModule>

Der Server ist ein Amazon-Server mit 8 GB (RAM), der lediglich ein dreiseitiges Anmeldeformular für einige Google-Kampagnen einlädt.

Ich habe ein Skript namens apachetuneit.sh im Web, aber nach einer Weile meldete der Apache diesen Fehler:

[Di Apr 21 16: 45: 42.227935 2015] [mpm_prefork: error] [pid 1134] AH00161: Der Server hat die MaxRequestWorkers-Einstellung erreicht. Ziehen Sie in Erwägung, die MaxRequestWorkers-Einstellung zu erhöhen

Wie kann ich beurteilen, wie diese Einstellungen vorgenommen werden?

Ich frage speziell nur, wie man Apache 2.4 und nichts anderes abstimmt. Deshalb ist diese Frage anders als diese Frage.


18
2018-04-21 17:32


Ursprung


mögliches Duplikat von Wie erstellt man Lasttests und Kapazitätsplanung für Websites? - Jenny D
@JennyD Dieser Artikel ist viel zu breit für dieses spezielle Bedürfnis. - ServerChecker
Die Art und Weise, wie Sie diese spezifischen Einstellungen beurteilen, ist der Belastungstest. - Jenny D
@JennyD Es ist sogar einfacher als das. Verwenden Sie einfach ap.sh-Skript unter regulärem Laden mehrmals am Tag und im Durchschnitt, führen Sie die Mathe für den Cloudinservice-Link unten aus, und legen Sie MaxRequestWorkers auf diesen Wert fest. Beobachten Sie dann, wie der Apache Probleme mit MaxRequestWorkers meldet und entweder erhöht, mehr RAM hinzufügt, CloudFlare hinzufügt oder einen weiteren Web-Knoten hinzufügt. Keine Notwendigkeit für extrem intensive Belastungstests. - ServerChecker
Sie könnten eine Antwort schreiben, die Informationen über dieses Skript enthält, und relevante Dinge aus den Links, die Sie in Ihre eigene Antwort aufgenommen haben, auf die Frage, auf die ich als mögliches Duplikat hingewiesen habe. - Jenny D


Antworten:


  1. Erkenne, dass Ubuntu 14.04 Apache 2 mit PHP verwendet, das über einen mpm_prefork Modul, von dem eine bearbeitbare Datei in /etc/apache2/mods-enabled/mpm_prefork.conf liegt. Beachten Sie auch, dass ab Apache 2.4 MaxClients wird jetzt umbenannt als MaxRequestWorkersund daher muss jede Dokumentation zu MaxClients auf MaxRequestWorkers umgestellt werden.

  2. Stoppen Sie den Apache-Webdienst vorübergehend mit dem folgenden Befehl:

    sudo service apache2 stop
  1. Warten Sie 5 Sekunden und führen Sie dann den folgenden Befehl aus, um herauszufinden, wie viel virtueller Speicher Sie auf dem Server haben, der frei ist:
    sudo kostenlos -ht

Lesen Sie die Mem: Zeile und schauen Sie sich die freie Spalte an. Betrachten Sie dies als die Menge an RAM, die Sie Apache widmen können, obwohl ich normalerweise 2 GB auf einem robusteren Server (wie in> 4 GB) oder 1 GB auf einem leichteren Server abziehen möchte. Also, wenn die kostenlose Spalte sagte, ich hätte 13GB frei, würde ich Apache 11GB empfehlen. Das ist eine Grundlinie. Wenn in den Protokollen gelegentlich ein Datenbankproblem auftritt (wie 3 Mal in den Protokollen über einen Zeitraum von 3 Tagen), dass mehr Arbeitsspeicher benötigt wird, könnten wir annehmen, dass wir nur 10 GB anstelle von 11 GB hatten (in diesem Fall) ). Wenn wir in den Apache-Protokollen feststellen, dass der Server mehr MaxRequestWorker benötigt, dann ist das ein anderes Problem, das ich unten anspreche.

  1. Starten Sie den Apache-Webserver.
    Sudo Service Apache2 Start
  1. Öffnen Sie wie 10 Browser-Registerkarten, stellen Sie eine Verbindung zu einigen längeren oder langsameren Seiten von Ihrer Website her und aktualisieren Sie sie 3-4 mal auf jeder Registerkarte.

  2. Führen Sie danach schnell den folgenden Befehl aus:

    sudo ps -ylC apache2 | awk '{x + = $ 8; y + = 1} END {print "Apache Speicherauslastung (MB):" x / 1024; print "Durchschnittliche Prozessgröße (MB):" x / ((y-1) * 1024)} '

Führen Sie es wie 5 mal schnell.

Sehen Sie sich den Wert für die durchschnittliche Prozessgröße an und mitteln Sie diesen Wert unter den 5 Mal, die Sie ausgeführt haben.

Führen Sie nun die folgenden Berechnungen aus und stellen Sie sicher, dass GB nach Bedarf in MB konvertiert wird, damit alle Zahlen in MB-Werten stehen. Also, entweder multiplizieren Sie mal 1024 oder dividieren Sie durch 1024, je nachdem, auf welche Weise Sie gehen müssen.

MaxRequestWorkers= Baseline kostenlos (mit Pufferspeicher) / Durchschnittliche Prozessgröße

Zum Beispiel hatte ich einen 14GB Server, aber als Apache gestoppt wurde, zeigte der Server an, dass er 1 GB RAM im Leerlauf verwendete. Ich biete dann eine weitere 1 GB zusätzlichen Pufferplatz für das Betriebssystem, falls es benötigt wird. Das bedeutet, ich hätte eine Baseline Free von 12 GB. Jetzt muss ich es von GB in MB konvertieren, und so multipliziere ich 12 x 1024 und bekomme 12288. Der 12288 MB ist mein Baseline Free Wert. In meinem Fall sah ich, dass die durchschnittliche Prozessgröße 21 MB betrug. Also nehme ich 12288/21 und ich bekomme ungefähr 585. Nun ist es üblich, dass der Sysop diesen Wert abrundet, und so bekam ich 580.

  1. Bearbeiten Sie die Datei /etc/apache2/mods-enabled/mpm_prefork.conf und ziehen Sie in Betracht, sie auf die folgenden Standardwerte zu setzen, indem Sie XXX durch Ihre MaxRequestWorkers-Berechnung ersetzen:

`<IfModule mpm_prefork_module>`
  StartServers                    2
  MinSpareServers                 2
  MaxSpareServers                 5
  MaxRequestWorkers               XXX
  ServerLimit                     XXX
  MaxConnectionsPerChild          0
</IfModule>

Beachten Sie, dass der ServerLimit-Parameter dort möglicherweise nicht angezeigt wird. Fügen Sie es hinzu. Dieser Parameter ist standardmäßig auf 256 voreingestellt, wenn er nicht vorhanden ist. Er muss jedoch den gleichen Wert wie MaxRequestWorkers haben oder Sie erhalten einen Fehler.

  1. Ein weiterer kritischer Faktor in Ihrer Apache-Konfiguration ist die Datei /etc/apache2/apache2.conf mit der Variablen Timeout und wird in Sekunden gemessen. So lange können Sie vom Server senden oder empfangen, bevor das Zeitlimit überschritten wird. Sie müssen auch einen Datei-Upload oder einen Datei-Download in Betracht ziehen, beispielsweise wenn Sie eine Website haben, auf der beispielsweise CSV- oder andere große Dateien hochgeladen oder heruntergeladen werden können. Außerdem müssen Sie einen ausgelasteten Datenbankserver im Auge behalten, in dem Sie möglicherweise etwas Zeit für die Zeitüberschreitung der Seiten benötigen. Je kleiner diese Timeout-Variable ist, desto mehr verfügbare Webserver erhält der Webserver für neue Verbindungen. Beachten Sie jedoch, dass das Setzen dieses Wertes zu niedrig sein kann, was zu Verwüstungen bei PHP-Sitzungsvariablen führen kann, allerdings nicht bei sessionbasierten Cookies. So kann beispielsweise ein Wert von 300 (5 Minuten) für einen Webserver hilfreich sein, der anstelle von Browser-Sitzungscookies auf PHP-Sitzungsvariablen für den Web-App-Workflow angewiesen ist. Ein Wert von 45 könnte für einen Webserver gut sein, der nicht mehr als statische Werbezielseiten anbietet, aber für einen Server, der PHP-Sitzungsvariablen sehr oft verwenden muss, schrecklich wäre. Bearbeiten Sie daher den Timeout-Parameter in dieser Datei auf den von Ihnen benötigten Wert. Dies kann einige Tests mit all Ihren Webseiten erfordern, um zu sehen, ob der Wert zu niedrig ist. Es ist jedoch wahrscheinlich eine gute Idee, es nicht höher als 300 zu setzen, es sei denn, Sie sehen Probleme bei großen Datei-Uploads oder großen Datei-Downloads.

  2. Starten Sie nun Ihren Apache-Webservice neu. Wenn du etwas falsch gemacht hast, wird Apache dir wahrscheinlich davon erzählen, sobald du es wieder startest, und du kannst es korrigieren.

    sudo service apache2 neustarten
  1. Wiederholen Sie nun den 10-Tab-Browsertrick, den Sie zuvor gemacht haben, und sehen Sie, ob Sie Apache-Konfigurationsfehler im Fehlerprotokoll des Apache-Webservers feststellen:
    sudo tail -f /var/log/apache2/error.log

... drücken Sie STRG + C, wenn Sie möchten.

Suchen Sie nach einer Beschwerde über die Notwendigkeit von MaxRequestWorkers (und seit dem letzten Neustart des Webservers). Wenn Sie dies selbst bei einer optimalen MaxRequestWorkers-Einstellung sehen, benötigen Sie wahrscheinlich mehr Feuerkraft für Ihre Websites oder Webanwendungen. Berücksichtigen Sie diese Optionen:

  • Verwenden eines CDN für große Dateidownloads, Bilder und Skripts.
  • Einen Caching-Dienst wie CloudFlare oder andere verwenden.
  • Wiederholen Sie Ihre Website- oder Webanwendungsstrategie, um mehrere Web-Server als eine "Web-App" hinter einem Load-Balancer zu verwenden.
  • Hinzufügen von mehr RAM zum Server und damit diese Berechnung erneut ausführen.

  1. Nun, da der Apache-Server abgestimmt ist, ist die Art der Baseline abgestimmt. Sie müssen dies innerhalb von 2-3 Wochen überprüfen und nach MaxRequestWorker-Problemen in den Apache-Fehlerprotokollen suchen. Daraus können Sie eine Entscheidung über die Optimierung treffen (siehe Schritt 10). Sie können auch Munin mit apt auf Ubuntu installieren und sich die Apache-Leistung im Laufe der Zeit ansehen und eine Vorstellung von Wachstum erstellen, bevor Sie entscheiden, was Sie tun müssen, um den Datenverkehr des Webservers zu bewältigen.

44
2018-04-22 01:20



"Während diese Links die Frage beantworten können, ist es besser, hier die wesentlichen Teile der Antwort einzubeziehen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. " - Jenny D
@JennyD Guter Punkt! Ich werde das tun. - ServerChecker
@ Moderator Ich brauche Formatierungshilfe für diese Antwort. Schritt 7 sollte Conf Datei mit Einrückungen sein. Schritt 11 sollte nicht eingerückt werden. Code-Befehle, die mit beginnen sudo muss als Code angezeigt werden, nicht als normaler Text. Ich habe die Dokumentation über die Formatierung verfolgt, habe aber immer noch Schwierigkeiten. - ServerChecker
Ich habe getan, was ich konnte - Abschriften machen wirklich keine gemischten Listen und Code sehr gut, aber ich denke, dass ich es irgendwie besser geschafft habe. - Jenny D
für centos-neulinge wie mich: ps -lyU apache statt ps -ylC apache2 - user1928596


Worauf Sie MaxRequestWorker anwenden können, hängt davon ab, wie viel RAM jeder Ihrer httpd / apache-Prozesse beansprucht. Wenn jeder 50MB belegt (indem Sie einfach eine Zufallszahl auswählen), werden alle 20 Request-Worker, die Sie gleichzeitig verwenden (d. H. Gleichzeitige Verbindungen), 1 GB beanspruchen. In diesem Beispiel könnten Sie höchstens 8 GB * 20 = 160 MaxRequestWorker haben. Sie können jedoch nicht den gesamten Arbeitsspeicher für Apache verbrauchen, Sie müssen einige für andere Dinge reservieren, die dort laufen. Auch ein wenig freien Arbeitsspeicher kann hilfreich für die Leistung sein, da das Betriebssystem es zum Zwischenspeichern und zur Leistungssteigerung verwendet (obwohl es möglicherweise vorzuziehen ist, Verbindungen nicht zu haben, da der Server langsam erscheint) Benutzer-Browser warten auf eine Verbindung, die verfügbar wird, wenn sie alle aufgebraucht sind.


3
2018-04-21 17:40



Was ist eine gute Möglichkeit, dies zu profilieren? Welche Befehle kann ich eingeben, um zu sehen, wie viel RAM jeder Apache-Prozess unter Last verwendet? Wir brauchen auch RAM-Räume für MySQL (eine WordPress-Seite) und normale Systemprozesse. - ServerChecker
Sehen Sie, wie viele Prozesse laufen und führen Sie die free Befehl, um eine Speicherbasislinie zu erhalten. Erhöhen Sie dann die Anzahl der ausgeführten Prozesse, indem Sie MinSpareServers erweitern und Apache neu starten free wieder, und die Mathematik zu tun. Auschecken moreofless.co.uk/apache-memory-usage für mehr Details und Erklärung. - g491
Ich habe jetzt gelernt, dass es einen super schnellen Weg gibt, dies zu tun. Es ist im cloudinservice.com Link in meiner Antwort unten beschrieben. Der Befehl ist ap.sh, der jemand herausgefunden hat. Außerdem habe ich erfahren, dass MaxClients jetzt in Apache 2.4+ als MaxRequestWorker umbenannt wurde. - ServerChecker