type
Post
status
Published
slug
2025/02/13/Optimizing RHEL 9 for Real Time for low latency operation——Red Hat 9 实时调度政策介绍
summary
tags
Linux
rt-kernel
category
Linux
icon
password
new update day
Property
Feb 13, 2025 08:49 AM
created days
Last edited time
Feb 13, 2025 08:49 AM
Red Hat 9 实时调度政策介绍
在 Red Hat 9 实时系统中,调度器是决定可运行线程的内核组件。每个线程都有相关的调度策略和静态调度优先级(称为 sched_priority)。 调度是抢占式的,因此当静态优先级更高的线程准备运行时,当前运行的线程就会停止。然后,正在运行的线程会返回其静态优先级的等待列表。
所有 Linux 线程都有以下一种调度策略:
- SCHED_OTHER 或 SCHED_NORMAL:为默认策略。
- SCHED_BATCH:与 SCHED_OTHER 类似,但采用递增定向。
- SCHED_IDLE:是优先级低于 SCHED_OTHER 的策略。
- SCHED_FIFO:是先进先出的实时策略。
- SCHED_RR:是循环实时策略。
- SCHED_DEADLINE:是一种调度策略,用于根据作业的截止日期确定任务的优先级。绝对截止日期最早的任务优先运行。
一、调度政策
实时线程的优先级高于标准线程。策略的调度优先级值从最小值 1 到最大值 99 不等。
以下政策对实时性至关重要:
- SCHED_OTHER 或 SCHED_NORMAL 策略
- 这是 Linux 线程的默认调度策略。它有一个动态优先级,由系统根据线程的特性进行更改。SCHED_OTHER 线程的 nice 值介于 -20 和 19 之间,前者是最高优先级,后者是最低优先级。SCHED_OTHER 线程的默认 nice 值为 0。
- SCHED_FIFO 策略
- 与 SCHED_OTHER 任务相比,使用 SCHED_FIFO 的线程具有更高的优先级。SCHED_FIFO 使用介于 1(最低值)和 99(最高值)之间的固定优先级,而不是使用 nice 值。优先级为 1 的 SCHED_FIFO 线程总是比 SCHED_OTHER 线程优先调度。
- SCHED_RR 策略
- SCHED_RR 策略与 SCHED_FIFO 策略类似。优先级相同的线程以循环方式调度。SCHED_FIFO 和 SCHED_RR 线程一直运行到下列事件之一发生为止:
- 线程进入睡眠或等待事件。
- 优先级更高的实时线程准备运行。
除非发生上述事件之一,否则线程会在指定处理器上无限期运行,而低优先级线程会留在队列中等待运行。这可能会导致系统服务线程常驻,无法被交换出去,也会导致文件系统数据刷新失败。
- SCHED_DEADLINE 策略
- SCHED_DEADLINE 策略规定了时间要求。它根据任务的截止日期对每个任务进行调度。具有最早截止时间优先(EDF)计划的任务最先运行。
- 内核要求 runtime⇐deadline⇐period 为 true。所需选项之间的关系是 runtime⇐deadline⇐period。
二、sched_deadline 策略的参数
每个 SCHED_DEADLINE 任务都有周期、运行时间和截止时间参数。这些参数的值都是纳秒整数。
参数 | 单位 | 描述 | 关键约束 |
period | 纳秒 | 周期是指实时任务的激活模式。
例如,如果一个视频处理任务每秒要处理 60 个帧,那么每 16 毫秒就会有一个新帧排队等待处理。因此,周期为 16 毫秒。 | T > 0 |
runtime | 纳秒 | 运行时间是指分配给任务产生输出的 CPU 执行时间。在实时情况下,运行时间就是最大执行时间,也称为 "最坏情况执行时间"(WCET)。
例如,如果一个视频处理工具在最坏的情况下需要 5 毫秒来处理一幅图像,那么运行时间就是 5 毫秒。 | C ≤ D ≤ T |
deadline | 纳秒 | deadline 是产出的最长时间。
例如,如果任务需要在十毫秒内传送处理过的帧,那么截止时间就是十毫秒。 | D ≤ T |
三、参数关系
1. 基础约束
- C ≤ D ≤ T
- C > D:无法在截止时间内完成执行
- D > T:下一周期激活时当前周期任务未完成
运行时间必须小于等于截止时间,截止时间必须小于等于周期,否则会导致:
- 利用率约束
单任务CPU利用率:U = C/T ≤ 1
多任务总利用率:Σ(C_i/T_i) ≤ 1(多核时为Σ ≤ CPU核心数)
2. 动态行为
- 周期重置每个周期结束时,参数重置,任务重新激活
- Deadline排序调度器优先执行最紧迫(最小Deadline)的任务
四、参数设置示例
示例1:视频处理任务
Period (T): 16ms → 60帧/秒 Runtime (C): 5ms → 单帧处理WCET Deadline (D): 10ms → 输出延迟要求 参数验证: C(5ms) ≤ D(10ms) ≤ T(16ms) 利用率 U = 5/16 ≈ 31.25%
示例2:工业控制任务
Period (T): 50ms → 20Hz控制频率 Runtime (C): 15ms → 控制算法执行时间 Deadline (D): 50ms → 必须在本周期完成 参数验证: C(15ms) ≤ D(50ms) = T(50ms) 利用率 U = 15/50 = 30%
示例3:多任务系统
任务A: T=20ms, C=5ms, D=10ms → U=25% 任务B: T=30ms, C=10ms, D=20ms → U≈33.33% 总利用率 = 25% + 33.33% = 58.33% < 100% → 可调
五、参数设置原则
- Deadline选择
- 典型值:D = T(硬实时) 或 D < T(允许缓冲)
- 过小D会增加调度失败风险
- Runtime估算
- 建议:WCET × 安全系数(如1.2-1.5)
- 测量方法:最坏情况压力测试
- Period确定
- 根据业务需求的最小激活频率
- 避免过小导致高利用率
六、常见错误配置
错误类型 | 后果 | 解决方案 |
C > D | 必然错过截止时间 | 优化代码或调整D |
D > T | 任务堆积 | 设置D ≤ T |
ΣU > 100% | 系统不可调度 | 减少任务数或优化C |
七、高级应用
- 资源预留
通过C/T预留固定CPU带宽,适用于关键任务
- 动态调节
运行时根据负载调整参数(需内核支持)
- 多核扩展
使用cpuset绑定CPU核心,减少跨核调度开销
欢迎加入“喵星计算机技术研究院”,原创技术文章第一时间推送。

相关文章