0

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

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响应多个请求?我已经看到它忽略了一些请求。
  • 这是服务器配置问题吗?

这是同一个问题吗? linux上的python cherrypy应用程序未释放内存

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

4

1 回答 1

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 一次只会处理一个请求。

于 2012-11-22T02:01:35.313 回答