最佳输出中优先值与优先值之间的差异


11

默认情况下,top列出两列。我对有什么区别感到好奇。我检查了手册页,但无法弄清楚:

优先:

   h: PR  --  Priority
      The priority of the task.

不错的价值:

   i: NI  --  Nice value
      The nice value of the task.  A negative nice value means higher  priority,
      whereas  a  positive  nice value means lower priority.  Zero in this field
      simply means priority will not be adjusted in determining  a  task’s  dis-
      patchability.

我知道Nice值与内核的CPU调度程序队列有关;那么优先级表示什么?关于I / O的东西吗?

Answers:



25

不同之处在于,PR是内核内部当前进程的真正优先级,而NI只是向内核提示进程应该具有的优先级。

在大多数情况下,PR值可通过以下公式计算:PR = 20 + NI。因此,具有良好感3的过程具有优先级23(20 + 3),具有良好感-7的过程具有优先级13(20-7)。您可以通过运行command检查第一个nice -n 3 top。它将显示顶级进程具有NI 3PR 23。但是对于nice -n -7 top在大多数Linux系统上运行,您需要具有root特权,因为实际上PR值越低,实际优先级就越高。因此,具有PR 13的过程具有比具有标准优先级PR 20的过程更高的优先级。这就是为什么您需要扎根。但是,可以在/etc/security/limits.conf中配置允许非根进程使用的最小nice值。

理论上,内核可以自行更改PR值(但不能更改NI)。例如,如果它消耗过多的CPU,它可能会降低进程的优先级,或者如果该进程由于其他更高优先级的进程而没有机会长时间运行,则可能会增加该进程的优先级。在这些情况下,PR值将由内核更改,NI将保持不变,因此公式“ PR = 20 + NI”将不正确。因此,NI值可以解释为内核对进程应具有何种优先级的提示,但内核可以根据情况自行选择实际优先级(PR值)。但通常公式“ PR = 20 + NI”是正确的。

内核如何更改优先级的确切规则尚不清楚。setpriority(更改好的值的函数)手册说:

更改nice值的效果可能会因有效的流程计划算法而异。

Pthread手册指出以下内容:

动态优先级基于nice值(由nice(2),setpriority(2)或sched_setattr(2)设置),并在线程准备好运行但每次被调度程序拒绝运行时都增加。

看起来PR值对应于动态优先级。

NI值的范围是-20..19。因此,PR值可以具有从0(20-20)到39(20 + 19)的值。但这仅对具有默认调度策略(SHED_OTHER)的进程正确。可能还有所谓的进程 “实时”调度策略的。这些策略是SCHED_RRSCHED_FIFO。这样的进程的PR值小于0。您可以通过运行chrt -r 1 top命令(需要root)来检查它。最上面的进程将具有PR -2。您甚至可以chrt -r 90 top在这种情况下运行顶部进程将具有PR -91

似乎对于SCHED_RR进程,PR值可以通过以下公式计算:

PR =-1-sched_rr_priority

因此 SCHED_RR进程至少具有PR -1,这意味着任何SCHED_RR进程都具有比任何SCHED_OTHER更高的优先级。这对应于pthread手册:

SCHED_FIFO只能在静态优先级高于0的情况下使用,这意味着当SCHED_FIFO线程变为可运行时,它将始终立即抢占任何当前正在运行的SCHED_OTHER,SCHED_BATCH或SCHED_IDLE线程。

SCHED_RR是SCHED_FIFO的简单增强。上面针对SCHED_FIFO所述的所有内容也适用于SCHED_RR,

实时进程的优先级称为静态优先级,内核无法更改。因此,正PR值可以视为非实时动态优先级(SCHED_OTHERSCHED_BATCH)进程,级,对于实时进程(SCHED_RRSCHED_FIFO),可以将负PR值视为静态优先级。

我还尝试运行nice -n 10 chrt -r 50 top(和chrt -r 50 nice -n 10 top)。该NI值为10,但PR仍是-51。因此,NI值似乎不会影响SCHED_RR进程的优先级。这对应于setpriority手册:

使用SCHED_FIFO或SCHED_RR的任何进程或线程都不会受到对setpriority()的调用的影响。这不被视为错误。随后恢复为SCHED_OTHER的进程不必受此类setpriority()调用影响。

一个有趣的笔记。如果运行chrt -r 99 top,则会在PR列中看到RT值而不是数字。

  PID用户PR NI VIRT RES SHR S%CPU%MEM TIME +命令
28489根RT 0 2852 1200 896 R 0 0.1 0:00.01顶部

我认为这并不意味着现在的过程特别。我认为这意味着top不会打印-100,因为要打印4个字符。

您也可以使用htop代替top在所有示例中,这样会更加方便。ps -l也可以使用,但是将实时和非实时优先级分开的基准点不是0,而是60,因此nice -n -20 ps -l将打印

FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 R 0 28983 28804 0 60 -20-1176-积分/ 6 00:00:00 ps

奇怪的是,如果我在2核超线程i3上运行5个无限循环(int main {while(1);}),则它们的优先级保持不变。这在debian sid测试中。
Vorac

1
@BelminFernandez我认为将这个答案“接受”将是公平的。
z0lupka

1

简短答案

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值。

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

top

最好注意,例如PR值为-51的过程对应于实时值。也有一些过程的PR值表示为“ rt”。该值实际上对应于-100的PR值。

(PS:我本来会发布一张显示最佳结果的图片,但我没有做到这一点的声誉)

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.