实时带宽限制是什么
kernel.sched_rt_runtime_us 与 kernel.sched_rt_period_us 共同构成实时任务的带宽限制:在每个周期(默认 1 秒,即 1000000 微秒)内,实时调度策略的任务最多可以占用 950000 微秒,也就是 95% 的 CPU 时间。这是保护机制,避免一个失控的实时任务把普通任务彻底饿死。把运行时间设为 -1 表示关闭限制,实时任务可以无限占用 CPU。
基本信息
| 参数 | kernel.sched_rt_runtime_us 与 kernel.sched_rt_period_us |
|---|---|
| 默认值 | 950000 微秒 / 1000000 微秒,即 95% / 1 秒周期 |
| 作用对象 | SCHED_FIFO 与 SCHED_RR 策略的实时任务 |
| 关闭方式 | 把运行时间设为 -1,表示不做限制 |
| 相关文件 | cgroup 中的 CPU 实时带宽控制文件可按分组细化 |
| 观测入口 | /proc/sched_debug 与实时任务的运行表现 |
典型使用场景
- 实时应用调优:确保关键任务能在周期内获得足够 CPU 时间
- 排查实时任务被限流:任务的执行时间出现周期性截断时核对这两个参数
- 保护系统:防止异常实时任务拖垮整机,保持默认限制是常见做法
- 隔离核规划:在专用核心上运行实时任务时评估是否放宽限制
- 容器与分组管理:按分组细化实时带宽,避免影响其他业务
查看与调整
查看与调整
sysctl kernel.sched_rt_period_us kernel.sched_rt_runtime_us # 读周期与额度
cat /proc/sys/kernel/sched_rt_runtime_us # 等价读法
sysctl -w kernel.sched_rt_runtime_us=900000 # 收紧到 90%
chrt -f 50 /path/to/app # 以实时策略启动进程
chrt -p $$ # 查看当前进程的调度策略落盘与回读
落盘与回读
# /etc/sysctl.d/99-rt.conf
kernel.sched_rt_period_us = 1000000 # 周期长度,单位微秒
kernel.sched_rt_runtime_us = 950000 # 每周期内实时任务的可用额度
# 回读命令:sysctl kernel.sched_rt_period_us kernel.sched_rt_runtime_us取值与后果
| 设置 | 含义 | 风险 |
|---|---|---|
| 默认组合 | 每周期保留 5% 给普通任务 | 实时任务超时会被暂时抑制,属保护行为 |
| 收紧额度 | 留给普通任务的比例更大 | 实时任务的时延保障变弱 |
| 设为 -1 | 不限制实时任务占用 | 失控任务会造成系统假死,风险最高 |
| 按分组限制 | 在容器或分组层面细化 | 配置层级多,需要逐层核对 |
把运行时间设为 -1 等于允许实时任务无限占用 CPU,一个死循环的实时任务就能让系统失去响应。启用前确保相关任务已经被隔离到专用核心上,并验证过异常情况下的兜底手段。
容器内看到的实时带宽可能还被宿主限制:分组层的配置与全局设置叠加生效。排查时两层的值都要核对,单看一层容易得出错误结论。