Linux 进程优先级与调度策略

8次阅读

最可靠方法是用 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 进程优先级与调度策略

如何查看进程的实时优先级和调度策略

linux 中每个进程都有一个调度策略(如 SCHED_FIFOSCHED_OTHER)和两个相关数值:静态优先级(static_prio)、动态优先级(priority,即用户可见的 ni 值)。直接看 pstop 最可靠:

  • ps -eo pid,comm,cls,pri,nice,pcpu --sort=-pcpu | head -10 —— cls 显示策略(ts=SCHED_OTHERff=SCHED_FIFOrr=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_prioritypolicy

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 确认当前策略,再结合 psclspri 列交叉验证

真实场景里,多数服务不需要实时调度;renice 配合 CFS 已足够调控资源倾向。一旦涉及 SCHED_FIFO,务必确认有配套的监控和熔断机制——比如用 systemdCPUQuota= 限制整体占用,否则一个死循环就能拖垮整机。

text=ZqhQzanResources