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


当线程位于 CPU 运行队列中超过 starvation 阈值且不会进行进度时,线程不足发生。线程不足的常见原因是运行固定优先级轮询应用,如 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,stalld 会监控运行主工作负载的 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

© 2025 Red Hat