我的一个Python脚本存在轻微问题。它消耗了大量的驻留内存。这是一个240行的简单脚本。它将自己设置为RabbitMQ侦听器(pika),侦听请求以及何时接收它们,从数据库(SQLALchemy,psycopg2)查询数据并将其作为对Rabbit消息的响应进行未处理。它没有线程或任何其他噱头。
在相同的环境中,我运行了几个非常相似的脚本。我有另一个完全相同,它只返回一些不同的数据(并且是多线程的,它提供两个Rabbit连接,并通过第二个连接提供数据库写入功能)。
我的问题脚本是700-800 mb,大部分是驻留的,而运行良好的多线程脚本是300mb,有40mb驻留组件。在同一环境中运行的其他人通常为300mb / 20-40mb。
我在resouce,objgraph和pympler中添加了一些调试功能。它似乎根本没有增长,所以它似乎没有泄漏内存,在我看来,这些调试信息都没有增加到运行程序的巨大规模。
Memory usage 784160
function 12439 +12439
tuple 5044 +5044
dict 4723 +4723
weakref 3057 +3057
list 2209 +2209
type 1605 +1605
wrapper_descriptor 1413 +1413
getset_descriptor 1329 +1329
builtin_function_or_method 1086 +1086
set 844 +844
types | # objects | total size
=============================================== | =========== | ============
dict | 4723 | 4.76 MB
str | 25520 | 3.32 MB
code | 11511 | 1.41 MB
type | 1547 | 1.35 MB
unicode | 716 | 682.61 KB
tuple | 5044 | 387.59 KB
weakref | 3058 | 262.80 KB
list | 2209 | 252.50 KB
set | 844 | 237.47 KB
<class 'sqlalchemy.sql.visitors.VisitableType | 239 | 211.07 KB
collections.deque | 208 | 126.75 KB
wrapper_descriptor | 1418 | 110.78 KB
function (__init__) | 866 | 101.48 KB
getset_descriptor | 1332 | 93.66 KB
builtin_function_or_method | 1086 | 76.36 KB
我的问题是,这些数字看起来是否正常?如果他们这样做,我应该在哪里看下一个?当然我可以只为虚拟机添加内存,但由于所有其他脚本都运行得很好,具有相同的依赖关系(pika和sqlalchemy),我只是好奇它们中最简单的一个出了什么问题。
我下一步该去哪儿?主机是Ubuntu 16.04,带有Python 2.7.12。