2010-09-17 132 views
5

我在REST风格的Web服务中使用Cherrypy,服务器因此返回XML(使用lxml创建XML)。其中一些XML非常大。我注意到,在处理完这种请求(返回大的XML)后,内存不会被释放。Cherrypy中的内存消耗

所以,我已经分离的问题,并创造了这个一个很短假例如:

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()) 

请求后已经取得了:http://localhost:8080/index,内存消耗从830MB变为1.2GB。然后,在请求处理完成后,它将降低到1.1GB,并保持在那里直到服务器关闭。服务器关闭后,内存消耗降至830MB。

在我的项目中,数据(当然)来自数据库,并且正在使用参数来指定应该检索哪些数据。如果有相同的请求(具有相同的参数),则内存保持在1.1GB,即不使用额外的内存。但是,如果传递不同的参数,服务器会消耗越来越多的内存。释放内存的唯一方法是重新启动服务器。

您对这种情况发生的原因以及如何解决它有什么想法吗?谢谢。

+0

一个伟大的答案的问题吗? – unutbu 2010-09-17 17:06:57

+0

我正在使用Ubuntu。我急于释放内存的原因是数据库超过100GB。随着服务器越来越多地运行,有更多不同的请求导致使用更多的内存。我的担心是当内存消耗接近物理内存大小时会发生什么?当新的请求到来时,Python是否会知道如何重用当前存储的内存(但哪些内存没有被使用)?我想是的,但只是想检查。另外,如果还有其他需要内存的进程呢?他们将使用什么内存? – kevin 2010-09-17 22:09:12

回答

1

这是一个通用的Python问题,本身并不是一个CherryPy。 effbot具有http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm

一个伟大的回答这个问题,有一个相似的,所以跟你使用的是什么操作系统在How can I explicitly free memory in Python?

+0

我明白了。非常感谢答案。内存消耗接近物理内存限制并出现新请求时会发生什么情况? Python会知道如何重用进程持有但不使用的内存?其他需要内存的进程会发生什么?我应该考虑在这里使用进程而不是线程吗?随着时间的推移,这台服务器将占用越来越多的内存(因为不同的请求会来)。有没有什么时候Python会开始重用这个占用的内存(但没有使用内存),或者它只会运行我们的内存并开始使用交换? – kevin 2010-09-17 22:22:16

+1

是的,Python会重用内存。其他需要内存的进程通常会与操作系统进行竞争。在Linux操作系统中寻找“OOM杀手”。线程是共享的设备,因此与进程相比*减少*内存消耗。最后,是的,swap一直在使用。阅读你的操作系统文档。 – fumanchu 2010-10-04 16:17:32