Apache子进程在分配大块后不释放内存

时间:2013-05-15 20:37:15

标签: python django apache memory wsgi

我在CentOS上使用WSGI运行Django 1.4。 Apache是​​prefork但未在守护进程模式下配置。启动了8个子进程。我执行了一个数据库查询,使其中一个子进程(服务请求的进程)的Resident Memory大小为555 MB(从100 MB)。在我的代码中,我使用pyodbc游标获取行。数据不会存储在任何地方,例如全局变量。

使用序列化数据将JSON响应发送回服务器。在这一点上,我希望Resident Memory回到100 MB,但它仍然是555 MB。
后续查询不会增加内存大小(它保持在555 MB) - 这使我假设这不是内存泄漏,但子进程根本不释放内存。

此外,使用Django嵌入式开发服务器的Windows上相同的步骤序列导致大小达到500 MB,但恢复到100 MB以下。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我建议你去看看:

并注意Apache中提到的MaxMemFree指令。

听起来你可能会返回一个非常大的响应作为一个字符串和你正在使用的任何Apache输出过滤器,这导致Apache在输出过滤器处理它时复制内存。如果您使用的是对MaxMemFree没有限制的Apache 2.2,那么会释放出Apache内存池的大小,而内存不会被回收。

如果响应的大小是问题,那么可能让JSON编码器在构造它时将其流式传输到文件中。然后重新传输文件内容。

如果内存使用量是由于要查询的数据库数据,那么您需要查看您的查询方式以及是否需要所有数据。