rt与cfs是linux内核中面向不同需求的调度器:rt追求时间确定性,优先级0–99(数值越小优先级越高),采用sched_fifo/sched_rr抢占式调度,专用于工业控制、音视频等硬实时场景;cfs追求资源公平性,优先级100–139(对应nice值−20到+19,数值越大优先级越低),基于vruntime红黑树动态分配cpu时间,适用于web服务、桌面应用等通用负载。

RT和CFS是Linux内核中两种根本不同的调度逻辑,不是“谁更好”,而是“谁更合适”——关键看任务对时间确定性还是资源公平性的要求更高。
优先级与数值含义完全不同
RT使用0–99的优先级范围,数字越小,优先级越高;CFS用100–139(对应nice值−20到+19),数字越大,优先级越低。两者数值不互通,也不能直接比较。比如RT优先级5的任务,会立即抢占CFS中任何优先级(哪怕139)的进程——因为RT调度类整体高于CFS。
调度行为机制差异明显
RT调度器按固定优先级抢占执行:
- SCHED_FIFO:同优先级先进先出,高优先级一旦就绪,立刻中断当前运行任务
- SCHED_RR:同优先级轮流运行,默认时间片约100ms,用完即让出CPU
- RT任务不参与CFS的vruntime计算,也不受sched_latency_ns等CFS参数影响
CFS则追求长期公平:
- 所有普通进程(SCHED_OTHER)都进入红黑树队列,按加权后的虚拟运行时间(vruntime)排序
- 每次调度选vruntime最小的进程,确保“运行得少的先跑”
- 时间片不是固定值,而是根据调度周期(如24ms)和就绪进程数动态分配
适用场景有明确边界
RT适合硬实时需求:比如工业PLC控制、音频低延迟采集、高频数据采集系统——必须在毫秒级甚至微秒级内响应,错过时限可能引发故障。
CFS适合通用负载:Web服务、数据库、桌面应用、后台批处理等——关注整体吞吐和响应均衡,允许小幅延迟波动。
混用时注意:RT任务过多或长时间不阻塞,会导致CFS任务“饿死”,表现为系统看似空闲但普通进程完全无响应。
配置与调试方式不同
查看和设置RT策略需用chrt命令:
-
chrt -p [PID]查看当前进程调度策略与优先级 -
chrt -f 50 ./myapp以SCHED_FIFO、优先级50启动程序
CFS参数则通过/proc/sys/kernel/路径调整:
-
sched_latency_ns控制一个调度周期目标时长(默认24ms) -
sched_min_granularity_ns设定最小调度粒度(防过细切片开销) - 这些只影响CFS,对RT进程完全无效











