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
-