Frage So reduzieren Sie die Speichernutzung auf einem Unix-Webserver


Ich benutze derzeit einen Joyent Accelerator, um meine Webapps zu hosten, und es funktioniert gut, aber ich muss die Kosten reduzieren, so dass ich meinen aktuellen Plan herabsetze und das neue Speichergrenzen auferlegt (256M rss, 512M swap). Ich war gestern nicht allzu weit über ihnen, 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 gibt mir nur eine Menge Möglichkeiten und spezielle Tools zur Überwachung des Servers, aber keine Ratschläge, wie die Speichernutzung reduziert / optimiert werden kann. Ich habe es auch gesehen diese Frage, aber ich denke nicht, dass es gut für diese spezielle Situation ist (oder ich sage generische?).

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

Ich bin daran interessiert zu wissen, welche Schritte man unternehmen kann, um dies zu beheben und die Probleme zu lösen. Allerdings habe ich auch keine Zeit mehr, meinen Speicher-Footprint zu reduzieren und den Plan zu reduzieren, bevor das aktuelle Ende kommt, also ist alles, was Magie machen und den Tag retten kann, auch willkommen :)


36
2018-06-06 12:27


Ursprung


Ich wollte nur kommentieren, dass obwohl ich diese Einstellungen selbst vom googlen gelernt hatte, es sich herausstellte, dass ich die Einstellungen in einer Datei änderte, aber eine andere Konfigurationsdatei, die später geladen wurde, überschrieb meine Einstellungen stillschweigend! Nachdem ich festgestellt hatte, dass die Einstellung der Prefork-MPM-Einstellungen und einige andere Dinge Wunder wirkten, um die Anzahl der Prozesse und die Speichernutzung unter Kontrolle zu halten, wurde auf ein Minimum ausgewichen. Hoffentlich hilft diese Information anderen, besonders denjenigen, die Gentoo auf ihren Servern laufen haben. - Pistos


Antworten:


Vielen Dank für Ihre Antworten! Nach Ihren Vorschlägen konnte ich meinen Speicherverbrauch auf 195M SWAP und 108M RSS reduzieren, ohne meinen Code zu berühren (ich werde ihn auf jeden Fall bald optimieren, aber das sollte eine Lösung sein, um mich schnell aus der Klemme zu bringen).

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

Entfernen Sie den Platzhalter in VirtualHost-Einträgen. Statt *: 80 und *: 443 habe ich die reale IP meines Servers benutzt.

Apache Prefork MPM geändert. Dies sind die Werte, die ich am Ende benutzt habe:

StartServer 1
MinSpareServer 1
MaxSpareServer 5
ServerLimit 16
MaxClients 16
MaxRequestsPerChild 0
ListenBacklog 100

Dies sind keineswegs magische Zahlen. Ich habe einige Zeit damit verbracht, verschiedene Werte und Kombinationen auszuprobieren und sie dann gegen die tatsächliche Nutzung meines Servers zu testen, und jeder sollte das Gleiche in seiner Umgebung tun. Für den Rekord, mein Server erhält fast 2M pvs / Monat, sowohl dynamische Seiten und Vermögenswerte mit einer regelmäßigen Rate - kein Digg-Effekt. Die Absicht war wiederum, den Speicherbedarf zu reduzieren, nicht die Leistung oder HA zu verbessern.

Referenz:

Hat KeepAlive von Apache getunt. Indem man es einstellt KeepAliveTimeout Auf einen niedrigeren Wert (2 in meinem Fall) kann ich erwarten, dass weniger Serverprozesse auf Verbindungen mit untätigen Clients warten, die möglicherweise keinen weiteren Inhalt anfordern.

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

Das nicht verwendete Modul von MySQL wurde entfernt. Ich fügte hinzu skip-innodb zu my.cnf von MySQL. Massive Speicherverbrauchsreduzierung


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

  • Entfernen Sie PHP-Module, die Sie nicht benötigen. 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.

22
2018-06-07 15:15



