16.3. 实时内核中的线程不足


当线程位于 CPU 运行队列中超过星级阈值且没有进行进度时,线程不足发生。线程不足的常见原因是运行固定优先级轮询应用程序,如 SCHED_FIFO 或与 CPU 绑定的 SCHED_RR。由于轮询应用程序对于 I/O 并不阻止,因此这可以防止其他线程(如 kworkers )无法在该 CPU 上运行。

早期尝试减少线程不足情况被称为实时节流。在实时节流中,每个 CPU 都有一部分执行时间专用于非实时任务。节流的默认设置为使用 95% 的 CPU,为非实时任务保留 5%。如果您有一个单一实时任务导致了不足,但如果为 CPU 分配多个实时任务,则无法正常工作。您可以使用以下方法解决这个问题:

stalld 机制

stalld 机制是实时节流的替代选择,并避免了一些节流的缺陷。stalld 是一个守护进程,用于定期监控系统中每个线程的状态,并查找运行队列中的线程,以便在不运行的情况下运行。stalld 临时更改该线程以使用 SCHED_DEADLINE 策略,并在指定的 CPU 上分配少量时间。然后,线程会运行,在使用时间片段时,线程会返回其原始调度策略,而 stalld 继续监控线程状态。

日常 CPU 是运行所有守护进程、shell 进程、内核线程、中断处理程序以及可以从隔离的 CPU 分配的所有工作的 CPU。对于禁用实时节流的内务 CPU,stopd 会监控运行主工作负载的 CPU,并为使用 SCHED_FIFO 忙碌循环分配 CPU,这有助于检测停止的线程并根据需要改进之前定义的可接受的 noise 的线程优先级。如果实时节流机制导致主工作负载出现不合理的通知,则 stalld 可能会是一个首选。

使用 stalld 时,您可以通过提高不足的线程来更精确地控制引入的 noise。shell 脚本 /usr/bin/throttlectl 会在运行 stalld 时自动禁用实时节流。您可以使用 /usr/bin/throttlectl show 脚本列出当前的节流值。

禁用实时节流

/proc 文件系统中的以下参数控制实时节流:

  • /proc/sys/kernel/sched_rt_period_us 参数指定一个句点中的微秒数,默认为 100万,即 1 秒。
  • /proc/sys/kernel/sched_rt_runtime_us 参数指定在节流发生前实时任务使用的微秒数,并默认为可用 CPU 周期的 950,000 或 95%。您可以使用 echo -1 > /proc/sys/kernel/ sched_rt_runtime_us 命令,将值-1 传递给 sched_rt_runtime_us 文件来禁用节流。
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部