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 :)
Antworten:
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:
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
KeepAliveTimeout
einen 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-innodb
zu 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:
quelle
Got rid of the wildcard used in VirtualHost entries
Hilft das tatsächlich in irgendeiner sinnvollen Weise? Ich hatte den Eindruck, dass das keinen Unterschied machen würde.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
quelle
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.
quelle
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.
quelle
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
quelle
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.
quelle
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.
quelle
Ich habe keine Erfahrung mit Solaris, aber das Beste, was Sie tun können, ist, Apache / mod_php nicht zu verwenden.
quelle