【发布时间】: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 并告诉我您的想法。
标签: linux real-time scheduler scheduling