2012-06-21 70 views
1

我已经做了strace的在我的多线程C++应用程序在Linux上Linux进程调度延迟了很长一段时间

运行几个小时的运行后,没有一个线程的运行得到了,约12秒。

我已经看到,在线程被挂起之前,用超时调用的未完成的select系统调用未完成,在它恢复之后报告,操作完成需要11.x秒。 (超时时间仅为900ms)

这清楚地表明该过程长时间处于饥饿状态。

该进程中的所有线程都使用linux的默认调度策略(SCHED_OTHER)和缺省优先级创建。

还有另外5个类似的应用程序在同一个盒子上运行,由于套接字上接收到大量数据,这些应用程序也像这个应用程序一样受到严重的I/O限制。但大部分时间,这个应用程序正在计划延迟。其他应用程序使用与此相同的调度策略和优先级创建,即默认值。为什么只有这个过程几乎在所有时间都被阻止?

难道是因为这个过程是更多的I/O密集型,因为在更繁忙的情况下可能会有更高的数据率?那么,在这里玩的linux动态优先级调整是否会推动这个过程呢?

+1

它可以只是交换。检查你是否有足够的物理内存来使用'vmstat'运行所有进程。 –

回答

1

Linux中的优先级和进程调度只与CPU时间有关。事实上,进程调度器只关心等待在CPU上运行的进程。等待I/O的进程/线程不由进程调度程序处理,而是由I/O调度程序处理。

+2

CPU调度程序根据考虑其I/O活动的动态进程优先级作出决策。 –