Frage

Ich habe einen VPS mit nicht sehr viel Speicher (256 MB), die ich für Common Lisp Entwicklung mit SBCL + Hunchentoot zu verwenden, ich versuche ein paar einfache Web-Anwendungen zu schreiben. Eine große Menge an Speicher erscheint, ohne etwas zu tun, besonders komplex, und nach einer Weile dienen Seiten läuft der Speicher immer verwendet zu werden und geht entweder verrückt alle Swap verwenden oder (falls es keine Swap) nur stirbt.

Also ich brauche Hilfe zu:

  • Finden Sie heraus, was den gesamten Speicher verwendet (wenn es Bibliotheken oder mich, vor allem)
  • Begrenzen Sie die Menge an Speicher, die SBCL verwenden darf, um zu verhindern massiven Mengen von Swapping
  • Griff Dinge sauber, wenn der Speicher abläuft, anstatt Absturz (da es eine web-app ich es weitermachen will, und versuchen zu bereinigen).

gehe ich davon aus der ersten beiden relativ einfach sind, aber es ist die dritte überhaupt möglich? Wie gehen die Menschen behandeln out-of-memory oder eingeschränkte Speicherbedingungen in Lisp?

(Beachten Sie auch, ich, dass ein 64-Bit-SBCL buchstäblich doppelt so viel Speicher wie 32-Bit zu verwenden, wird angezeigt. Ist das zu erwarten? Ich kann eine 32-Bit-Version ausgeführt werden, wenn es eine Menge Speicher sparen)

War es hilfreich?

Lösung

Um die Speichernutzung von SBCL zu begrenzen, verwendet --dynamic-Raum-size Option (zum Beispiel sbcl --dynamic-space-size 128 wird die Speichernutzung zu 128M begrenzen).

Um herauszufinden, wer Speicher verwendet wird, können Sie (room) (die Funktion, wie viel Speicher erzählt verwendet wird) rufen zu unterschiedlichen Zeiten: beim Start, nachdem alle Bibliotheken geladen und dann während der Arbeit (von cource, rufen (sb-ext:gc :full t) vor Zimmer nicht den Müll zu messen, die noch nicht gesammelt hat).

Auch ist es möglich, SBCL Profiler zu verwenden Speicherzuweisung zu messen.

Andere Tipps

  

Finden Sie heraus, was den gesamten Speicher verwendet   (Wenn es Bibliotheken oder mich, vor allem)

Attila Lendvai hat einige SBCL spezifischen Code, um herauszufinden, wo eine zugewiesene Objekte herkommt. Siehe http://article.gmane.org/gmane.lisp. Stahl-bank.devel / 12903 und schreibt ihm eine private Mail, wenn nötig.

Achten Sie darauf, eine weitere Implementierung versuchen, vorzugsweise mit einem präzisen GC (wie Clozure CL) es ist nicht eine Implementierung spezifische Leck zu gewährleisten.

  

Begrenzen Sie die Menge an Speicher, SBCL   verwenden darf, massiv zu vermeiden   Mengen Swapping

Bereits von anderen beantwortet.

  

Griff Dinge sauber, wenn der Speicher läuft   aus, anstatt Absturz (da es   ein web-app ich es weitermachen will und   versuchen aufzuräumen).

256 MB sind eng, aber trotzdem: planen Sie einen wiederkehrenden (vielleicht 1s) timed Thread, den verbleibenden freien Speicherplatz überprüft. Wenn der freie Speicherplatz kleiner als X dann exec () verwendet, das aktuelle SBCL Prozessabbild durch einen neuen ersetzen.

Wenn Sie keine Typdeklarationen haben, würde ich erwarten, dass 64-Bit-Lisp eine zweimal den Raum eines 32-Bit zu nehmen. Selbst eine Ebene (small) int wird einen 64-Bit-Teil des Speichers verwenden. Ich glaube nicht, dass weniger als ein Maschinenwort verwenden werden, wenn Sie es erklären.

Ich kann nicht mit # 2 und # 3, helfe aber, wenn Sie # 1 herauszufinden, ich vermute, es wird kein Problem sein. Ich habe SBCL / Hunchentoot Instanzen für Alter laufen gesehen. Wenn ich eine unerhörte Menge an Speicher bin mit, dann ist es in der Regel meine eigene Schuld. : -)

Ich würde nicht von einem 64-Bit-SBCL überrascht sein, doppelt so meory verwenden, da es wahrscheinlich eine 64-Bit-Zelle anstelle einer 32-Bit ein, konnte aber nicht mit Sicherheit sagen, ohne tatsächlich die Überprüfung verwendet wird.

Typische Dinge, die Erinnerung behalten hängen als um für mehr zu erwarten sind nichtmehr-nützliche Hinweise, die noch einen Pfad zur Stammzuweisung festgelegt haben (Hash-Tabellen sind, finde ich, ein guter Weg, diese Dinge zu lassen verweilen). Sie könnten versuchen, explizit Anrufe interspersing in Ihrem Code GC und stellen Sie sicher, (soweit möglich) nicht speichern Dinge in globalen Variablen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top