处理“好”与“优先”


104

运行时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时间。但是,这些值之间有什么区别?

您能否也描述一下如何操纵流程的这些价值,以及在什么情况下这可能有用?

Answers:


103

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

PR = 20 + NI

因此,值PR = 20 + (-20 to +19)是0到39,即100到139。

根据高级手册:

PR-优先级任务的计划优先级。如果在此字段中看到“ rt”,则表示任务以“实时”调度优先级运行。

NI是很好的任务价值。

NI-不错的价值任务的不错的价值。尼斯值的负值表示较高的优先级,尼斯值的正值表示较低的优先级。此字段中的零仅表示在确定任务的调度能力时不会调整优先级

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

  1. 您可以使用以下选项启动具有所需优先级的程序:

    nice -n nice_value program_name
    
  2. 您还可以使用以下命令更改已运行进程的优先级

    renice -n nice_value -p process_id
    

1
您是说,它们几乎是相反的东西(两者都代表优先级),但是BUT niceness可以用来赋予负优先级,从而避免niceness高优先级任务的出现?(即存在nice并让其他访问资源?还是让我感到困惑?
Mark Kirby 2015年

1
我的意思是,两个任务都具有pr20,因此相等,任务一的a ni为0,任务二的a ni为20,因此,这意味着任务二将为任务一放弃资源。nicer
Mark Kirby 2015年

1
据我所知,优先级计算为PR = 20 + NI。因此,任务一优先级= 20 +0。尼斯意愿的最大值+19
pl_rock

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

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

26

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

在讨论进程优先级时,只不过是管理处理器时间。处理器或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

但不是优先 >=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

在您的示例中,renice 10如果没有sudo,也可以使用,对吗?您能否添加一个示例来使特定用户的所有流程更加美观?如果有其他人在同一时间登录,并有一台运行一些不必要的,但资源进食的过程,这将是真正非常有用的(如暂停闪光游戏在Firefox中,小兄弟做这样的东西...: - /)
字节指挥官

@ByteCommander完成=)
AB

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

@ByteCommander不,这并不简单。您使用0还是…出现问题;)
AB

2
renice只能-19后,其结果ps是:PRI: 38, NI: -19,然而,与topPR:1, NI -19这是为什么?
唤醒

14

简短答案

PR是优先级。PR越低,该过程的优先级越高。

PR计算如下:

  • 对于正常过程:PR = 20 + NI(NI很好,范围从-20到19)
  • 对于实时进程:PR =-1-real_time_priority (real_time_priority的范围是1到99)

长答案

有两种类型的进程,正常进程和实时进程。对于正常进程 (仅针对那些进程),nice的应用如下:

好啊

“ niceness”标度从-20到19,而-20是最高优先级,19是最低优先级。优先级计算如下:

PR = 20 + NI

其中NI为好级别,PR为优先级别。正如我们所看到的,-20实际上映射为0,而19映射为39。

默认情况下,程序的nice值为0,但是root用户可以使用以下命令来启动具有指定nice值的程序:

nice -n <nice_value> ./myProgram 

即时的

我们可以走得更远。好优先级实际上用于用户程序。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

调度过程可以分为2组,正常调度策略(1至3)和实时调度策略(4和5)。实时过程将始终具有比常规过程更高的优先级。可以使用以下命令来调用实时过程(该示例是如何声明SCHED_RR策略):

chrt --rr <priority between 1-99> ./myProgram

为了获得实时过程的PR值,使用以下公式:

PR = -1-rt_prior

其中rt_prior对应于1到99之间的优先级。因此,比其他进程具有更高优先级的进程将是编号为99的进程。

重要的是要注意,对于实时过程,不会使用nice值。

要查看进程的当前“良好”和PR值,可以执行以下命令:

top

显示以下输出:

在此处输入图片说明

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.