跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

如何在Linux中查看进程的调度优先级 Linux使用nice和renice的方法

PRI是内核动态计算的调度优先级值(越小越早调度),NI是用户可控的nice值,PRI≈80+NI;二者共同决定普通进程调度权重,但PRI会随进程行为动态调整,NI仅影响SCHED_OTHER策略进程。 ps -l 输出里的 PRI 和 NI 到底代表什么 直接看
ps -l
输出,关键就两个字段:
PRI
和
NI
。它们不是同一个东西,但一起决定进程实际被调度的“权重”。
PRI
是内核计算出的**动态优先级值**,数值越小,进程越早被 CPU 调度;普通进程默认是 80,范围通常是 60~99(对应
nice
-20 到 +19)。
NI
就是
nice
值,纯用户可控的修正项,只影响普通调度策略(
SCHED_OTHER
)下的进程。它不直接等于优先级,而是通过公式参与计算:
PRI = 80 + NI
(简化理解,实际受调度器细节影响略有浮动)。 常见误区: 把
NI
当成最终优先级——错,
NI
只是偏移量,
PRI
才是调度器真正看的数 认为
ps -l
显示的
PRI
永远固定——错,它会随进程行为(如睡眠/唤醒、CPU 使用率)被内核动态调整,但基线由
NI
锚定 用
top
的 “PR” 列和
ps -l
的
PRI
对比时发现数值不同——正常,
top
默认显示的是“实时优先级”视角(含内核动态调整),而
ps -l
更接近静态基线 用 nice 启动进程时的限制和实际效果
nice
只在进程启动时生效,且普通用户只能调低优先级(即增大
NI
,让
PRI
变大),不能提权。 例如:
nice -n 5 sleep 100
这个
sleep
进程的
NI
就是 5,
PRI
大概率为 85(80 + 5)。 注意点:
nice -n -5
会失败,除非你是 root——普通用户无权降低
NI
值
nice
不改变已运行进程,只对子进程有效;它本质是设置
fork()
后子进程的初始
NI
即使你指定
nice -n 19
,进程也不会“完全不被调度”,只是在同等条件下被排到队尾;调度器仍保障其最低执行时间片,避免饥饿 renice 修改运行中进程的 NI 值
renice
是修改已有进程
NI
的唯一标准命令,比
top
中按
r
更可控、可脚本化。 Docker Desktop(linux) 当前 Docker 最新稳定版本之一,主要针对稳定性和兼容性进行了修复优化,适合生产环境与日常开发使用。该版本继续强化 AI 开发支持、容器日志管理以及 Docker Engine 的安全能力,对 Windows/macOS/Linux 平台兼容性进行了进一步优化。 下载 基本用法:
renice -n 10 -p 1234
把 PID 为
1234
的进程
NI
改为 10。 关键约束: 普通用户只能对自己拥有的进程调用
renice
,且只能增加
NI
(即降低优先级) root 用户可以任意修改任何进程的
NI
,包括设为 -20
renice
不会立即中断进程,新
NI
在下一次调度决策时生效,所以变化不是“瞬时可见”的 对实时进程(
SCHED_FIFO
/
SCHED_RR
)调用
renice
无效——这些进程走另一套优先级体系,得用
chrt
为什么 top 里看到的 PR 和 ps 的 PRI 数值经常对不上 这不是 bug,是设计使然。
top
的
PR
列显示的是“**调度器当前赋予该进程的实际优先级**”,它融合了:
NI
、内核的动态补偿(如交互式进程提权)、CPU 使用历史、是否刚被唤醒等因子。 而
ps -l
的
PRI
更偏向“静态基线”,更接近
80 + NI
的理论值。 这意味着: 一个刚从 sleep 唤醒的交互式进程,在
top
中
PR
可能显示为 75(被临时提权),但
ps -l
仍显示
PRI
为 80
top
的
NI
列和
ps -l
的
NI
总是一致的——因为它是用户唯一能直接控制的输入项 如果你要写监控脚本判断“某个进程是否被降级”,别依赖
PR
,盯住
NI
或用
ps -o pid,ni,pri
固定输出字段更可靠 最易被忽略的一点:所有基于
nice
/
renice
的调整,只对
SCHED_OTHER
策略有效。一旦进程被
chrt
设为实时调度,
NI
就彻底失效,此时看
ps -eo pid,cls,pri
里的
cls
(class)字段才能确认策略类型。

相关文章