客服微信
本文为云贝教育 刘老师 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。
在 Linux 系统中,top 命令是监控系统资源和进程状态的重要工具。在 top 的交互界面中,PR(Priority)和 NI(Nice)是与进程调度优先级相关的两个关键参数。许多用户对它们的含义和关系感到困惑。本文将详细解释这两个参数,并探讨它们如何影响系统的进程调度。
1. PR(Priority):进程的动态优先级
PR 表示进程的 实时优先级(Real-time Priority),它是内核调度器在分配 CPU 时间片时的重要依据。取值范围和含义如下:
PR 值范围 |
含义 |
0 到 39 |
普通进程(非实时进程),数值越低,优先级越高(与 NI 共同决定)。 |
RT 或负值(如 -2) |
实时进程(Real-time Process),优先级高于所有普通进程。 |
普通进程:默认情况下,大多数进程属于此类,PR 值由 NI(Nice 值)动态计算得出,通常为 20 + NI。例如,若 NI=0,则 PR=20;若 NI=-5,则 PR=15。
实时进程:通过 SCHED_FIFO 或 SCHED_RR 调度策略运行的进程(如某些高实时性任务),其 PR 显示为 RT 或负数。实时进程的优先级高于所有普通进程。
2. NI(Nice):用户可调整的优先级偏移量
NI 是用户态进程的 友好值(Nice Value),允许用户间接调整进程的优先级。取值范围为 -20 到 19,默认值为 0。关键规则如下:
NI 越低,进程优先级越高:将 NI 设置为 -20 会让进程更频繁地获得 CPU 时间。
NI 越高,进程优先级越低:设置为 19 会让进程更“谦让”,减少对 CPU 的占用。
3. PR 与 NI 的关系
普通进程:PR = 20 + NI 例如:
NI=0 → PR=20
NI=-5 → PR=15
NI=10 → PR=30
实时进程:NI 无效
实时进程的优先级由 chrt 命令直接设置(范围为 1~99,1 为最低,99 为最高),此时 PR 显示为 RT 或负数(如 -2 对应实时优先级 98)。
4. 如何查看和修改 NI 与 PR
查看进程优先级:
top -p [PID] # 在 top 中查看特定进程的 PR 和 NI
示例如下
# top -p 1895 top - 11:27:18 up 1:55, 2 users, load average: 0.00, 0.00, 0.00 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 1960.7 total, 1230.0 free, 326.5 used, 404.2 buff/cache MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 1556.6 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1895 root 20 0 225616 4604 3852 S 0.0 0.2 0:00.43 top
修改 NI(普通进程):
# ps -eo pid,ni,pri,cmd | grep 1352 | grep -v grep 1352 0 19 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups # renice 10 1352 1352 (process ID) old priority 0, new priority 10 # 修改运行中进程的 NI=10 # ps -eo pid,ni,pri,cmd | grep 1352 | grep -v grep 1352 10 9 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
注意:普通用户只能降低优先级(NI ≥ 0),需 sudo 权限提升优先级(NI < 0)。
设置实时进程优先级:
这里,-f表示固定优先级调度策略,而99是最高优先级级别。请注意,这种操作通常需要超级用户权限,并且应当谨慎使用,以避免影响系统的整体稳定性。
5. 常见问题与误区
为什么修改 NI 后 PR 没有变化?
进程可能是实时进程(PR 显示为 RT),此时 NI 无效。
系统负载低时,优先级差异可能不明显。
PR 值为什么超过 39?
普通进程的 PR 理论最大值为 39(NI=19)。若看到更大的值,可能是内核版本差异或显示方式不同。
实时进程会“饿死”其他进程吗?
是的!实时进程若不主动释放 CPU(如循环执行 sleep),可能导致普通进程无法运行。需谨慎使用。
6. 总结
PR(Priority):动态优先级,决定内核调度顺序。
NI(Nice):用户可调的偏移量,仅影响普通进程。
实时进程:通过 chrt 设置,优先级高于普通进程,但需谨慎使用。
理解这两个参数,可以帮助你更高效地管理系统资源,优化关键任务的性能。如果需要临时提高某个进程的优先级,优先调整 NI;若需极致的实时性,再考虑实时进程策略。
想了解更多相关的学习资料(技术文章和视频),可以微信公众号或B站搜索《云贝教育》,免费获取。
需要课程资料的同学可以私聊课程顾问:19906733890(微信同号)