Ich laufe nginx und php-fastcgi (LEMP) und laufe auf ähnliche Speicherprobleme ... auf einem 256MB Server finde ich, dass php-fastcgi gut mit PHP_FCGI_CHILDREN = 5 und PHP_FCGI_MAX_REQUESTS = 333 zusammenarbeitet ... diese Werte sind ein guter Anfang Punkt! - farinspace
Got rid of the wildcard used in VirtualHost entries hilft das wirklich 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 Speicher ist - jsnfwlr
"Wechseln zu nginx mit php-fastcgi" --- Eine weniger drastische aber effektive Option, wenn Sie Apache2 behalten möchten, wäre: Apache2 + mod_proxy_fcgi + mod_mpm_event. mpm_event ist ähnlich wie nginx. Benutze das um dich mit php-fpm zu verbinden. Sehen dracony.org/stop-using-php-fpm-to-argue-using-nginx-vs-apache - James Johnston


ich fand Dieser Artikel beschreibt Low-Memory-Konfigurationen für Apache und MySQL

Dies ist sehr nützlich, um Konfigurationsänderungen für Konfigurationen mit wenig Speicher vorzunehmen. Ich habe sie für meine eigene Situation optimiert, aber sie sollten dir die Werkzeuge geben, die du brauchst, um die beste Lösung für deine Umgebung zu finden


6
2018-06-06 21:34





Sie müssen begrenzen, wie viele Apache-Server-Prozesse laufen, und da Sie so nahe am Limit sind, wie Sie sind, werden Sie nicht in der Lage sein, sehr viel Spitzenzeiten zu bewältigen. Einen Web-Server zu haben, der bei normalem Gebrauch ausgereizt ist, ist in der Regel eine schlechte Idee (tm), da der Web-Verkehr größtenteils nett und niedrig ist, bis man einen Schrägstrich bekommt oder gegraben oder mit dem Feuerball oder was auch immer.

Die Hauptprobleme sind die Anzahl der Apache-Prozesse, die an einem beliebigen Punkt ausgeführt werden - vorausgesetzt, ich verwende hier Prefork, da ich nur PHP-Anwendungen implementiert habe und PHP nicht threadsicher ist. Ich habe keine Erfahrung Dimensionierung der Worker MPM. Einige Elemente befinden sich im Arbeitsspeicher und einige Elemente befinden sich im Speicher des jeweiligen Prozesses.

Sie können den gesamten Speicherbedarf reduzieren, indem Sie freigegebene Module auslassen, die Sie nicht benötigen. Grundsätzlich wird Apache von den meisten Hosts konfiguriert, um fast alles unter der Sonne zu tun. Wenn du nicht mod_userdir verwendest, kommst du es aus deiner apache-Konfiguration heraus. Seien Sie vorsichtig, wie viel Sie entfernen, weil einige der Dinge, die Sie brauchen, oder ihre Abhängigkeiten nicht intuitiv sind! Alle Module sollten auf der Webseite von apache.org dokumentiert werden. Der pro Prozess-Footprint ist schwieriger kleiner zu werden; Die meisten Apache-Konfigurationen kommen heutzutage nur mit den vier wesentlichen Modulen, die kompiliert wurden. Über diese vier Module hinaus stammt der Großteil der Speicherauslastung entweder von Lecks oder Anwendungs-RAMs, die nicht effektiv gesammelt werden. Deshalb sollten Sie die Anzahl der Anfragen festlegen von jedem Prozess niedrig behandelt.

Sie Ja wirklich Ich möchte Ihre Speicherauslastung im RAM selbst behalten und nicht in den Tausch gehen. Swap bedeutet I / O. I / O ist langsam und wird Ihre CPU-Auslastung durch das Dach treiben, während Prozesse darauf warten, dass etwas aus dem Swap gemischt wird.


4
2018-06-06 21:15



