Python cherrypy/apache服务器在函数调用结束后未释放内存
我试着用cherrypy检测记忆问题已经有一段时间了。对函数的任何web调用都会使用内存,当我运行此命令时:Python cherrypy/apache服务器在函数调用结束后未释放内存,python,apache,memory,cherrypy,Python,Apache,Memory,Cherrypy,我试着用cherrypy检测记忆问题已经有一段时间了。对函数的任何web调用都会使用内存,当我运行此命令时: ps -u djotjog -o pid,rss,command | awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}' 似乎永远都用光了。在退出之前,我尝试“删除”函数中的每个对象。没有效果。我想知道我的类实例(它存储了大量数据)是否可能是问题所在。我用的是: class Data: pass ref_d
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
最后,我看到每次运行web调用时仍使用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占用了这么多内存,我怎么能相信它会响应多个请求呢?我已经看到它忽略了一些请求
- 这是服务器配置问题吗
如果是,我如何在共享托管站点上配置该解决方案?从您展示的示例代码中,可以收集的信息很少。特别是:
ref_data.stories = stories_dict
这使得ref_data.stories和stories_dict都引用相同的大型数据集。即使您删除了stories_dict,由于ref_data.stories仍然是对该dict的引用,因此在删除ref_data.stories(或删除ref_数据)之前,它不会被垃圾收集:
否则,当删除stories_dict时,只剩下指向该字典的指针(可能只有几个字节)被垃圾收集
python的垃圾收集器应该以多快的速度工作
我不确定是否有保证,但根据我的经验,当任何对象del
ed或函数退出时,垃圾收集器会立即运行
cherrypy或apache是否做了一些奇怪的事情来保持数据的持久性
我想不是。如果您直接从解释器运行相同的例程,您没有看到这种行为吗
如果cherrypy占用了这么多内存,我怎么能相信它会响应多个请求呢?我已经看到它忽略了一些请求。
这是服务器配置问题吗
如果并行处理请求时,应用程序使用的内存基本上超过了系统可用的内存,则需要找到一些方法来同步请求之间的响应。另一个选项是将apache/cherrypy配置为一次只服务一个请求。我相信这是WSGI配置的一部分(分配多少进程/线程)。如果将进程/线程数限制为1,则CherryPy一次只提供一个请求。来自服务器bash命令行-运行python[filename].py时,没有任何内容会持续存在。。。删除ref_数据对持久性内存使用没有任何影响。我已经将内存问题缩小到涉及mysqldb的部分,并在这里发布了一个更简洁的描述:是否有一种系统的方法可以在程序结束时查看内存中所有数据对象的列表,以及它们的大小,这样我就可以找到持久数据使用的来源了?有些东西留在记忆中可能是因为cherrypy留在了记忆中。
del ref_data.stories # remove the attribute
del ref_data # delete the instance and all of its attributes