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