Danke für den Rat Karl! Gibt es eine Möglichkeit zu verhindern, dass der Server den Swap verwendet? Weil ich nach der Verringerung der Speicherauslastung nicht mehr über mein RAM verfüge, aber es wird immer noch SWAP-Speicher verwendet. - lima
@fandelost Es ist nicht wirklich wichtig, dass Swap verwendet wird, es ist schlecht, wenn Dinge in Swaps ein- und ausgelagert werden. Ihr Betriebssystem könnte Anweisungen oder Daten von Prozessen austauschen, die nicht häufig ausgeführt werden, wenn es Zeit dafür gibt, weil es denkt (und oft Recht hat), dass diese Anweisungen und Daten dort besser sind. - Patrick James McDougle


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

Als nächstes sollten Sie Apache MaxClients basierend auf der Größe eines Prozesses und der Größe des Speichers, den Sie Apache geben möchten, konfigurieren. Dasselbe gilt für maximale Verbindungen auf MySQL (ich empfehle das ausgezeichnete MySQL Tuning Grundierung Skript.

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

Wenn Sie weiter gehen wollen, können Sie Apache + mod_php durch nginx + fcgi setup ersetzen, was wahrscheinlich zu einer weiteren Speicherreduktion führt.

Eine letzte Sache - Sie wollen wirklich nicht auf einem Webserver austauschen. Nur ein wenig, um die nicht benötigten Sachen zu entfernen, aber regelmäßig auf einem Webserver zu wechseln führt zu einer nicht reagierenden Website.


2
2018-06-06 14:05



Vielen Dank für Ihren Rat, yhager, ich versuche tuning-primer.sh, aber ich bekomme den folgenden Fehler: "Syntaxfehler in Zeile 94:` cnf_socket = $ 'unerwartet'. Irgendwelche Ideen? - lima
Könnte mit der Shell zusammenhängen. Da dieses Skript wahrscheinlich Linux-bezogen ist, versuchen Sie, die erste Zeile so zu ändern, dass sie statt auf / bin / sh auf bash zeigt. Ich hoffe, Sie können basish auf Solaris installieren, aber ich kann nicht anders ... - yhager


Da du dein Ziel bereits erreicht hast, hier ein paar Extras:

Da du alle unnötigen PHP-Module entfernt hast, könntest du das auch für Apache tun. Standardmäßig (abhängig von der Installation) lädt Apache ziemlich viele zusätzliche Module und die meisten von ihnen sind nicht wirklich erforderlich für den normalen täglichen Gebrauch. Zum Beispiel gibt es eine Reihe von Authentifizierungsmodulen, die immer geladen werden. Deflate ist normalerweise nicht erforderlich, es sei denn, Sie versuchen, die Bandbreitennutzung zu begrenzen. Autoindex und Status gehen auch in Frage.

Und ein anderer ist, dass Sie die Menge an verfügbarem Speicher für php in php.ini begrenzen können: memory_limit = xxxM


2
2018-06-07 16:43





Sie können natürlich die Anzahl der Prozesse begrenzen, die Apache abzweigen kann, dies würde jedoch nur als sudo-harte Grenze für Ihre Speicherauslastung funktionieren. Von einem niedrigeren Standpunkt aus können Sie verwenden Plimit um die für einen Prozess verfügbaren Ressourcen einzuschränken. Wende dies auf die Eltern- und Kindprozesse an, die ich glaube.

Aus Sicht der Webserver-Konfiguration kann es jedoch darauf ankommen, wie Ihr Code wirklich läuft! Aber bedenken Sie kleine Dinge wie die Verwendung von .htaccess-Dateien mehr Ressourcen verwenden als die Verwendung von zentralen Apache-Konfigurationsdateien (wie sie jedes Mal gelesen werden, wenn eine Anfrage eintrifft, was zu einem größeren Overhead führt), was in großen Webseiten eine Bedeutung hat.


0
2018-06-06 12:51





Eine Sache, die dem Speicherwachstum im Laufe der Zeit helfen könnte, ist, das httpd-Keepalive niedriger zu setzen, aber ich würde das sorgfältig testen, falls Ihre Anwendung längerlebige Prozesse benötigt.


0
2018-06-06 19:51