cherrypy / apache服务器在函数调用结束后不释放内存

时间:2012-11-22 01:08:39

标签: python apache memory cherrypy

我已经尝试了一段时间来检测cherrypy的内存问题。对函数的任何Web调用都使用当我运行此命令时的内存:

ps -u djotjog -o pid,rss,command | awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'

似乎永远用完了。在退出之前,我试图'del'函数中的每个对象。没有效果。我想知道我的类实例,它存储了大量数据 - 可能是问题所在。我用的是:

class Data:
    pass
ref_data = Data() 

... do stuff... make a stories_dict ...

ref_data.stories = stories_dict #dictionary 'id':'story' pairs
del stories_dict

最后,我看到每次运行网络电话时仍然使用350MB,在达到500MB之后,它似乎产生了另一个樱桃实例!

  PID   RSS COMMAND
10492   960 ps -u globamh1 -o pid,rss,command
10493   784 awk {print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}
29833  1708 -bash
Total 3.37109 MB

后...

  PID   RSS COMMAND
12811  1164 /bin/sh cherryd.fcgi
12817 293788 /home4/globamh1/python-2.7.2/bin/python2.7     /home4/globamh1/.local/bin/cherryd -P modules -c cherryd.conf -f -i app
13195   984 ps -u globamh1 -o pid,rss,command
13196    16 awk {print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}
29833  1708 -bash
Total 308 MB

后来还是......

  PID   RSS COMMAND
 4053  5216 /home/globamh1/python-2.7.2/bin/python /home/globamh1/python-    2.7.2/ngo_prompter_2.py
 4091   988 ps -u globamh1 -o pid,rss,command
 4092   784 awk {print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}
12817 1111616 /home4/globamh1/python-2.7.2/bin/python2.7    /home4/globamh1/.local/bin/cherryd -P modules -c cherryd.conf -f -i app
29833  1716 -bash
32413  1168 /bin/sh cherryd.fcgi
32414 576792 /home4/globamh1/python-2.7.2/bin/python2.7 /home4/globamh1/.local/bin/cherryd -P modules -c cherryd.conf -f -i app
Total 1658.48 MB

所以将其包含在一些具体问题中:

  • python的垃圾收集器应该多快工作?
  • cherpy或apache做了一些奇怪的事情来保持数据的持久性吗?
  • 如果使用如此多的内存,我怎么能相信cherrypy会响应多个请求?我已经看到它忽略了一些请求。
  • 这是服务器配置问题吗?

这是同样的问题吗? Memory not released by python cherrypy application on linux

如果是,我如何在共享主机站点上配置该解决方案?

1 个答案:

答案 0 :(得分:1)

根据您显示的示例代码,收集的内容很少。特别是:

ref_data.stories = stories_dict

这使得ref_data.stories和stories_dict都引用相同的大型数据集。即使你删除了stories_dict,因为ref_data.stories仍然是对同一个dict的引用,所以在删除ref_data.stories(或者删除ref_data)之前,它不会被垃圾收集:

del ref_data.stories # remove the attribute
del ref_data # delete the instance and all of its attributes

否则,删除stories_dict时唯一剩下的垃圾收集是指向该字典的指针(可能只有几个字节)。

  

python的垃圾收集器有多快工作?

我不确定是否有保证,但根据我的经验,当任何对象del或函数退出时,垃圾收集器会立即运行。

  

cherrypy或apache做了一些奇怪的事情来保持数据的持久性吗?

我怀疑没有。如果直接从解释器运行相同的例程,您是否看不到这种行为?

  

如果使用如此多的内存,我怎么能信任cherrypy响应多个请求?我已经看到它忽略了一些请求。   这是服务器配置问题吗?

如果您的应用程序从根本上使用的内存比系统可用的内存多,如果并行处理请求,您将需要找到一些方法来跨请求同步响应。另一种选择是将apache / cherrypy配置为一次只提供一个请求。我相信这是WSGI配置的一部分(要分配多少进程/线程)。如果将进程/线程数限制为1,那么CherryPy一次只能处理一个请求。