Python 的 gc 在没有显式调用 gc.disable() 的情况下被禁用

Python's gc is disabled without explict calling gc.disable()

我们观察到长时间 运行 Python 2.7.5 进程泄漏内存。我尝试使用 gdb 将一些代码注入到进程中,以查看内部发生了什么。 gdb 命令如下所示:

gdb -p $pid -batch -eval-command='call PyGILState_Ensure()' -eval-command='call PyRun_SimpleString("exec(open(\"/path/to/code\").read())")' -eval-command='call PyGILState_Release()'

我将 gc.get_objects() 信息打印到一个文件中并拍了 2 张快照,但没有发现明显的对象大小增加。但是在注入代码中调用 gc.collect() 之后,观察到显着的内存减少。所以我尝试打印以下 return 值:

gc.isenabled()
gc.get_count()
gc.get_threshold()

这给了我:

False
(56107, 0, 0)
(700, 10, 10)

这显然表明 gc 已被禁用,但我确信我们的代码中没有明确地这样做。同样的代码在数百台服务器上 运行 但只有一台有这个问题。

有谁知道可能是什么原因,或者要检查什么才能找到根本原因?

刚刚在 python 问题跟踪器中找到了一个非常可能的原因。请参阅 https://bugs.python.org/issue1336

中 torsten 的评论

Among other issues (like a hang for still unknown reasons when calling subprocess.Popen) I have also seen gc getting disabled for a long running process which has multiple threads and starts processes via subprocess.Popen from different threads.

在python2.7中,多线程调用subprocess时,有可能关闭gc

Post 此处提供此信息,以防其他人也 运行 遇到此问题。