提问人:Gyorgy Szekely 提问时间:11/13/2023 最后编辑:Gyorgy Szekely 更新时间:11/14/2023 访问量:57
提高 linux kworker 线程优先级?
Increase linux kworker thread priority?
问:
我有一个带有 linux 的双核 1GHz ARM 系统,其中业务应用程序应执行低延迟串行 IO> <10ms 响应时间,接收 ~10 字节请求,发送 ~20字节响应。经过几次迭代的设计改进后,结果相当不错,但偶尔仍会错过最后期限。
对 Perfetto.dev 进行系统范围的跟踪揭示了以下内容:
- 当两个内核都饱和时,就会错过最后期限
- 应用程序线程具有更高的优先级,一旦它变得可运行,它就会以 <100us 进入运行状态,并在 2ms 内执行其工作(完全在规范范围内)
- 应用程序线程由 kworker/u4:1-events_unbound(处理串行硬件)唤醒,这与其他用户线程具有相同的 prio
- 当错过最后期限时,是 kworker 挨饿了(保持可运行状态,等待可用的 CPU 资源)
由于 CPU 不时饱和,我认为除了优先考虑有截止日期的线程之外,没有其他选择。但是改变 kworker 线程(renice、chrt)的优先级至少可以这样说:
- 它们归内核所有,更改它们的 prio 感觉不对
- 它们是创建和销毁运行时的,扫描它们并在启动时设置 prio 一次是不可行的
解决这个问题的正确方法是什么?
将更多内核投入工作不是一种选择。即使 CPU 饱和,跟踪也表明,如果执行正确的事情而不是一些后台活动,则可以轻松满足最后期限。
--
此跟踪描述了问题的单次出现:
- 该标志指示流量到达的时间点:6 字节
- 此时,kworker 变得可运行,但在此状态下保持 6.7 毫秒
- 在此期间,两个内核上都计划了多个进程
- 当 kworker 最终运行时,它会唤醒我的线程并运行应用程序代码
答: 暂无答案
评论