【发布时间】:2017-04-20 00:24:43
【问题描述】:
我们有一个使用内核 3.14.17、PREEMPT RT 的 Linux 系统。它是一个单核系统。
对于延迟问题,我们的应用程序将其某些线程的调度类型设置为 SCHED_RR。但是,这会导致内核中的 kworkers 被阻塞,因为它们仅在 SCHED_OTHER 模式下运行。这会导致一种优先级倒置,因为低优先级的 SCHED_RR 线程可以阻止更高优先级的 SHED_RR 接收来自驱动程序的数据。
是 TTY 驱动程序被阻止。它使用函数 tty_flip_buffer_push 中的工作队列。可能会有更多电话,但这是我们已经确定的电话。
有什么方法可以轻松解决这个问题——RT 应用程序依赖于 kworker?我们希望我们不必自己破解驱动程序/内核。 RT 内核中是否有任何内核配置选项可用于此类内容?我们可以吗,
- 为 kworker 设置 SCHED_RR 优先级?
- 禁用特定驱动程序的工作队列?
如果我们必须破解驱动程序,我们可能会给它自己的工作队列,使用 SCHED_RR kworker。
当然,任何其他解决方案也很有趣。如果有一些新功能,我们可以升级到更高版本的内核。
【问题讨论】:
-
你是否使用了没有 CPU pinning 的 RR 优先级?这注定要失败。
-
好吧,我们只有一个核心。我会更新问题。
-
你不应该使用实时优先级。就这么简单。
-
为什么让内核线程实时运行不可行?
-
因为你只有一个 CPU。
标签: c++ linux multithreading linux-kernel real-time