最可靠方法是用 ps -eo pid,comm,cls,pri,nice,pcpu 查看:cls 显示调度策略(ts/SCHED_OTHER、ff/SCHED_FIFO、rr/SCHED_RR),pri 为内核最终优先级(0–139),nice 仅对 SCHED_OTHER 有效。

如何查看进程的实时优先级和调度策略
Linux 中每个进程都有一个调度策略(如 SCHED_FIFO、SCHED_OTHER)和两个相关数值:静态优先级(static_prio)、动态优先级(priority,即用户可见的 ni 值)。直接看 ps 或 top 最可靠:
-
ps -eo pid,comm,cls,pri,nice,pcpu --sort=-pcpu | head -10——cls显示策略(ts=SCHED_OTHER,ff=SCHED_FIFO,rr=SCHED_RR),pri是内核计算出的最终优先级值(范围 0–139),nice仅对SCHED_OTHER有效 -
top -p $PID进入后按f添加PR(实际调度优先级)、NI(nice 值)、ST(调度类型缩写)列 - 更底层可读
/proc/$PID/status中的policy:行和/proc/$PID/stat第 39/40 字段(rt_priority和policy)
用 chrt 修改实时调度策略和优先级
chrt 是修改调度策略最直接的工具,但注意:只有 root 或具备 CAP_SYS_NICE 能力的进程才能提升策略或设高实时优先级。
- 启动新进程并设为
SCHED_FIFO优先级 50:chrt -f 50 ./myapp - 修改已有进程:
chrt -f 50 $PID(若原策略非实时,会失败;需先确认进程未被锁定) - 切回默认策略:
chrt -o 0 $PID(-o等价于--other,即SCHED_OTHER) - 错误提示
Operation not permitted通常因权限不足或/proc/sys/kernel/sched_rt_runtime_us限制已耗尽
renice 只影响 SCHED_OTHER 进程的 CPU 时间份额
renice 不改变调度策略,也不影响实时进程。它只调整 niceness 值(-20 到 +19),该值参与 CFS 调度器中虚拟运行时间(vruntime)的计算,从而间接决定分配给该进程的 CPU 时间比例。
-
renice -n -5 $PID让普通进程“抢”更多 CPU(但不会抢占实时进程) -
renice -n 10 $PID降低其调度权重,适合后台批处理任务 - 对已用
chrt -f启动的进程执行renice无效 ——nice值仍显示,但内核完全忽略它 - 注意:普通用户只能调高
nice(让进程更“谦让”),调低必须有 root 权限
实时调度策略的危险点与调试线索
误用 SCHED_FIFO 或过高的 rt_priority 可导致系统无响应 —— 因为实时进程不主动让出 CPU,且不遵守 CFS 的时间片限制。
- 典型症状:
ssh登录卡住、鼠标不动、sysrq仍可用(Alt+SysRq+R解锁键盘,Alt+SysRq+T查看堆栈) - 检查是否启用了实时带宽限制:
cat /proc/sys/kernel/sched_rt_runtime_us(默认 950000,即 95%)和/proc/sys/kernel/sched_rt_period_us(默认 1000000);设为-1表示禁用限制(不推荐) - 避免在容器中随意启用
SCHED_FIFO—— 宿主机上所有实时进程共享同一全局带宽池,容器间无隔离 - 调试时优先用
chrt -p $PID确认当前策略,再结合ps的cls和pri列交叉验证
真实场景里,多数服务不需要实时调度;renice 配合 CFS 已足够调控资源倾向。一旦涉及 SCHED_FIFO,务必确认有配套的监控和熔断机制——比如用 systemd 的 CPUQuota= 限制整体占用,否则一个死循环就能拖垮整机。








