文章 > TDSQL > 深入解析 Linux top 命令中的 PR 和 NI:进程优先级与调度机制

深入解析 Linux top 命令中的 PR 和 NI:进程优先级与调度机制

炎燚小寶 · 2025-02-13 155 TDSQL
分享 收藏

在 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. PRNI 的关系

  • 普通进程PR = 20 + NI 例如:

  • NI=0 → PR=20

  • NI=-5 → PR=15

  • NI=10 → PR=30

  • 实时进程NI 无效

实时进程的优先级由 chrt 命令直接设置(范围为 1~991 为最低,99 为最高),此时 PR 显示为 RT 或负数(如 -2 对应实时优先级 98)。

4. 如何查看和修改 NIPR

  • 查看进程优先级

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)。

  • 设置实时进程优先级

sudo chrt -f -p 99 $(pgrep mysqld)    # 将进程设置为 SCHED_FIFO 策略,实时优先级 99(PR 显示为 RT/-99)

这里,-f表示固定优先级调度策略,而99是最高优先级级别。请注意,这种操作通常需要超级用户权限,并且应当谨慎使用,以避免影响系统的整体稳定性。

5. 常见问题与误区

  1. 为什么修改 NI 后 PR 没有变化?

  • 进程可能是实时进程(PR 显示为 RT),此时 NI 无效。

  • 系统负载低时,优先级差异可能不明显。

  1. PR 值为什么超过 39?

普通进程的 PR 理论最大值为 39NI=19)。若看到更大的值,可能是内核版本差异或显示方式不同。

  1. 实时进程会“饿死”其他进程吗?

是的!实时进程若不主动释放 CPU(如循环执行 sleep),可能导致普通进程无法运行。需谨慎使用。

6. 总结

  • PR(Priority):动态优先级,决定内核调度顺序。

  • NI(Nice):用户可调的偏移量,仅影响普通进程。

  • 实时进程:通过 chrt 设置,优先级高于普通进程,但需谨慎使用。

理解这两个参数,可以帮助你更高效地管理系统资源,优化关键任务的性能。如果需要临时提高某个进程的优先级,优先调整 NI;若需极致的实时性,再考虑实时进程策略。


点击加载更多