为什么我的程序中的这个帖子会饿死?

时间:2016-10-19 03:30:15

标签: linux multithreading pthreads starvation

我有一个大约有80个线程的程序。它运行在linux 3.36上的~50ish核心机器上。最多有两个这样的程序同时运行,它们是相同的。机器上没有其他任何东西在运行。

线程本身是带有SCHED_RR(循环)策略的实时linux pthreads。

  • 10是最高优先级(是的,我将ulimit设置为99)并且将cpu亲和性设置为10个核心。换句话说,它们都固定在自己的核心上。
  • 大约60个是中等优先级。
  • 大约10个是低优先级。

10个最高优先级的线程一直在使用cpu。

其余的正在进行网络IO以及在CPU上做一些工作。这就是问题所在:我看到其中一个低优先级线程被饿死,有时一次超过15秒。此特定线程正在TCP套接字上等待某些数据。我知道数据已完全发送,因为我可以看到连接另一端的服务器已发送数据(即,它在发送数据后记录时间戳)。通常,线程需要几毫秒来接收和处理它,但偶尔会在另一台服务器成功发送数据后花费15秒。请注意,增加线程的优先级并将其固定到CPU已经消除了这个问题,但这不是一个长期的解决方案。我不希望这种行为在第一位--15秒是很长的时间。

有谁知道为什么会发生这种情况?我们已经排除它是程序/线程中的任何逻辑。另请注意,该程序是用C语言编写的。

1 个答案:

答案 0 :(得分:1)

  

我不希望这种行为在第一位--15秒是很长的时间。

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

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