如何确定合适的检查间隔?

8 投票
1 回答
836 浏览
提问于 2025-04-16 03:14

我刚开始做一个叫做“龙卷风”的应用程序,但它有一些CPU方面的问题。随着时间的推移,CPU的使用时间会不断增加,最终达到100%的满负荷状态。现在的系统设计是为了不阻塞主线程。如果需要做一些会阻塞的操作,而又没有异步驱动可用,它会启动另一个线程来处理这些阻塞的操作。

所以现在主线程几乎完全被CPU占用,而其他一些线程则几乎完全在等待输入输出。从我所了解的情况来看,这样的设计很容易遇到GIL(全局解释器锁)的问题。而且,我的性能分析显示,我们花了很多时间在等待信号上(我猜这就是__semwait_signal在做的事情),这和我对GIL的有限理解是相符的。

如果我使用sys.setcheckinterval把检查间隔设置为300,CPU的增长速度会明显减慢。我想弄清楚的是,我应该把检查间隔调高,保持在300,还是应该担心调高会带来的影响。毕竟,我注意到CPU的性能变好了,但我有点担心这会影响系统的响应速度。

当然,正确的答案可能是我们需要重新考虑我们的架构,以便考虑到GIL的问题。但这不是能马上解决的事情。那么在短期内,我该如何决定合适的行动方案呢?

1 个回答

1

首先,我会检查一下你是否正确地结束了线程。根据你的描述,很难判断具体发生了什么,但你提到“单调性”,这意味着CPU的使用情况是和时间有关,而不是和负载有关。

你可能确实遇到了Python的线程限制,但CPU的使用情况应该会随着负载(活跃线程的数量)而上下波动,而且随着线程的结束,CPU的使用率应该会降低。有没有什么原因让一个线程在创建后就一直存在?如果是这样的话,建议你优先考虑重新设计这个部分。否则,短期内你需要弄清楚为什么CPU的使用情况和时间有关,而不是和负载有关。这意味着每个新创建的线程在你的系统中都有一个永久的、不可逆的成本——也就是说,它永远不会结束。

撰写回答