运行时top
,我可以看到这个(缩短的)示例输出:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4586 ipc-adm+ 20 0 1303900 605152 92844 S 30,6 29,3 3:52.88 firefox
3985 ipc-adm+ 20 0 258588 124508 63072 S 12,2 6,0 0:40.04 compiz
3092 root 20 0 172392 56164 25980 S 6,1 2,7 0:30.13 Xorg
我感兴趣的有两个值:(PR
优先级)和NI
(友善度)。
如果我理解正确的话,两者都决定了一个进程相对于其他进程将获得多少 CPU 时间。但是这些值之间有什么区别呢?
您能否描述一下如何操纵流程的这些值,以及在什么情况下这可能有用?
答案1
Nice 值是用户空间的,优先级 PR 是 Linux 内核使用的进程的实际优先级。在 Linux 系统中,优先级为 0 到 139,其中 0 到 99 为实时优先级,100 到 139 为用户优先级。nice 值范围为 -20 到 +19,其中 -20 为最高,0 为默认值,+19 为最低。nice 值和优先级之间的关系为:
PR = 20 + NI
因此,的值为PR = 20 + (-20 to +19)
0 到 39,将 100 映射到 139。
根据顶级手册:
PR——优先级 任务的调度优先级。如果您在此字段中看到“rt”,则表示该任务在“实时”调度优先级下运行。
NI 是任务的良好值。
NI——Nice 值 任务的 Nice 值。负 Nice 值表示优先级较高,而正 Nice 值表示优先级较低。此字段为零仅表示在确定任务的调度能力时不会调整优先级
编辑:默认情况下,在 Linux 中启动程序时,其优先级为“0”。但是,您可以通过以下任一方法更改程序的优先级。
您可以使用以下方式启动具有所需优先级的程序
nice -n nice_value program_name
您还可以使用以下方法更改已运行进程的优先级
renice -n nice_value -p process_id
答案2
什么是优先级?为什么我应该关心?
谈到进程时,优先级就是管理处理器时间。处理器或 CPU 就像一个人同时处理多个任务。有时我们有足够的空间来处理多个项目。有时我们一次只能专注于一件事。其他时候,一些重要的事情突然出现,我们想把所有的精力都投入到解决这个问题上,而把不太重要的任务放在次要位置。
在 Linux 中,我们可以为 CPU 设置准则,让其在查看所有必须执行的任务时遵循这些准则。这些准则称为精细度或精细值。Linux 精细度等级从 -20 到 19。数值越低,任务的优先级越高。如果精细度值较高(如 19),则任务的优先级将设置为最低,并且 CPU 会在有机会时处理该任务。默认精细值为零。
通过使用此比例,我们可以更合理地分配 CPU 资源。可以将不重要的低优先级程序设置为更高的 nice 值,而将守护程序和服务等高优先级程序设置为获得更多 CPU 关注。您甚至可以为特定用户的所有进程赋予较低的 nice 值,这样您就可以限制它们减慢计算机核心服务的速度。
使用 设置新进程的优先级nice
,例如
nice -n 10 firefox
对于现有流程
renice 10 -p $(pgrep firefox)
<0
要设置您需要的优先级sudo
,例如:
renice -1 -p $(pgrep firefox)
renice: failed to set priority for 2769 (process ID): Permission denied
但不是优先考虑>=0
例子
% ps -o pid,comm,pri,nice -p $(pgrep firefox)
PID COMMAND PRI NI
2769 firefox 19 0
% renice 10 -p 2769 # note, we don't need sudo here
2769 (process ID) old priority 0, new priority 10
% ps -o pid,comm,pri,nice -p $(pgrep firefox)
PID COMMAND PRI NI
2769 firefox 9 10
% sudo renice -19 -p 2769
2769 (process ID) old priority 10, new priority -19
% ps -o pid,comm,pri,nice -p $(pgrep firefox)
PID COMMAND PRI NI
2769 firefox 38 -19
其他例子
为特定用户重新安排所有正在运行的进程的优先级
renice 20 -u user_name
答案3
简短答案
PR 是优先级别。PR 越低,进程的优先级越高。
PR 的计算方法如下:
- 对于正常过程:
PR = 20 + NI
(NI 很好,范围从 -20 到 19) - 对于实时进程:
PR = - 1 - real_time_priority
(real_time_priority 范围从 1 到 99)
长答案
有两种类型的过程,普通的个和即时的。
对于正常的(并且只针对正常的),nice 的应用如下:
好的
“优先级”范围从 -20 到 19,其中 -20 为最高优先级,19 为最低优先级。优先级计算如下:
PR = 20 + NI
其中 NI 是良好级别,PR 是优先级。因此,我们可以看到,-20 实际上映射到 0,而 19 映射到 39。
默认情况下,程序的 nice 值为 0,但 root 用户可以使用以下命令启动具有指定 nice 值的程序:
nice -n <nice_value> ./myProgram
即时的
我们还可以更进一步。nice 优先级实际上用于用户程序。UNIX/LINUX 总体优先级的范围为 140 个值,而 nice 值使进程能够映射到范围的最后部分(从 100 到 139)。此等式使 0 到 99 之间的值无法达到,这将对应于负 PR 级别(从 -100 到 -1)。为了能够访问这些值,应将进程声明为“实时”。
LINUX环境中有5种调度策略,可以用以下命令显示:
chrt -m
将显示以下列表:
1. SCHED_OTHER the standard round-robin time-sharing policy
2. SCHED_BATCH for "batch" style execution of processes
3. SCHED_IDLE for running very low priority background jobs.
4. SCHED_FIFO a first-in, first-out policy
5. SCHED_RR a round-robin policy
调度进程可以分为两组,普通调度策略(1 至 3)和实时调度策略(4 和 5)。实时进程始终优先于普通进程。可以使用以下命令调用实时进程(示例是如何声明 SCHED_RR 策略):
chrt --rr <priority between 1-99> ./myProgram
为了获得实时过程的 PR 值,应用以下公式:
PR = -1 - rt_prior
其中rt_prior
对应于 1 至 99 之间的优先级。因此,优先级高于其他进程的进程将是编号为 99 的进程。
值得注意的是,对于实时进程来说,nice 值不被使用。
要查看进程当前的“niceness”和 PR 值,可以执行以下命令:
top
显示以下输出:
图中显示了 PR 和 NI 值。值得注意的是,PR 值为 -51 的进程对应于实时值。还有一些进程的 PR 值表示为“rt”。该值实际上对应于 PR 值 -100。