学习 Linux 命令:nice 和 renice
用户在执行时为其自己的进程附加优先级值的能力决定了您是否对同一系统上的其他用户友好。您是出于友善还是只是无缘无故地滥用系统资源?在本文中,您将了解如何根据进程消耗的处理能力来管理进程,以及如何使用 nice 和 更改进程的优先级值renice Linux 命令。我们将从一些关于什么是进程、进程调度、如何 fork 新进程的基本理论开始,然后我们转向 nice 命令并解释如何更改进程优先级值。
简而言之,进程是 Linux 用来承担正在运行的程序角色的命名约定。进程是规则的集合,任何特定程序都可以通过这些规则来使用分配的处理器时间、内存和 I/O 资源。 Linux 系统上运行的每个进程都有自己的进程 ID (PID),可以通过它进行监视和管理。
Linux 内核旨在收集有关每个进程的各种信息。这些包括但不限于:
进程状态(可运行、睡眠、僵尸或停止)
进程执行优先级(niceness)
有关已使用资源的信息
进程的所有者
每个特定进程打开了哪些网络端口和文件
和更多…
现在我们已经了解了流程是什么,我们可以继续创建一些流程。为此,只需打开终端并在后台执行 yes 命令并将其输出重定向到 /dev/null :
$ yes > /dev/null &
[1] 5997
之后使用 ps -l 命令我们无法提取有关 yes 进程的信息:
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 5830 3283 0 80 0 - 6412 wait pts/0 00:00:00 bash
0 R 1000 5997 5830 99 80 0 - 1757 - pts/0 00:00:09 yes
0 R 1000 5998 5830 0 80 0 - 2399 - pts/0 00:00:00 ps
从上面我们可以读到以下信息:
F – 标志:进程不是以超级用户权限启动的。否则我们会看到数字 4 或 1 和 4 的和。查看 man ps 了解更多信息。
S – STATE:进程当前正在运行
UID – 发起该进程的用户的用户 ID。 UID实际上是EUID(有效用户ID)的别名
PID – yes 命令的进程 ID 是 5997
PPID – 父进程 ID。这是一个进程 ID,我们的 yes 命令是从中派生出来的。在本例中,它是 PID 为 5830 的 bash。
C – 处理器利用率的整数值(以 % 为单位)。
PRI – 进程优先级。值越高,优先级越低。
NI – 好值,范围从 -20 到 19。值越高,您对其他用户越友善,换句话说,值越高,优先级越低。
进程调度
如果您不想深入了解有关进程优先级和调度的更多详细信息,可以跳过本节。在这里,我们将尝试用一些易于理解的基本总结来描述 Linux 流程,因为这个主题可能跨越多个页面,并且这将是唯一的介绍。
从我们的角度来看,我们需要了解 Linux(Linux 内核版本 >= 2.6)调度程序是抢占式的。这是一种允许内核抢先选择执行优先级较高的任务而不是优先级较低的任务的能力。此外,内核将实时任务和用户任务的优先级列表分别划分为 1 – 100 和 101 – 140。
此外,Linux 内核为较高优先级任务分配较长的量子时间,为较低优先级任务分配较短的量子时间,分别约为 200 ms 和 10 ms。换句话说,每个任务只有在有剩余时间片时才被允许执行。因此,较短的执行时间片会导致进程在活动运行队列中停留的时间较短,从而消耗较少的资源。一旦进程时间片为空,进程就会被移动到过期运行队列,在那里它的优先级被重新计算,然后再次移动到活动运行队列。这种关系如右图所示。值得一提的是,活动运行队列和过期运行队列都包含按优先级排序的任务列表。
流程生命周期
Linux进程管理的基本原理在创建新进程时包含两个不同的操作。该操作是进程通过fork()调用复制自身,从而创建一个具有唯一PID的新进程。 fork 操作后最常见的是执行新程序的 exec() 操作。启动期间创建的第一个进程是 init,它始终分配 PID 1。所有其他进程都被视为 init 进程的子进程。正常情况下,在允许子进程死亡之前,父进程需要通过发送退出值来确认此事件。成功终止发送父进程值 0。如果由于某种原因子进程比父进程寿命长,init 将接受该进程作为孤立进程。
由于处理能力多年来一直呈指数级增长,因此良好指挥的重要性正在以同样的速度下降。因此,就在今天,您将被迫手动更改进程优先级。尽管如此,这种能力仍然存在,并且在某些情况下仍然可能有用。默认情况下nice会将nice级别设置为10。
$ nice yes > /dev/null &
[1] 5199
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 3383 3380 0 80 0 - 6445 wait pts/0 00:00:00 bash
0 R 1000 5199 3383 99 90 10 - 1757 - pts/0 00:00:07 yes
0 R 1000 5200 3383 0 80 0 - 2399 - pts/0 00:00:00 ps
要使用 10 以外的其他好值启动进程,我们可以使用 -n 开关。
$ nice -n 15 yes > /dev/null &
OR
$ nice -15 yes > /dev/null &
[1] 5270
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 3383 3380 0 80 0 - 6447 wait pts/0 00:00:00 bash
0 R 1000 5270 3383 99 95 15 - 1757 - pts/0 00:00:02 yes
0 R 1000 5271 3383 0 80 0 - 2399 - pts/0 00:00:00 ps
要将好值设置为低于 0,需要 root 权限。 Nice仍然会启动程序,但是nice值将设置为0。这里,我们尝试在没有root权限的情况下将nice值设置为-1:
$ nice -n -1 yes > /dev/null &
[1] 5285
nice: cannot set niceness: Permission denied
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 3383 3380 0 80 0 - 6447 wait pts/0 00:00:00 bash
0 R 1000 5285 3383 95 80 0 - 1757 - pts/0 00:00:07 yes
0 R 1000 5295 3383 0 80 0 - 2399 - pts/0 00:00:00 ps
因此,为了将nice值设置为低于0,我们需要以root身份或使用sudo执行上述程序。
# nice -n -1 yes > /dev/null &
[1] 5537
# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 5428 3383 0 80 0 - 14430 wait pts/0 00:00:00 su
0 S 0 5436 5428 1 80 0 - 7351 wait pts/0 00:00:00 bash
4 R 0 5537 5436 87 79 -1 - 1757 - pts/0 00:00:04 yes
4 R 0 5538 5436 0 80 0 - 2399 - pts/0 00:00:00 ps
在上一节中,我们学习了如何使用nice命令以预设nice值启动程序。在这里,我们尝试使用 renice 命令更改正在运行的程序的nice值。这里,我们有一个正在运行的 yes 程序,nice 值为 10:
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 3383 3380 0 80 0 - 6447 wait pts/0 00:00:00 bash
0 R 1000 5645 3383 99 90 10 - 1757 - pts/0 00:00:04 yes
0 R 1000 5646 3383 0 80 0 - 2399 - pts/0 00:00:00 ps
要更改其值,我们可以使用 renice 命令并提供 PID 和 Nice 值。让我们将nice值更改为15:
$ renice -n 15 -p 5645
5645 (process ID) old priority 10, new priority 15
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 3383 3380 0 80 0 - 6447 wait pts/0 00:00:00 bash
0 R 1000 5645 3383 99 95 15 - 1757 - pts/0 00:00:31 yes
0 R 1000 5656 3383 0 80 0 - 2399 - pts/0 00:00:00 ps
要遵循的规则是非超级用户只能为任何进程增加nice值(给予较低的优先级)。如果现在尝试将良好值从 15 更改回 10,则会出现以下错误:
$ renice -n 10 -p 5645
renice: failed to set priority for 5645 (process ID): Permission denied
renice 命令还使 root 用户能够更改任何用户进程的好值。这是通过 -u 开关完成的。以下linux命令会将所有用户进程的优先级更改为-19。
# renice -n -19 -u lubos
1000 (user ID) old priority 0, new priority -19
Nice 命令可以是一个方便的工具,并且肯定易于使用。请注意,您还可以使用 top 命令来调整过程值。