我有一个有大约 80 个线程的程序。它在 linux 3.36 上运行在 ~50ish 核心机器上。最多有 2 个这样的程序同时运行,并且它们是相同的。机器上没有其他任何东西在运行。
线程本身是具有 SCHED_RR(循环)策略的实时 linux pthread。
- 10 是最高优先级(是的,我将 ulimit 设置为 99)并将 cpu 亲和性设置为 10 个核心。换句话说,它们都被固定在自己的核心上。
- 大约 60 个是中等优先级。
- 大约 10 个是低优先级。
10 个最高优先级的线程一直在使用 cpu。
其余的在做网络 IO 以及在 CPU 上做一些工作。问题是:我看到一个低优先级线程被饿死,有时一次超过 15 秒。此特定线程正在 TCP 套接字上等待某些数据。我知道数据已完全发送,因为我可以看到连接另一端的服务器已发送数据(即,它在发送数据后记录时间戳)。通常线程需要毫秒来接收和处理它,但偶尔会在其他服务器成功发送数据后需要 15 秒。请注意,增加线程的优先级并将其固定到 CPU 已经消除了这个问题,但这不是一个长期的解决方案。我一开始就没想到这种行为 - 15 秒是很长的时间。
有谁知道为什么会发生这种情况?我们已经排除它是程序/线程中的任何逻辑。另请注意,该程序是用 C 编写的。