“良好”和“不受欢迎”的用户进程究竟是什么意思?

Alc*_*ist 4 nice top

我正在使用“top”命令,我发现了不错的价值。我知道优先级以及一个好的值如何指示进程的优先级。但我似乎无法弄清楚“好”或“未好”这个词是什么意思。

ter*_*don 5

这些术语仅指进程的默认 nice 值是否已更改。“良好的”进程是使用nice命令运行的进程(或者其niceness 已被 更改renice),而“未使用的”进程是未使用nice. 常规进程(那些尚未运行nice command或随后未更改其nice 值的进程)的默认nice 值为renice PID0。因此,“un-niced”进程是nice 值为0 和“niced”的进程进程是那些具有很好价值的进程!= 0。

nice值并不表示进程的优先级,它表示进程的niceness。您可以在以下输出中看到这两个值top

$ top -b -n1 | head
top - 15:23:10 up 20:59,  1 user,  load average: 1.41, 1.75, 1.88
Tasks: 222 total,   1 running, 221 sleeping,   0 stopped,   0 zombie
%Cpu(s): 14.2 us,  7.9 sy,  0.0 ni, 76.6 id,  0.6 wa,  0.0 hi,  0.6 si,  0.0 st
GiB Mem :    7.791 total,    3.082 free,    3.862 used,    0.846 buff/cache
GiB Swap:   16.000 total,   15.793 free,    0.207 used.    3.485 avail Mem 

  PID USER      PR  NI    VIRT    RES  %CPU %MEM     TIME+ S COMMAND
 1591 terdon    20   0 1605.1m 362.3m  18.8  4.5 285:46.34 S chromium
 1754 terdon    20   0  790.8m 184.5m  18.8  2.3 405:54.21 S chromium
 1186 terdon    20   0 1992.8m 459.6m  12.5  5.8 119:31.59 S cinnamon
                ^^  ^^
                 |   |---------> niceness
                 |-------------> priority
Run Code Online (Sandbox Code Playgroud)

如果我现在为这些铬工艺之一设置一个不错的值,您将看到不同之处:

$ renice 10 1591
1591 (process ID) old priority 0, new priority 10

$ top -b -n1 | head
top - 15:24:56 up 21:01,  1 user,  load average: 0.89, 1.48, 1.77
Tasks: 225 total,   1 running, 224 sleeping,   0 stopped,   0 zombie
%Cpu(s): 14.2 us,  7.9 sy,  0.0 ni, 76.6 id,  0.6 wa,  0.0 hi,  0.6 si,  0.0 st
GiB Mem :    7.791 total,    3.033 free,    3.908 used,    0.849 buff/cache
GiB Swap:   16.000 total,   15.793 free,    0.207 used.    3.439 avail Mem 

  PID USER      PR  NI    VIRT    RES  %CPU %MEM     TIME+ S COMMAND
 1591 terdon    30  10 1605.1m 362.6m  23.5  4.5 286:10.40 S chromium
 1754 terdon    20   0  790.8m 184.5m  18.8  2.3 405:54.21 S chromium
 1186 terdon    20   0 1992.8m 459.6m  12.5  5.8 119:31.59 S cinnamon
Run Code Online (Sandbox Code Playgroud)

进程的nice 值用于确定其优先级,但进程(PR列)的实际优先级与其niceness 不同。简而言之,niceness值决定了一个进程对系统中其他进程的“好”程度。如果它非常好(nice 值高),它将是“礼貌的”并允许其他进程优先并使用更多的 CPU 时间(换句话说,它将具有低优先级)。如果它不好,它将尝试为自己获得尽可能多的 CPU 时间(因此它将具有高优先级)。

更奇怪的是,优先级值的范围从 -20(最高)到 +20(最低),niceness 值的范围从 19(最高niceness,所以优先级最低)到 -20(最低niceness,所以最高优先事项)。

我不知道将 niceness 值转换为优先级的确切机制。细节似乎取决于内核版本和具体实现(请参阅此处的“注释”部分)。但是,作为粗略的近似值,您可以将其视为:

Priority = DefaultPriority + Niceness
Run Code Online (Sandbox Code Playgroud)

为了说明这一点,我将启动一个名为foo.sh(仅运行一个sleep命令)的具有不同 niceness 值的脚本的 3 个实例:

foo.sh &                # default
nice -n 10 foo.sh
nice -n 15 foo.sh
sudo nice -n -10 foo.sh 
Run Code Online (Sandbox Code Playgroud)

最后一个使用,sudo因为只有 root 可以启动具有负(高)优先级的进程。现在,让我们看看他们的优先事项是什么:

$ top -b -n1 | grep foo.sh
21958 terdon    20   0   13.3m   2.7m   0.0  0.0   0:00.00 S foo.sh
22148 terdon    30  10   13.3m   2.7m   0.0  0.0   0:00.00 S foo.sh
22181 terdon    35  15   13.3m   2.7m   0.0  0.0   0:00.00 S foo.sh
23480 root      10 -10   13.3m   2.6m   0.0  0.0   0:00.00 S foo.sh
Run Code Online (Sandbox Code Playgroud)

如上所示,优先级等于 niceness 值和 20(默认优先级)的总和。