内存泄漏 - gunicorn + django + mysqldb

6 投票
1 回答
8315 浏览
提问于 2025-04-18 10:20

我在使用 gunicorn + django 1.5.1 + mysqldb 的时候遇到了内存泄漏的问题。

我开始用 gc 和 objgraph 来检查我的代码。

当 gunicorn 的工作进程内存超过 300MB 时,我收集了一些数据:

data['sum_leak'] = sum((getsizeof(o) for o in objgraph.get_leaking_objects()))  #2 mb
data['total_objects_length'] = sum((getsizeof(o) for o in gc.get_objects()))    #6 mb 

结果显示只有 2+6=8 MB,而 gunicorn 的工作进程却超过了 300 MB。

所以我觉得问题不在 Python 代码里,可能更深层次。

我现在使用的版本是:

gunicorn==0.17.2

mysqldb==1.2.4

我通过 pip install 更新到 19.0.0 和 1.2.5,但用 pip freeze 查看时却显示的是旧版本,而 gunicorn -v 和 mysqldb.version_info 却显示的是最新的。

所以我在想,怎么才能彻底重新安装 gunicorn 和 mysqldb,以确保完全移除旧版本(可能是一些旧的残留导致了问题)?

此外,我还用 pmap 获取了一些信息:

pmap -x 805
805:   /usr/bin/python /usr/local/bin/gunicorn engine.wsgi:application -b 127.0.0.1:9005 --workers=2
Address   Kbytes     RSS   Dirty Mode   Mapping
08048000       0    1444       0 r-x--  python2.7
0829e000       0       4       4 r----  python2.7
0829f000       0     204     120 rw---  python2.7
082f4000       0      44      44 rw---    [ anon ]
09947000       0    3360    3360 rw---    [ anon ]
09c91000       0  253204  253204 rw---    [ anon ]
b5500000       0       4       4 rw---    [ anon ]
b5521000       0       0       0 -----    [ anon ]
b56d5000       0       0       0 -----    [ anon ]
b56d6000       0    1552    1552 rw---    [ anon ]
b6257000       0      12       0 r-x--  libpcre.so.3.12.1

看起来泄漏发生在这里 - 09c91000 0 253204 253204 rw--- [ anon ]

但我不知道该怎么处理这个。

需要一些帮助,看看有什么方法可以修复这个内存泄漏?

1 个回答

15

如果你觉得问题是由gunicorn的工作进程引起的,有一个简单的方法可以验证这个想法:

启动工作进程时加上参数 --max-requests *某个正数*

这样做会让gunicorn在处理完指定数量的请求后,自动重启每个工作进程。

官方文档中,他们提到:这是一种简单的方法,可以帮助限制内存泄漏带来的影响。

撰写回答