So reduzieren Sie die Speichernutzung auf einem Unix-Webserver

36

Ich verwende derzeit einen Joyent Accelerator zum Hosten meiner Webapps, und er funktioniert einwandfrei. Allerdings muss ich die Kosten senken, damit ich meinen aktuellen Plan herabstufen kann und einige neue Speicherbeschränkungen auferlege (256M RSS, 512M Swap). Ich war gestern nicht allzu weit davon entfernt, aber nachdem ich Apache heute mehrmals neu gestartet habe, bin ich jetzt 411M rss, 721M Swap (prstat -Z -s cpu).

Die Suche in Server Fault bietet mir nur viele Möglichkeiten und spezielle Tools zur Überwachung des Servers, aber keine Tipps zur Reduzierung / Optimierung der Speichernutzung. Ich habe diese Frage auch gesehen , aber ich denke nicht, dass sie für diese spezielle Situation (oder kann ich generisch sagen?) Gut ist.

Auf dem Server wird Solaris auf einer gemeinsam genutzten CPU ausgeführt, und ich verwende einen Apache + MySQL + PHP-Stack.

Ich bin daran interessiert, die Schritte zu kennen, die man unternehmen kann, um das Problem zu lösen. Allerdings fehlt mir auch die Zeit, um meinen Speicherbedarf zu verringern und den Plan vor dem Ende des aktuellen Zeitraums herunterzustufen. Daher ist auch alles willkommen, was magisch wirken und den Tag retten kann :)

Lima
quelle
1
Ich wollte nur kommentieren, dass, obwohl ich diese Einstellungen selbst durch Googeln gelernt hatte, sich herausstellte, dass ich Einstellungen in einer Datei änderte, aber eine andere Konfigurationsdatei, die später geladen wurde, meine Einstellungen tatsächlich stillschweigend überschrieb! Als ich das entdeckte, wirkten sich das Festlegen der MPM-Einstellungen für den Prefork und ein paar andere Dinge positiv aus, um die Prozessanzahl und die Speichernutzung unter Kontrolle zu halten und das Auswechseln auf ein Minimum zu beschränken. Hoffe, diese Informationen helfen anderen, insbesondere denen, die Gentoo auf ihren Servern ausführen.
Pistos

Antworten:

23

Danke an alle für eure Antworten! Nach Ihren Vorschlägen konnte ich meinen Speicherverbrauch auf 195 Millionen SWAP und 108 Millionen RSS reduzieren, ohne meinen Code zu berühren (ich werde ihn auf jeden Fall bald optimieren, aber dies sollte eine Lösung sein, um mich schnell von Problemen zu befreien).

Hier ist die Liste der Dinge, die ich getan habe:

Das in VirtualHost-Einträgen verwendete Platzhalterzeichen wurde entfernt. Anstelle von *: 80 und *: 443 habe ich die reale IP meines Servers verwendet.

Das Prefork-MPM von Apache wurde geändert. Dies sind die Werte, die ich letztendlich verwendet habe:

StartServers 1
MinSpareServers 1 
MaxSpareServers 5 
ServerLimit 16
MaxClients 16
MaxRequestsPerChild 0
ListenBacklog 100

Dies sind keineswegs magische Zahlen. Ich habe einige Zeit damit verbracht, verschiedene Werte und Kombinationen zu testen und sie dann gegen die tatsächliche Nutzung meines Servers zu testen, und jeder sollte das Gleiche in seiner Umgebung tun. Mein Server erhält ungefähr 2 Millionen pvs / Monat und liefert regelmäßig sowohl dynamische Seiten als auch Assets - kein Digg-Effekt. Die Absicht war wiederum, den Speicherbedarf zu verringern, nicht die Leistung oder HA zu verbessern.

Referenz:

Apaches KeepAlive abgeschaltet. Wenn Sie KeepAliveTimeouteinen niedrigeren Wert einstellen (in meinem Fall 2), kann ich davon ausgehen, dass weniger Serverprozesse auf Verbindungen mit inaktiven Clients warten, die möglicherweise keinen weiteren Inhalt anfordern.

Referenz: http://httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout

Das unbenutzte Modul von MySQL wurde entfernt. Ich habe skip-innodbzu MySQL's my.cnf hinzugefügt. Massive Reduzierung des Speicherverbrauchs.


Es gibt auch einige bemerkenswerte gute Vorschläge, die ich persönlich nicht machen konnte:

  • Entfernen Sie nicht benötigte PHP-Module. Das PHP auf meinem Server hat die meisten Mods bereits kompiliert, ich werde wahrscheinlich mein eigenes minimales PHP auf anderen VPS ausprobieren.
  • Wechseln Sie mit php-fastcgi zu nginx. Das ist ein weiterer guter Rat, den ich bald versuchen werde, aber im Moment kann ich die Ausfallzeit nicht riskieren.
