3

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

JSON 响应与序列化数据一起发送回服务器。此时,我预计驻留内存将回到 100 MB,但仍为 555 MB。
随后的查询不会增加内存大小(它保持在 555 MB) - 这让我假设这不是内存泄漏,但子进程根本没有释放内存。

此外,使用 Django 嵌入式开发服务器在 Windows 上执行相同的步骤顺序会导致大小变为 500 MB,但又恢复到 100 MB 以下。

有任何想法吗?

4

1 回答 1

2

我建议你去看:

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

听起来您可能会以一个字符串的形式返回一个非常大的响应,并且使用您使用的任何 Apache 输出过滤器,这会导致 Apache 在输出过滤器处理内存时复制内存。如果您使用的是 Apache 2.2,它对 MaxMemFree 没有限制,则可能会膨胀 Apache 内存池的大小,而内存不会被回收。

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

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

于 2013-05-15T23:51:47.270 回答