我在 linux 上运行的多线程 c++ 应用程序上完成了 strace
运行几个小时后,没有一个线程运行,大约 12 秒。
我已经看到在线程暂停之前未完成的超时调用系统调用未完成,在它恢复后报告,操作完成需要 11.x 秒。(超时只有900ms)
这清楚地表明该过程已经饿了很长时间了。
进程中的所有线程都是使用linux的默认调度策略(SCHED_OTHER)和默认优先级创建的。
由于在套接字上接收到大量数据,另外 5 个类似的应用程序在同一个盒子上运行,它们也像这个应用程序一样受到大量 I/O 限制。但大多数情况下,这个应用程序都会出现预定延迟。其他应用程序是使用与此相同的计划策略和优先级创建的,即默认值。为什么只有这个进程几乎一直被阻塞?
可能是因为这个过程在更繁忙的情况下更密集的 I/O,因为可能是更高的数据速率?那么,这里的 linux 动态优先级调整推动了这个过程?