1

我有一个有大约 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 编写的。

4

1 回答 1

1

我一开始就没想到这种行为 - 15 秒是很长的时间。

如果您的 60 个中等优先级的线程都可以运行,那么这正是您所期望的:使用实时线程,那么低优先级的线程根本不会运行而高优先级的线程仍然可以运行。

您也许可以使用它perf timechart来准确分析正在发生的事情。

于 2016-10-19T05:10:09.597 回答