如何从 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 和 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