第 33 章 实时调度问题和解决方案

本节介绍实时调度问题和可用解决方案。

实时调度策略

RHEL for Real Time 的两个实时调度策略共享一个主要特征:它们运行直至被高优先级线程抢占,或直到它们被休眠或执行 I/O。如果是 SCHED_RR,则可由操作系统抢占线程,以便可以运行其他相等 SCHED_RR 优先级的线程。在这两种情况下,POSIX 规格没有提供任何置备,它们定义了策略以便降低优先级线程来获取任何 CPU 时间。

这个实时线程特征意味着可轻松编写一个应用程序,以单调来单调给定 CPU 的 100%。但是,这会导致操作系统出现问题。例如,操作系统负责管理系统范围的和每个 CPU 资源,并且必须定期检查这些资源描述的数据结构,并与它们执行内务操作。但是,如果一个核心由 SCHED_FIFO 线程进行单调,它无法执行其内务处理任务。最终,整个系统变得不稳定,可能会崩溃。

在 RHEL for Real Time 内核上,中断处理程序作为带有 SCHED_FIFO 优先级的线程运行。(十六进制默认优先级为 50 )。高于中断处理器线程的 SCHED_FIFOSCHED_RR 策略的 cpu-hog 线程可以防止中断处理程序运行。这会导致程序等待这些中断发送的数据丢失并失败。

实时调度程序节流

Red Hat Enterprise Linux for Real Time 附带了一个保护机制,它允许系统管理员通过实时任务分配使用。这种保护机制被称为实时调度程序节流。实时调度程序节流由 /proc 文件系统的两个参数控制:

  • /proc/sys/kernel/sched_rt_period_us

    定义 microsecondss(微秒)的周期以视为 100% 的 CPU 带宽。默认值为 1,000,000 abrts (1 秒)。对周期值的改变必须非常顺利,因为周期太长或太小是平等危险。

  • /proc/sys/kernel/sched_rt_runtime_us

    可用于所有实时任务的总带宽。默认值为 950,000 50,000s (0.95 s),或者以其他单词,以 95% 的 CPU 带宽。将值设为 -1 表示实时任务可能需要最多使用 100% 的 CPU 时间。这只有在设计了实时任务并且没有明显的注意事项(如未绑定的轮询循环)时,才足够了。

    实时节流机制的默认值定义实时任务可使用 CPU 时间的 95%。剩余的 5% 将投入非实时任务,例如在 SCHED_OTHER 和类似调度策略下运行的任务。请务必注意,如果单个实时任务占据了 95% 的 CPU 时间插槽,那么该 CPU 上的剩余时间任务将不会运行。只有非实时任务使用剩余的 5% 的 CPU 时间。

    默认值的影响包括:

    • 恶意实时任务不允许非实时任务运行,不会锁定系统。
    • 实时任务具有最多的 CPU 时间可用,这可能会影响其性能。

其他资源