2012-11-22 41 views
0

我尝试了一段时间来检测cherrypy的内存问题。任何网页调用功能使用的内存,当我运行这个命令:cherrypy/apache服务器在函数调用结束后不释放内存

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

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

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后,它似乎产生另一个CherryPy的实例!

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的垃圾收集器工作?
  • cherrypy或apache做些奇怪的事情来保持数据的持久性?
  • 如何使用cherrypy来响应多个请求?我已经看到它忽略了一些请求。
  • 这是服务器配置问题吗?

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

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

回答

1

从您显示的示例代码中,很少收集到。特别是:

ref_data.stories = stories_dict 

这使得ref_data.stories和stories_dict都引用相同的大数据集。即使你删除stories_dict,因为ref_data.stories仍然是相同的字典的参考,它不会被垃圾收集,直到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 ed或函数退出时立即运行垃圾收集器。

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

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

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

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

+0

从服务器bash命令行 - 运行python [filename] .py时没有任何内容持续存在...删除ref_data对持久内存使用情况没有任何影响。 –

+0

我将内存问题缩小到涉及mysqldb的内容 - 并在此处发布了更简洁的说明:http://stackoverflow.com/questions/13612050/mysqldb-usage-in-cherrpy-app-leads-to-massive-服务器上的持久性内存使用情况 –

+0

有没有一种系统的方式来查看程序结束时内存中所有数据对象的列表及其大小,以便我可以找出持久数据使用的来源?可能是因为cherrypy停留在内存中而留在内存中。 –

相关问题