Pregunta

Tengo un VPS con no mucho de memoria (256 MB), que estoy tratando de utilizar para el desarrollo de Common Lisp con SBCL + Hunchentoot escribir algunas sencillas aplicaciones web. Una gran cantidad de memoria parece estar acostumbrarse sin hacer nada particularmente complejo, y después de un tiempo de servir páginas que se queda sin memoria y, o bien se vuelve loco utilizar todas permuta o (si no hay intercambio) simplemente muere.

Así que necesito ayuda para:

  • Para saber qué está usando toda la memoria (si se trata de bibliotecas o de mí, sobre todo)
  • Limite la cantidad de memoria que se permite SBCL de usar, para evitar grandes cantidades de intercambiar
  • manejar las cosas limpiamente cuando se agota la memoria, en lugar de estrellarse (ya que es una aplicación web que yo quiero que continuar y tratar de limpiar).

Asumo que los dos primeros son bastante sencillo, pero es la tercera posible? ¿Cómo se manejan fuera de memoria o de memoria limitada condiciones en Lisp?

(Además, observo que una de 64 bits SBCL parece utilizar, literalmente, el doble de memoria como de 32 bits. Se esperaba esto? Puedo ejecutar una versión de 32 bits si va a ahorrar una gran cantidad de memoria)

¿Fue útil?

Solución

Para limitar el uso de la memoria de SBCL, utilizar la opción-espacio-tamaño --dynamic (por ejemplo, sbcl --dynamic-space-size 128 limitará el uso de memoria a 128M).

Para saber quién está utilizando la memoria, puede llamar (room) (la función que indica la cantidad de memoria se utiliza) en diferentes momentos: al inicio, después de todas las bibliotecas se cargan y luego durante el trabajo (de cource, llaman (sb-ext:gc :full t) antes habitación no para medir la basura que aún no se ha recogido).

Además, es posible utilizar SBCL Profiler para medir la asignación de memoria.

Otros consejos

  

Para saber qué está usando toda la memoria   (Si se trata de bibliotecas o de mí, sobre todo)

Attila Lendvai tiene algún código-SBCL específica para averiguar dónde un objetos asignados viene. Consulte el http://article.gmane.org/gmane.lisp. acero bank.devel / 12903 y le escribir un mail privado si es necesario.

No deje de probar otra aplicación, preferiblemente con un GC precisa (como Clozure CL) para asegurarse de que no es una fuga de aplicación específica.

  

Limite la cantidad de memoria que SBCL   se permite el uso, para evitar masiva   cantidades de intercambiar

Ya respondida por otros.

  

manejar las cosas limpiamente cuando se ejecuta la memoria   fuera, en lugar de estrellarse (ya que es   una aplicación Web que yo quiero que continuar y   tratar de limpiar).

256 es apretado, pero de todos modos: programar una (tal vez 1s) hilo recurrentes temporizada que comprueba el espacio libre restante. Si el espacio libre es inferior a X a continuación, utilizar exec () para reemplazar la imagen de proceso SBCL actual por uno nuevo.

Si usted no tiene ningún tipo de declaraciones, que se puede esperar de 64 bits Lisp para tomar el doble de espacio de un 32-bits. Incluso una (pequeña) int llanura utilizará un trozo de 64 bits de memoria. No creo que va a utilizar menos de una palabra máquina, a menos que se declara.

No puedo ayudar con el # 2 y # 3, pero si a averiguar # 1, sospecho que no será un problema. He visto casos SBCL / Hunchentoot funcionamiento de las edades. Si estoy usando una cantidad enorme de memoria, por lo general es mi culpa. : -)

No estaría sorprendido por una de 64 bits SBCL usando el doble de la meory, ya que probablemente utilizará una célula de 64 bits en lugar de 32 bits, pero no podía decir con seguridad sin tener que comprobar.

Las cosas típicas que mantienen la memoria dando vueltas durante más tiempo de lo esperado son referencias ya no tan útiles que todavía tienen un camino para el conjunto de asignación de raíz (tablas hash son, me parece, una buena manera de dejar que estas cosas persisten). Usted podría intentar intercalando llamadas explícitas a GC en el código y asegurarse de que (en lo posible) no almacenar las cosas en las variables globales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top