Lima
quelle
Ich verwende nginx und php-fastcgi (LEMP) und habe ähnliche Speicherprobleme ... Auf einem 256-MB-Server funktioniert php-fastcgi gut mit PHP_FCGI_CHILDREN = 5 und PHP_FCGI_MAX_REQUESTS = 333. Diese Werte sind ein guter Anfang Punkt!
Farinspace
Got rid of the wildcard used in VirtualHost entriesHilft das tatsächlich in irgendeiner sinnvollen Weise? Ich hatte den Eindruck, dass das keinen Unterschied machen würde.
Mahn
@Mahn - es hilft nicht mit Speicher, aber es verbessert die CPU-Auslastung, was eine gute Sache in einer Umgebung mit wenig Arbeitsspeicher ist
jsnfwlr
"Wechseln Sie mit php-fastcgi zu nginx" --- Eine weniger drastische und dennoch effektive Option, wenn Sie Apache2 behalten möchten, wäre: Apache2 + mod_proxy_fcgi + mod_mpm_event. mpm_event ähnelt nginx. Verwenden Sie das, um eine Verbindung zu PHP-FPM herzustellen. Siehe dracony.org/stop-using-php-fpm-to-argue-using-nginx-vs-apache
James Johnston
6

Ich habe diesen Artikel über speicherarme Konfigurationen für Apache und MySQL gefunden

Sehr nützlich beim Layouten der Konfigurationsänderungen, die für Konfigurationen mit wenig Arbeitsspeicher erforderlich sind. Ich habe sie für meine eigene Situation optimiert, aber sie sollten Ihnen die Werkzeuge geben, die Sie benötigen, um die beste Anpassung an Ihre Umgebung zu finden

Kevin Kuphal
quelle
der link ist tot
user2682863
4

Sie müssen einschränken, wie viele Apache-Server-Prozesse ausgeführt werden, und da Sie so nahe am Limit sind, werden Sie nicht in der Lage sein, sehr hohen Datenverkehr zu bewältigen. Einen Webserver zu haben, der bei normaler Nutzung maximal ist, ist im Allgemeinen eine schlechte Idee, da der Webverkehr zum größten Teil nett und gering ist, bis Sie einen Schrägstrich oder einen Schlag ins Gesicht oder einen Feuerball oder was auch immer bekommen.

Die Hauptprobleme sind die Anzahl der Apache-Prozesse, die zu einem bestimmten Zeitpunkt ausgeführt werden - vorausgesetzt, es handelt sich um Prefork-Prozesse, da ich nur PHP-Anwendungen bereitgestellt habe und PHP nicht threadsicher ist. Ich habe keine Erfahrung mit der Dimensionierung des Worker-MPM. Es gibt einige Elemente, die sich im gemeinsamen Speicher befinden, und einige Elemente, die sich im Speicher jedes Prozesses befinden.

Sie können den Gesamtspeicherbedarf verringern, indem Sie nicht benötigte gemeinsam genutzte Module weglassen. Grundsätzlich wird Apache von den meisten Hosts so konfiguriert, dass fast alles unter der Sonne möglich ist. Wenn Sie mod_userdir nicht verwenden, kommentieren Sie es aus Ihrer Apache-Konfiguration. Seien Sie vorsichtig, wie viel Sie entfernen, da einige der Dinge, die Sie möglicherweise benötigen, oder deren Abhängigkeiten nicht intuitiv sind! Alle Module sollten auf der Website apache.org dokumentiert sein. Es ist schwieriger, den Platzbedarf pro Prozess zu verringern. Die meisten Apache-Konfigurationen werden heutzutage nur mit den vier wesentlichen Modulen geliefert, die kompiliert wurden. Abgesehen von diesen vier Modulen wird der größte Teil des Arbeitsspeichers entweder durch Lecks oder durch nicht effektiv gesammelten Anwendungs-RAM verbraucht. Aus diesem Grund möchten Sie möglicherweise die Anzahl der Anforderungen festlegen von jedem Prozess niedrig behandelt.

Sie möchten wirklich Ihre Speichernutzung im RAM selbst behalten und nicht in Swap gehen. Swap bedeutet I / O. I / O ist langsam und wird Ihre CPU-Auslastung durch das Dach treiben, da Prozesse blockieren, während Sie darauf warten, dass etwas aus dem Swap herausgemischt wird.

Karl Katzke
quelle
1
Danke für den Rat, Karl! Gibt es eine Möglichkeit zu verhindern, dass der Server den Swap verwendet? Denn nach der Reduzierung des Speicherverbrauchs bin ich nicht mehr über meinen Arbeitsspeicher hinaus, aber es wird immer noch angezeigt, dass der SWAP-Speicher verwendet wurde.
Lima
@fandelost Es ist eigentlich egal, dass Swap verwendet wird, es ist schlecht, wenn Dinge in und aus Swap ausgelagert werden. Ihr Betriebssystem tauscht möglicherweise Anweisungen oder Daten von Prozessen aus, die nicht sehr häufig ausgeführt werden, wenn Zeit dafür vorhanden ist, da es der Meinung ist (und oftmals richtig ist), dass diese Anweisungen und Daten dort besser abgelegt sind.
Patrick James McDougle
2

