我有一个应用程序,一些线程被固定到使用CPU亲和力的特定核心 .
我试图将这些线程移动到实时优先级策略,其中SCHED_FIFO / SCHED_RR具有这些策略中系统上可用的最低优先级:
param.sched_priority = sched_get_priority_min(SCHED_FIFO);
pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m);
结果,我对这些线程产生了很高的性能影响 .
经过一些研究后,我发现原因是一个叫做 kworker /1:0 的线程处于 R 状态,但由于它有一个常规的政策而不是实时而且因为那个饥饿而无法运行 .
当我将这个kworker线程移动到RT优先级时,我的应用程序又回到了展示高性能:
chrt --fifo -p 99
这似乎是某种 priority inversion ,我的线程正在等待这个具有较低优先级的kworker,因此不会运行 .
我试图弄清楚这个kwroker线程究竟做了什么,为什么它被卡住对我的应用程序有如此大的影响,但是,我得到的唯一线索是看它的内核回溯:
/proc//stack
[] worker_thread+0x123/0x400
[] kthread+0xce/0xe0
[] ret_from_fork+0x7c/0xb0
有什么想法吗 ?