2010-09-17 27 views
5

Estoy usando Cherrypy en un servicio web RESTful y el servidor devuelve XML como resultado (lxml se usa para crear XML). Algunos de esos XML son bastante grandes. Me di cuenta de que la memoria no se está liberando después de que se haya procesado dicha solicitud (que devuelve XML grande).Consumo de memoria en Cherrypy

lo tanto, he aislado un problema y ha creado este un ejemplo ficticio muy corto:

import cherrypy 
from lxml import etree 

class Server: 
    @cherrypy.expose 
    def index(self): 
     foo = etree.Element('foo') 
     for i in range(200000): 
      bar = etree.SubElement(foo, 'bar') 
      bar1 = etree.SubElement(bar, 'bar1') 
      bar1.text = "this is bar1 text ({0})".format(i) 
      bar2 = etree.SubElement(bar, 'bar2') 
      bar2.text = "this is bar2 text ({0})".format(i) 
      bar3 = etree.SubElement(bar, 'bar3') 
      bar3.text = "this is bar3 text ({0})".format(i) 
      bar4 = etree.SubElement(bar, 'bar4') 
      bar4.text = "this is bar4 text ({0})".format(i) 
      bar5 = etree.SubElement(bar, 'bar5') 
      bar5.text = "this is bar5 text ({0})".format(i) 

     return etree.tostring(foo, pretty_print=True) 

if __name__ == '__main__': 
    cherrypy.quickstart(Server()) 

Después solicitud ha sido hecha a: http://localhost:8080/index, el consumo de memoria va desde 830MB a 1.2GB. Luego, una vez procesada la solicitud, baja a 1.1GB y permanece allí hasta que el servidor se apaga. Después de que el servidor se apaga, el consumo de memoria disminuye a 830 MB.

En mi proyecto, los datos (por supuesto) provienen de la base de datos, y los parámetros se utilizan para especificar qué datos se deben recuperar. Si se realiza la misma solicitud (con los mismos parámetros), la memoria permanece en 1,1 GB, es decir, no se está utilizando memoria adicional. Pero, si se pasan diferentes parámetros, el servidor sigue consumiendo más y más memoria. La única forma de liberar la memoria es reiniciar el servidor.

¿Tiene alguna idea sobre por qué sucede esto y cómo resolverlo? Gracias.

+0

¿Qué sistema operativo está utilizando? – unutbu

+0

Estoy usando Ubuntu. La razón por la que estaba ansioso por que se liberara la memoria es porque la base de datos supera los 100 GB. A medida que el servidor se ejecuta cada vez más, hay más solicitudes diferentes que resultan con más memoria en uso. Mi preocupación era ¿qué sucederá cuando este consumo de memoria se acerque al tamaño físico de la memoria? ¿Sabrá Python cómo reutilizar la memoria que está reteniendo actualmente (pero que no se está utilizando) cuando lleguen nuevas solicitudes? Supongo que sí, pero solo quería comprobar. Además, ¿qué pasa si hay otros procesos que están en demanda de memoria? ¿Qué memoria usarán? – kevin

Respuesta

1

Este es un problema genérico de Python, no realmente un CherryPy uno per se. effbot tiene una gran respuesta a esta cuestión en http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm

Y hay una cuestión de forma parecida con una gran respuesta al How can I explicitly free memory in Python?

+0

Ya veo. Muchas gracias por la respuesta. ¿Qué ocurre cuando el consumo de memoria se acerca al límite de la memoria física y aparece una nueva solicitud? ¿Sabrá Python cómo reutilizar la memoria que el proceso está reteniendo pero no está usando? ¿Qué pasará con otros procesos que están en demanda de memoria? ¿Debería considerar usar procesos en lugar de hilos aquí? Con el tiempo, este servidor ocupará más y más memoria (ya que vendrán solicitudes diferentes). ¿Hay algún momento en que Python comience a reutilizar esta memoria ocupada (pero no utilizada) o simplemente ejecutará nuestra memoria y comenzará a usar swap? – kevin

+1

Sí, Python reutilizará la memoria. Otros procesos que exigen memoria competirán por él, moderados por el sistema operativo generalmente. Busque el "OOM killer" en el sistema operativo Linux. Los subprocesos son un dispositivo para compartir y, por lo tanto, * reducir * el consumo de memoria en comparación con los procesos. Y finalmente, sí, el intercambio se usa todo el tiempo. Lee tus documentos del SO. – fumanchu

Cuestiones relacionadas