运行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 楼

好的值是用户空间,优先级PR是Linux内核使用的进程的实际优先级。在linux系统中,优先级为0到139,其中实时为0到99,用户为100到139。
好的值范围是-20到+19,其中-20最高,默认值为0,+ 19最低。
好的值和优先级之间的关系是: />
因此,PR = 20 + (-20 to +19)的值是0到39,代表100到139。

根据高级手册:


PR-优先级任务的调度优先级。如果您在此字段中看到
'rt',则表示任务正在“实时”下运行。
计划优先级。 NI-不错的价值任务的不错的价值。 nice
负值表示较高的优先级,而nice值正数表示优先级较低。该字段中的零仅表示在确定任务的调度能力时不会调整优先级>

编辑:
默认情况下,在Linux中启动程序时,程序的启动优先级为'0'。但是,您可以通过以下两种方法之一来更改程序的优先级。



您可以使用

以所需的优先级启动程序。
PR = 20 + NI



还可以使用

更改已经运行的进程的优先级
nice -n nice_value program_name




评论


您是说,它们几乎是相反的东西(两者都表示优先级),但是可以将优先级设置为负数,以使具有优先级的任务避开高优先级任务? (即,允许其他访问资源很好吗?或者这只是让我感到困惑?

–马克·柯比(Mark Kirby)
15年8月5日在9:59

我的意思是一个示例,两个任务的pr均为20,所以相等,任务一的ni为0,任务二的ni为20,因此,这意味着任务二将为任务一放弃资源因为它更好

–马克·柯比(Mark Kirby)
15年8月5日在10:05

据我所知,优先级计算为PR = 20 + NI。因此,任务一优先级= 20 +0。友善的最大值+19

– pl_rock
2015年8月5日在10:36



PR = 20 + NI最大值可以是39。实际上,在Linux系统中,有139个优先级,其中0到99是实时优先级,对于用户有100到139。因此,NI值-20至+19映射为优先级100至139。你可以调整的。但是内核仍然不确定是否更改NI值会改变优先级,NI值只是对内核的建议。内核有一段时间忽略它

– pl_rock
15年8月5日在10:50

那么PR和NI实际上是相等的,因为它们只是一个不同的偏移量?那为什么我们同时拥有这两个价值观?您还可以添加设置进程的优美度<0需要根权限。

–Byte Commander♦
2015年8月5日,12:22

#2 楼

什么是优先级,为什么我要关心?

谈论进程优先级时,只不过是管理处理器时间。处理器或CPU就像人类同时处理多个任务。有时我们可以有足够的空间来进行多个项目。有时我们一次只能专注于一件事。有时,一些重要的事情突然冒出来,我们希望全力以赴地解决问题,同时将次要的任务放在后面的刻录机上。

在Linux中,我们可以设置CPU遵循的指导原则正在查看其必须完成的所有任务。这些准则称为好感或好的价值。 Linux的友好程度从-20到19。数字越小,任务获得的优先级越高。如果niceness值是高数字(例如19),则该任务将被设置为最低优先级,并且CPU将在有机会时对其进行处理。默认的nice值为零。

通过使用此比例,我们可以更适当地分配CPU资源。可以将不重要的较低优先级程序设置为较高的值,而可以将诸如守护程序和服务之类的高优先级程序设置为获得更多CPU的关注。您甚至可以为特定用户的所有进程提供较低的价值,以便限制他们减慢计算机核心服务的能力。



设置使用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



其他示例

为特定用户放弃所有正在运行的进程

% 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 10也可以在没有sudo的情况下工作,对吗?您能否添加一个示例来使特定用户的所有流程更加美观?如果其他人同时登录并且正在运行一些不必要但占用资源的进程(例如Firefox中暂停的Flash游戏,小兄弟会做这些事情...:-/),那实际上将非常有用。

–Byte Commander♦
2015年8月5日,12:25

@ByteCommander完成=)

– A.B.
2015年8月5日13:02

一段时间后,如何恢复该用户的旧值?将其设置回0?这不会考虑到某些进程之前可能具有不同的niceness值。有没有简单的可能性可以做到这一点?

–Byte Commander♦
15年8月5日,13:04

@ByteCommander不,这并不简单。您使用0或…都有问题;)

– A.B.
2015年8月5日13:11



在renice -19之后,ps的结果为:PRI:38,NI:-19,但是最上面的是PR:1,NI -19为什么?

–唤醒
18年2月20日在16:27

#3 楼

简短回答
PR是优先级。 PR越低,该过程的优先级越高。 /> 19)
用于实时过程:PR = 20 + NI
(实时优先级范围从1到99)

长答案
有2种类型的过程,正常的和实时。
对于普通的(并且仅针对那些),nice的应用如下:
尼斯
“尼斯”的标度从-20变为19,而-20是最高优先级,而19是最低优先级。优先级的计算方法如下:
其中NI为优先级,PR为优先级。正如我们所看到的,-20实际上映射为0,而19映射为39。
默认情况下,程序的nice值为0,但是root用户可以使用指定的nice启动程序通过使用以下命令获取值:
PR = 20 + NI

实时
我们可以走得更远。好优先级实际上用于用户程序。 UNIX / LINUX总体优先级的范围为140个值,而nice值使进程可以映射到范围的最后一部分(从100到139)。该公式使从0到99的值不可用,这将对应于负PR级别(从-100到-1)。为了能够访问这些值,该过程应声明为“实时”。
LINUX环境中有5种调度策略,可以使用以下命令显示:
nice -n <nice_value> ./myProgram 

将显示以下列表:
chrt -m 

调度过程可以分为2组,正常调度策略(1到3)和实时调度策略(4和5)。 />实时流程始终比普通流程具有更高的优先级。可以使用以下命令来调用实时过程(示例是如何声明SCHED_RR策略):
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

要获得实时过程的PR值,请使用以下公式:
chrt --rr <priority between 1-99> ./myProgram

其中PR = - 1 - real_time_priority对应于1到99之间的优先级。因此,该过程的优先级高于其他过程将被称为数字99。
需要注意的是,对于实时过程,不会使用nice值。
要查看当前的“尼斯”和PR值,可以执行以下命令:
PR = -1 - rt_prior

显示以下输出:

在该图中显示了PR和NI值。最好注意PR值-51与实时值相对应的过程。也有一些过程的PR值表示为“ rt”。该值实际上对应于-100的PR值。