我的生产中有一个Python守护程序。它使用7至120个线程。最近,最小的实例(7个线程)开始显示悬挂,而所有其他实例从未显示出这种问题。将strace附加到Python过程中,表明所有线程都在调用futex futex_wait_private,因此他们可能正在尝试锁定某些东西。

您将如何调试这样的问题?

请注意,这是一个从闪存运行的生产系统,因此磁盘写入也受到限制。

有帮助吗?

解决方案

观察结果略有不正确。一个线程没有调用futex,而是在握住吉尔时交换。由于所讨论的机器是低硬件,因此这种交换花了很长时间,似乎是一个僵局。潜在的问题是内存泄漏。 :-(

其他提示

亲爱的Helmut,我的问题与futext_wait_private上的一个线程相同。

看来您已经解决了问题。您可以分享有关解决方案的更多信息吗?

UPD:

最终发现了锁的原因(至少对于我的情况):这是由于进口python的进口锁定。

考虑以下情况:

file1.py:

导入文件2

file2.py:

创建线程“ thread2”

运行“ thread2”

等到“ thread2”完成一些功能(假设GO())

def go():

导入Some_Module

....

在这里,由于导入已锁定在主线程中(import file2),因此在这里挂起的导入将挂起,直到go()完成后才释放。用户将在strace中看到挂在futex_wait_private上。

要在此处工作,在将file2导入到do()函数中执行的代码并在导入文件2之后运行它2:

导入文件2

file2.do()

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top