SCHED_FIFO 高优先级线程被 SCHED_FIFO 低优先级线程抢占?

Posted

技术标签:

【中文标题】SCHED_FIFO 高优先级线程被 SCHED_FIFO 低优先级线程抢占?【英文标题】:SCHED_FIFO higher priority thread is getting preempted by the SCHED_FIFO lower priority thread? 【发布时间】:2014-11-26 08:19:30 【问题描述】:

我正在 Linux RT 多核机器上测试我的多线程应用程序。

然而,在测试期间,我们观察到 Linux RT 中的调度(使用 SCHED_FIFO 调度策略创建)并未根据 SCHED_FIFO 策略进行。 我们可以在多个地方看到较高优先级的线程执行被较低优先级的线程抢占。

根据我们在互联网上做的一些研究,我们发现需要更改以下内核参数

/proc/sys/kernel/sched_rt_period_us containing 1000000
/proc/sys/kernel/sched_rt_runtime_us containing 950000

/proc/sys/kernel/sched_rt_period_us containing 1000000
/proc/sys/kernel/sched_rt_runtime_us containing 1000000

/proc/sys/kernel/sched_rt_period_us containing -1
/proc/sys/kernel/sched_rt_runtime_us containing -1

我们尝试了两种方法,但有时我们仍然会遇到问题。即使更高优先级的线程没有被任何系统调用挂起,我们也面临着这个问题。

如果您知道 Linux RT 调度中的此类问题和/或有任何解决方案可以根据优先级使 Linux RT 调度具有确定性,请告诉我们。

高优先级线程中没有 printfs 或任何系统调用,但高优先级线程仍然被低优先级线程抢占。

此外,我还使用 taskset 命令确保进程中的所有线程都在单个内核上运行。

【问题讨论】:

只是优先级反转(en.wikipedia.org/wiki/Priority_inversion)?较低优先级的线程是否持有较高优先级的锁? 不,较高优先级的线程不会等待来自较低优先级线程的任何锁。 你使用的库没有等待任何锁? 我认为可能是较高优先级的线程没有被抢占,而是较低优先级的线程在不同的核心上运行(两者都在运行)。尝试在单核上运行,使用亲和性控制,看看是否得到了预期的结果。 @Syed Aslam :我有同样的问题,但 MCVE 非常小。考虑到您从问题中收集到的经验,您能否看看Linux not respecting SCHED_FIFO priority,normal or GDB execution 并告诉我您的想法。 【参考方案1】:

可能有两个原因:

CPU 节流:调度程序旨在为非 RT 任务保留一些 CPU 时间;您已经通过处理 /proc/sys/kernel/ 条目来禁用它 阻塞:您的高优先级任务正在阻塞 关于某些同步机制(例如,互斥锁、信号量)或 某些阻塞调用(例如,malloc、printf、读、写等)

【讨论】:

不幸的是,我们已经检查了这两个原因,但两者都不存在。没有优先级反转,也没有高优先级线程正在等待 mutex/semaphore/prints/malloc/free

以上是关于SCHED_FIFO 高优先级线程被 SCHED_FIFO 低优先级线程抢占?的主要内容,如果未能解决你的问题,请参考以下文章

线程调度策略SCHED_RR(轮转法)和SCHED_FIFO(先进先出)之对照

Linux 进程调度

Linux 内核进程优先级与调度策略 ① ( SCHED_FIFO 调度策略 | SCHED_RR 调度策略 | 进程优先级 )

Linux 内核进程优先级与调度策略 ① ( SCHED_FIFO 调度策略 | SCHED_RR 调度策略 | 进程优先级 )

SCHED_OTHER/SCHED_FIFO 的 pthread sched_get_priority_min/max 实现

Linux 线程调度与优先级