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
-