实时调度需内核启用CONFIG_RT_GROUP_SCHED=y等选项,配置limits.conf设rtprio与memlock限制,cgroup限定cpu.rt_runtime_us/period_us配额,并调优vm.swappiness=1、transparent_hugepage=never等内存参数。

实时调度策略必须显式启用,否则SCHED_FIFO和SCHED_RR无效
Linux默认内核编译不开启实时调度支持,即使你用chrt -f 99设置进程,也会报错Operation not permitted。关键不是命令写得对不对,而是内核是否带CONFIG_RT_GROUP_SCHED=y或至少CONFIG_POSIX_TIMERS=y和CONFIG_RT_MUTEXES=y。检查方法:zcat /proc/config.gz | grep CONFIG_RT(需安装kernel-config包),或直接看/boot/config-$(uname -r)。没启用就只能重编内核或换发行版——Ubuntu Server 24.04+、CentOS Stream 9 默认已开,但Debian stable常关闭。
chrt只能临时设置,权限控制靠rlimit和/etc/security/limits.conf
即使内核支持,普通用户也无法直接运行SCHED_FIFO任务。系统会拒绝,错误是Permission denied。必须提前配置资源限制:
- 在
/etc/security/limits.conf里加两行:* soft rtprio 99和* hard rtprio 99 - 同时补上
* soft memlock unlimited和* hard memlock unlimited——实时任务常锁内存,否则mlock()失败 - 改完需重新登录或重启session,
ulimit -r应输出99才生效
注意:rtprio值只控制用户能设的最高优先级,不是给所有进程开绿灯;root不受此限,但生产环境严禁用root跑实时任务。
避免SCHED_FIFO饿死其他进程,必须配cpu.rt_runtime_us和cpu.rt_period_us
裸用SCHED_FIFO极危险:一个死循环的实时进程能占满CPU,连SSH都登不上。cgroup v1/v2 提供硬隔离:
- 创建实时配额组:
sudo cgcreate -g cpu:/rtgroup - 设周期为100ms、运行时间上限为10ms:
echo 10000 > /sys/fs/cgroup/cpu/rtgroup/cpu.rt_runtime_us,echo 100000 > /sys/fs/cgroup/cpu/rtgroup/cpu.rt_period_us - 把进程加入:
echo $PID > /sys/fs/cgroup/cpu/rtgroup/cgroup.procs
这意味着该组每100ms最多用10ms CPU时间,剩下90ms留给其他进程。不设这个,所谓“实时”就是系统不稳定源。
vm.swappiness=1和transparent_hugepage=never是实时任务的配套刚需
实时任务最怕不可预测延迟,而内存子系统恰恰是最大干扰源:
-
vm.swappiness=1(不是0):设为0会禁用swap,但某些驱动或OOM killer逻辑反而更卡;设为1可极大降低交换倾向,又保留兜底能力 -
transparent_hugepage=never:THP在分配大页时可能触发数毫秒停顿,实时场景必须关,命令是echo never > /sys/kernel/mm/transparent_hugepage/enabled - 额外建议:
kernel.timer_migration=1防止高精度定时器被迁移到不同CPU,减少抖动
这些参数要写进/etc/sysctl.conf并sysctl -p加载,否则重启即失效。真正难的不是调哪几个值,而是所有环节——内核支持、权限配置、cgroup配额、内存策略——缺一不可,漏掉任意一环,实时性就只是幻觉。


















