httpd Speichernutzung

13

Probleme mit der Speichernutzung httpd( Apache/2.2.29).

Mit der Zeit steigt die Speichernutzung in den httpdProzessen, bis sie schließlich bei 100% liegt.

Das letzte Mal, dass ich neu gestartet habe, httpdwar vor ungefähr 24 Stunden. Ausgabe von free -mist:

[ec2-user@www ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1655       1415        239          0        202        424
-/+ buffers/cache:        788        866
Swap:         1023          4       1019

Um zu beweisen, dass es definitiv so ist httpd, habe ich neu gestartet httpdund bin free -merneut gelaufen :

[ec2-user@www ~]$ sudo service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
[ec2-user@www ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1655        760        894          0        202        360
-/+ buffers/cache:        197       1457
Swap:         1023          4       1019

Ein Neustart von Apache benötigt also freien Speicher von 239 MB bis 894 MB - was wie ein großer Sprung erscheint.

Ich habe durch die Liste gegangen von derzeit Apache - Module aktiviert ist (es gibt eine ganze Menge) und deaktiviert / entfernt mod_wsgiund mod_perl(von denen keiner für diesen Server erforderlich, die eine PHP-basierte Web - Anwendung läuft - Magento, speziell).

Basierend auf https://servercheck.in/blog/3-small-tweaks-make-apache-fly habe ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}'ich die folgende Ausgabe ausgeführt und erhalten:

[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}' 15.1328 MB 118.09 MB 127.449 MB 129.059 MB 117.734 MB 113.824 MB 125.062 MB 123.922 MB 119.855 MB 108.066 MB 136.23 MB 114.031 MB 113.27 MB 110.695 MB 102.113 MB 113.234 MB 186.816 MB 118.602 MB 0.835938 MB

Wenn Sie das andere vorgeschlagene Diagnosetool ausführen MaxClients, wird ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'Folgendes zurückgegeben:

[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
110.212 MB

Dieser Server (Amazon AWS- m1.smallInstanz) verfügt 1.7 Gbüber RAM. Also deshalb:

Haben Sie weitere Hinweise / Vorschläge, wie Sie die httpdEinstellungen am besten optimieren oder wie Sie diagnostizieren können, was genau die Ursache dafür sein könnte?

James Spittal
quelle
Beachten Sie, dass Sie sich die -/+ buffers/cacheZeile ansehen müssen, um die Speichernutzung nach Prozessen zu überprüfen . In diesem Fall ist die Änderung jedoch vergleichbar. Abhängig davon, wie Apache optimiert wurde, kann es mit ein paar Prozessen beginnen, die für die Bearbeitung von Anforderungen bereit sind. Nach einer Zeit von vielen gleichzeitigen Anforderungen werden wahrscheinlich mehr Prozesse für die Verarbeitung der Last bereitgestellt. Die Anzahl der Leerlaufprozesse kann ebenfalls eingestellt werden. Wenn Apache also zu viel Speicher benötigt, müssen Sie einige Anpassungen vornehmen.
Wurtel
Ich bin bei der Apache-Serverkonfiguration in Ordnung, habe aber in der Vergangenheit nicht viel für die Leistungsoptimierung von Apache getan. Irgendwelche Vorschläge, welche Richtlinien ich beachten sollte oder Anleitungen? Gibt es eine Konfigurationseinstellung, die ich aktivieren kann, um Apache anzuweisen, nach einer bestimmten Zeit gegabelte Prozesse abzubrechen? (Es scheint, dass Apache dies aus irgendeinem Grund nicht standardmäßig tut.)
James Spittal
Genau aus diesem Grund bin ich von Apache weggezogen ... probiere Nginx oder sogar Lighttpd.
Interessant. Gutes gehört nginx, vielleicht ist es an der Zeit, es zu versuchen, aber ehrlich gesagt, ich benutze Apache seit Jahren und hatte nie größere Probleme. Magento kaut wirklich Speicher.
James Spittal
Beachten Sie, dass Ihr Skript zur Berechnung der durchschnittlichen Speichernutzung die geringe Speichernutzung des grep httpdProzesses enthält (zumindest für mich). Um das zu beheben, würde ich empfehlen, diese Zeile von der Berechnung wie ps aux | grep 'httpd' | grep -v grep | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
folgt

Antworten:

11

Folgendes habe ich getan, um das Problem zu lösen:

  1. Set MaxClients 7(basierend auf (1740.8Mb Memory on server - 900Mb for MySQL + other stuff) / 111Mb average usage per httpd process = 7.5747747747747747747747747747748)

Deshalb:

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients         7
MaxRequestsPerChild  4000
</IfModule>
  1. Deaktivieren Sie alle Apache - Module mit Ausnahme authz_host_module, log_config_module, expires_module, deflate_module, setenvif_module, mime_module, autoindex_module, negotiation_module, dir_module, alias_module, rewrite_module,php5_module

  2. Entfernen Sie das mod_sslPaket, da der Client überhaupt nichts verwendet https://.

Ich melde mich zurück, sobald diese neue Konfiguration eine Weile ausgeführt wurde, um zu sehen, ob dies das Problem löst.

Einige Inspirationen hier wurden entlehnt von: http://www.activoinc.com/blog/2009/08/31/performance-optimized-httpd-conf-for-magento-ecommerce/ und http://www.activoinc.com/ downloads / httpd.conf-magento

James Spittal
quelle
Die obige Konfiguration hat definitiv massiv geholfen.
James Spittal
1
Einige Tage später httpdscheinen die Probleme mit dem Speicherverlust vollständig verschwunden zu sein.
James Spittal
2

Ich fürchte Option MaxRequestsPerChild hat in Ihrem Fall geholfen, da sie das Prozessrecycling nach einer festgelegten Anzahl von Anforderungen ermöglicht, sodass ein Speicherverlust vorhanden, aber nicht mehr sichtbar ist.

Zusätzlich: MaxClients = ServerLimit * ThreadsPerChild

In Ihrem Fall, wenn Sie nur 7 gleichzeitige Benutzer benötigen (MaxClients = 7), ist es völlig ausreichend, zwei Prozesse auszuführen (nur für den Fall, dass eine Ausfallzeit nicht minimiert werden kann).

<IfModule prefork.c>
StartServers       2
MinSpareServers    2
MaxSpareServers   20
ServerLimit        2
MaxClients         8
ThreadsPerChild    4
MaxRequestsPerChild  4000
</IfModule>

Ich benutze MaxClients 8 , um die Anforderungsverteilung zwischen zwei Prozessen zu verbessern .

Igor Levkov
quelle