1

我在 linux 上运行的多线程 c++ 应用程序上完成了 strace

运行几个小时后,没有一个线程运行,大约 12 秒。

我已经看到在线程暂停之前未完成的超时调用系统调用未完成,在它恢复后报告,操作完成需要 11.x 秒。(超时只有900ms)

这清楚地表明该过程已经饿了很长时间了。

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

由于在套接字上接收到大量数据,另外 5 个类似的应用程序在同一个盒子上运行,它们也像这个应用程序一样受到大量 I/O 限制。但大多数情况下,这个应用程序都会出现预定延迟。其他应用程序是使用与此相同的计划策略和优先级创建的,即默认值。为什么只有这个进程几乎一直被阻塞?

可能是因为这个过程在更繁忙的情况下更密集的 I/O,因为可能是更高的数据速率?那么,这里的 linux 动态优先级调整推动了这个过程?

4

1 回答 1

1

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

于 2012-06-21T10:21:54.737 回答