我的 gunicorn + django 1.5.1 + mysqldb 存在内存泄漏。 我开始使用 gc 和 objgraph 探索我的代码
当 gunicorn worker 超过 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 worker 超过 300 mb。
所以我认为问题不在 python 代码中,它更深。
我有: 枪炮==0.17.2 mysqldb==1.2.4
我通过 pip install 将 whem 更新到 19.0.0 和 1.2.5 但是 pip frreze 显示旧版本,而 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--- [匿名]
但我不知道该怎么办。
需要解决此漏洞的一些方法吗?
请您参考如下方法:
如果您认为问题是由 gunicorn workers 引起的,那么有一种简单的方法可以检验该假设:
使用参数--max-requests *some positive number*启动worker
这将使 gunicorn 在满足指定数量的请求后重新启动每个 worker。
在documentation他们说:这是一种有助于限制内存泄漏损害的简单方法。
