【问题标题】:Memory consumption in CherrypyCherrypy 中的内存消耗
【发布时间】:2010-09-17 16:42:30
【问题描述】:

我在 RESTful Web 服务中使用 Cherrypy,结果服务器返回 XML(lxml 用于创建 XML)。其中一些 XML 非常大。我注意到在处理了此类请求(返回大型 XML)后,内存没有被释放。

所以,我已经隔离了一个问题并创建了这个非常短的虚拟示例:

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,即没有使用额外的内存。但是,如果传递不同的参数,服务器会不断消耗越来越多的内存。释放内存的唯一方法是重新启动服务器。

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

【问题讨论】:

  • 我正在使用 Ubuntu。我渴望释放内存的原因是数据库远远超过 100GB。随着服务器越来越多地运行,有更多不同的请求导致使用更多内存。我担心的是当这种内存消耗接近内存的物理大小时会发生什么?当新请求到来时,Python 会知道如何重用它当前持有的内存(但没有被使用)吗?我想是的,但只是想检查一下。另外,如果还有其他进程需要内存怎么办?他们将使用什么内存?

标签: python memory lxml cherrypy consumption


【解决方案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? 有一个类似的 SO 问题,答案很好

【讨论】:

  • 我明白了。非常感谢您的回答。当内存消耗接近物理内存限制并且有新请求进来时会发生什么? Python 会知道如何重用进程持有但未使用的内存吗?其他需要内存的进程会发生什么?我应该考虑在这里使用进程而不是线程吗?随着时间的推移,该服务器将占用越来越多的内存(因为会出现不同的请求)。有没有哪一刻 Python 会开始重用这个占用的(但未使用的内存),或者它只会运行我们的内存并开始使用交换?
  • 是的,Python 将重用内存。其他需要内存的进程将争夺它,通常由操作系统调节。在 Linux 操作系统中寻找“OOM 杀手”。线程是一种共享设备,因此与进程相比减少内存消耗。最后,是的,swap 一直在使用。阅读您的操作系统文档。
猜你喜欢
  • 2010-10-12
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 2010-10-27
  • 2011-12-13
  • 2011-10-03
  • 2012-11-24
  • 2013-10-08
相关资源
最近更新 更多