我有一个大约有80个线程的程序。它运行在linux 3.36上的~50ish核心机器上。最多有两个这样的程序同时运行,它们是相同的。机器上没有其他任何东西在运行。
线程本身是带有SCHED_RR(循环)策略的实时linux pthreads。
10个最高优先级的线程一直在使用cpu。
其余的正在进行网络IO以及在CPU上做一些工作。这就是问题所在:我看到其中一个低优先级线程被饿死,有时一次超过15秒。此特定线程正在TCP套接字上等待某些数据。我知道数据已完全发送,因为我可以看到连接另一端的服务器已发送数据(即,它在发送数据后记录时间戳)。通常,线程需要几毫秒来接收和处理它,但偶尔会在另一台服务器成功发送数据后花费15秒。请注意,增加线程的优先级并将其固定到CPU已经消除了这个问题,但这不是一个长期的解决方案。我不希望这种行为在第一位--15秒是很长的时间。
有谁知道为什么会发生这种情况?我们已经排除它是程序/线程中的任何逻辑。另请注意,该程序是用C语言编写的。
答案 0 :(得分:1)
我不希望这种行为在第一位--15秒是很长的时间。
如果您的60个中等优先级线程都可以运行,那么这正是您所期望的:使用实时线程,低优先级线程将无法运行 而优先级较高的线程仍然可以运行。
您可以使用perf timechart
来准确分析正在发生的事情。