linux rt调度器通过cpu.rt_runtime_us与cpu.rt_period_us实现硬性时间窗口控制,例如设为600000和1000000即预留50% cpu给rt进程组;设为-1则关闭限流,但可能导致系统无响应。

直接用 cpu.rt_runtime_us 和 cpu.rt_period_us 可以为实时(RT)进程划出独占、可预测的 CPU 时间片,关键在于配置合理且避免与其他 RT 任务冲突。
明确 RT 带宽参数含义
这两个值定义了一个“硬性时间窗口”,内核据此强制调度:
-
cpu.rt_period_us:周期长度(单位微秒),默认是
1000000(即 1 秒) - cpu.rt_runtime_us:该周期内允许 RT 任务实际运行的最大总时长(单位微秒)
- 例如:
rt_runtime_us=500000+rt_period_us=1000000= 稳定预留 50% 的 CPU 时间给本组 RT 进程 - 若设为
-1,表示不限制 RT 运行时间(慎用,可能饿死其他任务)
创建并配置 RT 专用 cgroup
以 root 权限操作,路径按系统版本略有差异(CentOS 7+/Ubuntu 18.04+ 通常在 /sys/fs/cgroup/cpu,cpuacct/):
- 新建目录:
mkdir /sys/fs/cgroup/cpu,cpuacct/rt-reserved - 写入 RT 配额:
echo 600000 > /sys/fs/cgroup/cpu,cpuacct/rt-reserved/cpu.rt_runtime_us - 写入周期:
echo 1000000 > /sys/fs/cgroup/cpu,cpuacct/rt-reserved/cpu.rt_period_us - 确认生效:
cat /sys/fs/cgroup/cpu,cpuacct/rt-reserved/cpu.rt_*应显示对应数值
将实时进程加入该 cgroup
必须确保进程已以 SCHED_FIFO 或 SCHED_RR 调度策略运行,再迁移进去:
- 启动时指定策略(需 cap_sys_nice 权限):
chrt -f 50 ./my_rt_app & - 获取其 PID:
PID=$(pgrep my_rt_app) - 写入 tasks 文件:
echo $PID > /sys/fs/cgroup/cpu,cpuacct/rt-reserved/tasks - 验证是否成功:
cat /sys/fs/cgroup/cpu,cpuacct/rt-reserved/tasks应含该 PID
注意事项与典型限制
RT 带宽控制比 CFS 更刚性,稍有配置不当就容易触发限流或干扰系统稳定性:
- 所有属于该 cgroup 的 RT 进程共享
rt_runtime_us总配额;单个进程超时即被挂起,直到下一周期重置 - 不能与
cpu.cfs_*参数混用在同一 cgroup(两者互斥) - 若系统中存在多个 RT cgroup,它们的
rt_runtime_us总和不应超过rt_period_us,否则部分组会频繁 throttled - 建议搭配
cpuset子系统绑定特定 CPU 核心,进一步隔离干扰:echo 0-1 > /sys/fs/cgroup/cpuset/rt-reserved/cpuset.cpus











