8

我刚刚开始研究一个有一些 CPU 问题的龙卷风应用程序。CPU 时间将随着时间的推移单调增长,使 CPU 达到 100%。该系统目前设计为不阻塞主线程。如果它需要做一些阻塞和异步驱动程序不可用的事情,它将产生另一个线程来执行阻塞操作。

因此,我们的主线程几乎完全受 CPU 限制,而其他线程几乎完全受 IO 限制。根据我的阅读,这似乎是遇到 GIL 问题的完美方式。另外,我的分析表明我们花费了大量时间等待信号(我假设这__semwait_signal是正在做的事情),这与 GIL 在我有限的理解中产生的影响是一致的。

如果我使用sys.setcheckinterval将检查间隔设置为 300,CPU 增长会显着减慢。我要确定的是我是否应该增加检查间隔,将其保持在 300,或者害怕增加它。毕竟,我注意到 CPU 性能变得更好,但我有点担心这会对系统的响应能力产生负面影响。

当然,正确的答案可能是我们需要重新考虑我们的架构以将 GIL 考虑在内。但这不是可以立即完成的事情。那么,我如何确定在短期内采取的适当行动方案呢?

4

1 回答 1

1

我要检查的第一件事是确保您正确退出线程。仅凭您的描述很难弄清楚发生了什么,但是您使用“单调”一词,这意味着 CPU 使用与时间有关,而不是与负载有关。

您很可能会遇到 Python 的线程限制,但它应该随着负载(活动线程的数量)而上下变化,并且随着这些线程的退出,CPU 使用率(上下文切换成本)应该会减少。线程一旦创建就永远存在,有什么理由吗?如果是这种情况,请优先考虑重新架构。否则,短期将是弄清楚为什么 CPU 使用率与时间相关而不是负载。这意味着每个新线程在您的系统中都有一个永久的、不可逆转的成本——这意味着它永远不会退出。

于 2010-08-25T00:49:52.193 回答