Wie optimiere ich die Speicherzuweisung des Apache-Webservers, um Speicherfehler in einer EC2-Linux-Instance zu vermeiden?
Mein Apache-Webserver, der auf einer Amazon Elastic Compute Cloud (Amazon EC2)-Linux-Instance ausgeführt wird, reagiert zeitweise nicht. Ich erhalte im Systemprotokoll der Instance die Meldungen „out of memory“, „oom“, „oom-killer“, „failure to fork process“ oder andere Meldungen über unzureichenden Speicher.
Kurzbeschreibung
Standardmäßig akzeptiert Apache 256 Verbindungen gleichzeitig. Verwende das ServerLimit der Apache-Konfiguration, um das Kontingent zu konfigurieren.
Kleine Instance-Typen wie t2.small haben nur 2 Gigabyte (GB) Arbeitsspeicher und können nicht 256 gleichzeitige Apache-Verbindungen verwalten. Daher erhältst du möglicherweise einen der folgenden Fehler, wenn der Server viel Datenverkehr verzeichnet:
- „Out of memory“
- „Oom“
- „Oom-killer“
- „Failure to fork process“
- Ein Hinweis zu unzureichendem Speicher in den Systemprotokollen
Um die Instance-Systemprotokolle zu analysieren, überprüfe die folgenden Protokolldateien, die auf der Betriebssystemverteilung basieren:
- Überprüfe bei Debian und Ubuntu /var/log/syslog.
- Überprüfe bei Amazon Linux, CentOS und Red Hat Enterprise Linux (RHEL) /var/log/messages.
Lösung
Um Speicherfehler bei der Instance zu vermeiden, lege ein Kontingent für die Anzahl gleichzeitiger Apache- und httpd-Verbindungen fest, die der Server akzeptiert. Verwende den Parameter MaxRequestWorkers (Apache 2.4) in der Apache-Konfiguration, um das Kontingent festzulegen. Für Prefork-Server ohne Threading steht MaxRequestWorkers für die maximale Anzahl von untergeordneten Prozessen, die Apache bei Serveranforderungen startet.
Die folgende Auflösung bezieht sich auf das standardmäßige Prefork Apache Multiprozessor-Modul (MPM)-Modell, das Webserver verwenden. Führe den folgenden Befehl aus, um dein MPM zu bestätigen:
# apachectl -V | grep "MPM"
Um den ungefähren Wert zu berechnen, der für MaxRequestWorkers festgelegt werden muss, ermittle, wie stark deine Workload die folgenden Einstellungen verwendet:
- Das physische RAM deines Servers
- Den Speicher, der verbleibt, nachdem andere Services den Speicher verwendet haben
- Der Apache-Prozess, der den meisten Speicher verwendet
Hinweis: Es hat sich bewährt, einen Bereich von 90–100 % des REMAINING RAM (verbleibenden RAM) für MaxRequestWorkers zu verwenden, um Serverleistung und Stabilität auszugleichen. Die Workload kann jedoch andere Anforderungen haben.
Das physische RAM des Servers berechnen
Führe den folgenden Befehl aus, um das RAM zu berechnen:
# free -m | grep Mem: | awk '{print $2}'
Den Speicher berechnen, der verbleibt, nachdem andere Services den Speicher verwendet haben
Berechne zunächst den Speicherverbrauch aller wichtigen Services, die nicht Apache sind. Führe für jeden Service den folgenden Befehl aus:
# usage_mbytes=0; for usage_by_pids in `ps -C $proc_cmd -o rss | grep -v RSS`; do usage_mbytes=$(($usage_mbytes + $usage_by_pids)); done; echo $(($usage_mbytes/1024)) MB;
Hinweis: Ersetze im vorherigen Befehl $proc_cmd durch den Service-Namen oder -Befehl. Verwende beispielsweise mysqld, um den Speicherverbrauch des mysqld-Service zu berechnen.
Nachdem du den Speicherverbrauch der einzelnen Services berechnet hast, addiere die Werte, um die Gesamtsumme des Speicherverbrauchs durch alle anderen wichtigen Services zu erhalten.
Verwende dann die folgende Formel, um den Speicherverbrauch aller anderen wichtigen Services vom physischen RAM des Servers in Megabyte (MB) abzuziehen:
Verbleibender Speicher = (das physische RAM des Servers) – (Speicherverbrauch durch alle anderen wichtigen Services)
Den Apache-Prozess ermitteln, der den meisten Speicher verwendet
Führe den folgenden Befehl aus, um den Prozess zu ermitteln, der den meisten Speicher verwendet:
# sudo bash -c 'high_mem=0; for pid in $(ps aux | grep -E "httpd|apache2" | grep -v ^root | awk "{print \$2}"); do memory=$(pmap -d $pid | grep "writeable/private" | awk "{print \$4}" | sed "s/[^0-9]//g"); if [[ $memory -gt $high_mem ]]; then high_mem=$memory; fi; done; echo $((high_mem/1024)) MB'
Beachte, wie viel Speicher der Prozess verwendet.
MaxRequestWorkers berechnen
Verwende die folgende Formel, um MaxRequestWorkers zu berechnen:
MaxRequestWorkers = (Verbleibender Speicher * 90/100)/(Speicher, der vom größten Apache-Prozess verbraucht wird)
Hinweis: Ersetze den verbleibenden Speicher durch den Speicher, der übrig bleibt, nachdem andere Services den Speicher verwendet haben, und den Speicher, der vom größten Apache-Prozess verbraucht wird, durch den Speicher, den der größte Prozess verwendet.
Die vorhergehende Berechnung ist dieselbe für Ubuntu-, Debian- und RHEL-basierte Systeme. Der Apache-Konfigurationspfad und die Dateinamen hängen jedoch vom Betriebssystemtyp ab. Stelle MaxRequestWorkers basierend auf dem Betriebssystem ein.
Hinweis: Die folgenden Beispiele verwenden eine Apache Version 2.4 oder höher.
Debian und Ubuntu
Führe die folgenden Schritte aus:
-
Führe den folgenden Befehl aus, um die Datei /etc/apache2/mods-available/mpm_prefork.conf im Editor-Modus zu öffnen:
# vi /etc/apache2/mods-available/mpm_prefork.conf -
Ändere den Parameter MaxRequestWorkers in den Wert, den du berechnet hast.
Beispiel:<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers your_value MaxConnectionsPerChild 0 </IfModule>Hinweis: Ersetze your_value durch den berechneten MaxRequestWorkers-Wert. Konfiguriere auch die anderen Parameter so, dass sie deinen Anforderungen entsprechen.
-
Speichere die Datei und beende dann die Datei.
-
Führe den folgenden Befehl aus, um eine Apache-Syntaxprüfung durchzuführen:
# apachectl configtest -
Wenn du eine Ausgabe von Syntax OK erhältst, führe den folgenden Befehl aus, um Apache neu zu starten:
# systemctl restart apache2
Amazon Linux, CentOS und RHEL
Führe die folgenden Schritte aus:
-
Erstelle eine Datei mit dem Pfad /etc/httpd/conf.d/mpm_prefork.conf und füge dann den folgenden Befehlsblock hinzu:
<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers your_value MaxConnectionsPerChild 0 </IfModule>Hinweis: Ersetze your_value durch den berechneten MaxRequestWorkers-Wert. Konfiguriere auch die anderen Parameter so, dass sie deinen Anforderungen entsprechen.
-
Speichere die Datei und beende dann die Datei.
-
Führe den folgenden Befehl aus, um die Konfigurationssyntax von Apache zu überprüfen:
# httpd -t -
Wenn du eine Ausgabe von Syntax OK erhältst, führe den folgenden Befehl aus, um Apache neu zu starten:
# systemctl restart httpd
Ähnliche Informationen
Tutorial: Einen LAMP-Webserver auf Amazon Linux 2 installieren
Tutorial: Einen LAMP-Webserver auf Amazon Linux 2023 installieren
- Themen
- Compute
- Tags
- LinuxAmazon EC2
- Sprache
- Deutsch

Relevanter Inhalt
AWS OFFICIALAktualisiert vor einem Monat
AWS OFFICIALAktualisiert vor einem Jahr
AWS OFFICIALAktualisiert vor 6 Monaten
AWS OFFICIALAktualisiert vor einem Monat