如何从 NICE 值中理解进程的优先级?

如果我们考虑查看 NICE 值以确定进程的优先级,那么正如我上面所说,它的值范围从 -20 到 19,其中

  • -20(进程具有高优先级并获得更多资源,从而减慢其他进程的速度)
  • 19(进程优先级较低,自身运行较慢,但对其他运行进程的速度影响较小)

因此,如果我们希望任何进程获得高优先级(考虑到其他进程可能会变慢),我们可以将它们的优先级更改为最高 -20 的任何负值,这将减少进程的执行时间并且进程将更快地完成比较。

示例

运行一个 nice 值为 -20 的进程

# time nice --20 seq 4234567 > file.txt
real    0m2.572s
user    0m2.519s
sys     0m0.047s

删除文件并运行相同的进程,nice 值为 +20

# time nice -20 seq 4234567 > file.txt
real    0m2.693s
user    0m2.626s
sys     0m0.059s

正如我们所看到的,前一个命令使用负的 nice 值执行得更快。

描述
real它表示命令以来,以来将其启动到其终止以来执行的时间
user它表示命令/程序执行自己代码的时间量
sys它代表UNIX射击命令所花费的时间

如何从 PRIORITY 值理解进程的优先级?

同样,如果我们考虑查看 PR 值以了解进程的优先级,该值的范围从 0 到 39,其中

  • 0(进程优先级高,获得更多资源,从而减慢其他进程的速度)
  • 39(进程优先级较低,自身运行较慢,但对其他运行进程的速度影响较小)

示例

运行具有正nice值的进程

# time nice -20 seq 42345671 > file.txt
real    0m27.548s
user    0m26.091s
sys     0m1.004s

如我们所见,我们正在运行一个 nice 值 +20 的进程,其 NI 显示为 19,PR 显示为 39,这意味着该进程将具有最低优先级,它将优先考虑其他具有较高 nice 值的进程以使用系统资源他们的执行。

# top
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3192 root      39  19  4084  568  512 R 99.8  0.1   0:03.29 seq
    1 root      20   0  2892 1420 1200 S  0.0  0.1   0:01.29 init

同样对于负的nice值

# time nice --20 seq 42345671 > file.txt
real    0m27.397s
user    0m26.555s
sys     0m0.600s

如我们所见,当 PR 值为 0 时,NI 值更改为 -20。

# top
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3205 root       0 -20  4084  568  512 R 75.0  0.1   0:02.26 seq
    1 root      20   0  2892 1420 1200 S  0.0  0.1   0:01.29 init

如果我给出一个超出范围的nice值会发生什么,例如:-20 到 19 给任何进程?

它可能发生,但系统不会理解除 -20 到 19 之外的任何值,并且将采用默认值 -20 表示高优先级,19 表示最低优先级。

示例

分配一个nice值 -40

# time nice --40 seq 42345671 > file.txt

但仍然如我们所见,系统将 nice 值设为 -20,这是最高可识别的值

# top
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3226 root       0 -20  4084  568  512 R  7.6  0.1   0:00.23 seq
 1600 root      20   0 38616 3976 3284 S  0.3  0.4   0:01.68 vmtoolsd

分配一个nice值 40

# time nice -40 seq 42345671 > file.txt

top 显示该进程使用 19 作为nice值。

# top
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3235 root      39  19  4084  568  512 R 62.0  0.1   0:01.87 seq
 2899 root      20   0  2704 1128  868 R  0.7  0.1   0:08.66 top

如果要手动检查 nice 值以及任何进程的 CPU 和内存使用情况,请使用此命令

# ps -o pid,pcpu,pmem,ni -p 88
 PID %CPU %MEM  NI
  88  0.0  0.0 -10

这将显示 PID、%CPU、%MEM 和 nice 值以及进程 ID,其中 88 是进程 ID。

什么是nice 以及如何更改 Linux 中任何进程的优先级?

如果我们想更改任何进程的优先级,我们需要考虑两件事。
本文中将使用两个术语,例如:NICE 和 PRIORITY。

如果我们在运行 top 命令时没有注意到,我们会为任何进程获得两个不同的值,因为我在下面用不同的颜色进行了标记

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 2899 root      20   0  2704 1128  868 R  0.3  0.1   0:02.26 top
    1 root      20   0  2892 1420 1200 S  0.0  0.1   0:01.29 init

这里 PR 表示 PRIORITY,NI 表示 NICE 值,其中 Linux 中任何进程的 PRIORITY 范围从 0 到 39 不等,NICE 值从 -20 到 19 不等。

nice命令 打印或者修改进程的“niceness”,一个影响进程是否被顺利调度的参数。

语法

# nice [OPTION] [COMMAND [ARG]...]

例子:
下面的命令将给出一个很好的值 -20 到 2342 PID

# nice --20 2342

注意:使用 (--) 给出负的 nice 值,使用 (-) 给出正的 nice 值

下面的命令将给出一个很好的值 20 到 2342 PID

# nice -20 2342

如何更改正在运行的进程的 nice 值?

在上面的例子中,我用一个预定义的 nice 值启动了进程,但是如果进程正在运行并且你想改变它的 nice 值怎么办。
为此,我们有另一个命令,例如:renice

语法

# renice [-n] priority [[-p] pid ...]

一些例子:

# seq 4234567112 > file.txt
# top
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3354 root      20   0  4084  568  512 R 95.4  0.1   0:07.19 seq

将 nice 值更改为 -5

# renice -n -5 -p 3354
3354: old priority 0, new priority -5
# top
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3354 root      15  -5  4084  568  512 R 99.7  0.1   0:30.26 seq

将 nice 值更改为 10

# renice -n 10 -p 3354
3354: old priority -5, new priority 10
# top
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3354 root      30  10  4084  568  512 R 99.1  0.1   0:51.16 seq

将 nice 值更改为 -15

# renice -n -15 -p 3354
3354: old priority 10, new priority -15
# top
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3354 root       5 -15  4084  568  512 R 98.0  0.1   1:12.04 seq

进程的默认 NI 值是多少?

对于在 Linux 下运行的任何进程,默认 NI 值为 0,PR 值为 20。

如何永久修改用户或者组的 nice 值?

上面显示的示例是基于终端的,因此是临时的。
一旦我们重新启动机器,默认的 nice 值将适用于定义的用户。

要使这些更改永久化,请按照以下步骤操作:

注意:我们可以使用 PR 值或者 NI 值来设置优先级。
我建议使用 NICE 值

# vi /etc/security/limits.conf
jack hard priority 5

这会将用户 jack 的硬优先级设置为“5”

如何更改用户组中用户的nice值?

使用以下命令也可以对任何特定组执行同样的操作

# renice -n 5 -g work

对于在其所有权下运行的任何进程,上述命令会将“work”组的默认 nice 值更改为 5.

如何更改任何用户的nice值?

假设我们不希望特定用户使用大部分系统资源,在这些情况下,我们可以分配较低的 nice 值,以便该用户启动的每个进程将使用较少的系统资源。

# renice -n 5 -u jack
500: old priority 0, new priority 5

由用户“jack”执行进程

[jack@test ~]$seq 12345678 > file.txt

验证“jack”的 nice 值

# top
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 4414 jack    25   5  4084  588  532 R 97.3  0.1   0:05.54 seq
日期:2020-06-02 22:17:37 来源:oir作者:oir