Domanda

Ho un VPS con non molto di memoria (256 MB), che sto cercando di utilizzare per lo sviluppo di Common Lisp con SBCL + Hunchentoot di scrivere alcune semplici web-apps. Una grande quantità di memoria sembra essere abituando senza fare nulla di particolarmente complesso, e dopo un po 'di servire le pagine si esaurisce la memoria e sia impazzisce utilizzando tutti di swap o (se non v'è alcuna swap) muore solo.

Quindi ho bisogno di aiuto per:

  • Scopri cosa sta usando tutta la memoria (se si tratta di librerie o di me, soprattutto)
  • Limitare la quantità di memoria che SBCL è autorizzato ad utilizzare, per evitare massicce quantità di scambiare
  • gestire le cose in modo pulito quando la memoria si esaurisce, piuttosto che schiantarsi (in quanto si tratta di una web-app lo voglio per portare avanti e cercare di ripulire).

Suppongo che i primi due sono abbastanza semplice, ma è il terzo anche possibile? Come fanno le persone gestiscono out-of-memoria o di memoria vincolata condizioni in Lisp?

(Inoltre, faccio notare che a 64-bit SBCL sembra utilizzare letteralmente il doppio di memoria a 32-bit. E 'questo previsto? Posso eseguire una versione a 32 bit se si farà risparmiare un sacco di memoria)

È stato utile?

Soluzione

Per limitare l'utilizzo della memoria SBCL, utilizzare l'opzione --dynamic-spazio-dimensioni (ad esempio, sbcl --dynamic-space-size 128 limiterà l'utilizzo della memoria di 128M).

Per scoprire chi sta usando la memoria, si può chiamare (room) (la funzione che indica la quantità di memoria utilizzata) in momenti diversi: in fase di avvio, dopo tutte le librerie vengono caricate e poi durante il lavoro (di cource, chiamano (sb-ext:gc :full t) prima camera non per misurare la spazzatura che non è stato ancora raccolto).

Inoltre, è possibile utilizzare SBCL Profiler per misurare allocazione di memoria.

Altri suggerimenti

  

Scopri cosa sta usando tutta la memoria   (Se si tratta di biblioteche o me, soprattutto)

Attila Lendvai ha qualche codice specifico SBCL per scoprire dove un oggetti assegnati proviene. Fare riferimento a http://article.gmane.org/gmane.lisp. acciaio bank.devel / 12903 e lo scrivere una mail privata, se necessario.

Sia sicuro provare un'altra implementazione, preferibilmente con un preciso GC (come Clozure CL) per assicurare che non è una perdita di attuazione specifiche.

  

Limitare la quantità di memoria che SBCL   è consentito l'uso, per evitare di massiccia   quantità di scambio

già risposto da altri.

  

gestire le cose in modo pulito quando la memoria corre   fuori, piuttosto che schiantarsi (dal momento che è   una web-app lo voglio per portare avanti e   provare a pulire).

256 MB è stretto, ma in ogni caso: pianificare una ricorrente (forse 1s) filo temporizzato che controlla lo spazio libero rimanente. Se lo spazio libero è inferiore a X quindi utilizzare exec () per sostituire l'immagine di processo SBCL corrente con uno nuovo.

Se non si dispone di dichiarazioni di tipo, mi aspetterei a 64 bit Lisp per prendere due volte lo spazio di una a 32 bit uno. Anche un semplice (piccola) int userà un 64 bit pezzo di memoria. Io non credo che userà meno di una parola della macchina, a meno che non si dichiara.

Non posso fare con la # 2 e # 3, ma se a capire 1 #, ho il sospetto che non sarà un problema. Ho visto casi SBCL / Hunchentoot in esecuzione per le età. Se sto usando una quantità oltraggiosa della memoria, di solito è colpa mia. : -)

Non sarei sorpreso da un 64-bit SBCL utilizzando il doppio della meory, come sarà probabilmente usare una cella a 64 bit invece che a 32 bit, ma non saprei dire con certezza, senza in realtà il controllo.

le cose tipiche che conservano la memoria in giro per più tempo del previsto sono riferimenti non-più-utili che hanno ancora un percorso per il set di allocazione radice (tabelle hash sono, trovo, un buon modo di lasciare queste cose indugiare). Si potrebbe provare inframmezzando chiamate esplicite per GC nel codice e fare in modo di (per quanto possibile) Non conservare le cose in variabili globali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top