Entfernen Sie für Apache die Module, die Sie nicht verwenden, da sie nur zusätzlichen Speicher benötigen. Entfernen Sie für MySQL innodb / bbdb, wenn Sie diese nicht verwenden, und entfernen Sie nicht benötigte PHP-Module.

Als nächstes sollten Sie Apache MaxClients basierend auf der Größe eines Prozesses und der Menge an Speicher konfigurieren, die Sie Apache geben möchten. Gleiches gilt für maximale Verbindungen unter MySQL (ich empfehle das exzellente MySQL Tuning Primer Script.

Wenn Sie die Kontrolle über Ihre PHP-App haben, stellen Sie sicher, dass sie nicht zu viel Speicher belegt (z. B. in Variablen, insbesondere in statischen).

Wenn Sie weiter gehen möchten, können Sie apache + mod_php durch nginx + fcgi setup ersetzen, was wahrscheinlich zu einer weiteren Reduzierung des Arbeitsspeichers führt.

Eine letzte Sache - Sie möchten wirklich nicht auf einem Webserver tauschen. Nur ein bisschen, um nicht benötigtes Material zu entfernen, aber ein regelmäßiger Austausch auf einem Webserver führt dazu, dass die Website nicht mehr reagiert.

yhager
quelle
Vielen Dank für Ihren Rat yhager, ich versuche tuning-primer.sh, aber ich erhalte die folgende Fehlermeldung: "Syntaxfehler in Zeile 94:` cnf_socket = $ 'unexpected ". Irgendwelche Ideen?
Lima
Könnte mit der Shell zusammenhängen. Da dieses Skript wahrscheinlich mit Linux zusammenhängt, versuchen Sie, die erste Zeile so zu ändern, dass sie auf bash anstelle von / bin / sh zeigt. Ich hoffe, Sie können Bash auf Solaris installieren lassen, aber ich kann nicht anders ...
yhager
2

Da Sie Ihr Ziel bereits erreicht haben, sind hier einige zusätzliche:

Da Sie alle unnötigen PHP-Module entfernt haben, können Sie dies auch für Apache tun. Standardmäßig (abhängig von der Installation) lädt Apache eine ganze Reihe von zusätzlichen Modulen und die meisten von ihnen werden für den normalen täglichen Gebrauch nicht wirklich benötigt. Beispielsweise gibt es eine Reihe von Authentifizierungsmodulen, die immer geladen sind. Deflate ist in der Regel nicht erforderlich, es sei denn, Sie möchten die Bandbreitennutzung einschränken. Autoindex & Status geht sind auch fraglich.

Und eine andere ist, dass Sie die für PHP in der php.ini verfügbare Speicherkapazität begrenzen können: memory_limit = xxxM

rasjani
quelle
0

Sie könnten natürlich die Anzahl der Prozesse, die Apache ausführen kann, begrenzen, dies würde jedoch nur als ein hartes Limit für Ihre Speichernutzung funktionieren. Aus Sicht einer niedrigeren Ebene können Sie plimit verwenden , um die für einen Prozess verfügbaren Ressourcen einzuschränken. Wenden Sie dies auf die Eltern- und Kinderprozesse an, von denen ich glaube, dass sie sie erben.

Aus der Sicht der Webserverkonfiguration kann es jedoch darauf ankommen, wie Ihr Code wirklich läuft! Bedenken Sie jedoch, dass kleine Dinge wie die Verwendung von .htaccess-Dateien mehr Ressourcen verbrauchen als die Verwendung von zentralen Apache-Konfigurationsdateien (da sie jedes Mal gelesen werden, wenn eine Anfrage eingeht, was zu einem höheren Overhead führt), was für große Websites bezeichnend ist.

Coops
quelle
0

Eine Sache, die das Speicherwachstum im Laufe der Zeit unterstützen könnte, ist das Verringern des httpd-Keepalive. Ich würde dies jedoch sorgfältig testen, falls Ihre Anwendung längerlebige Prozesse benötigt.

DF
quelle
0

Auf dem Server wird Solaris auf einer gemeinsam genutzten CPU ausgeführt, und ich verwende einen Apache + MySQL + PHP-Stack.

Ich habe keine Erfahrung mit Solaris, aber das Beste, was Sie tun können, ist, Apache / mod_php nicht zu verwenden.

  • Wechseln Sie mit php-fastcgi zu nginx.
  • Kompilieren Sie PHP neu, um die minimale Anzahl von Plugins zu verwenden.
  • Befreien Sie sich von unnötigen Prozessen wie ntpd (benutze ntpdate), ftp (benutze scp) etc ...
unbekannte
quelle