流程“好”与“优先”

Byt*_*der 139 process-priority process nice

运行时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
Run Code Online (Sandbox Code Playgroud)

我对两个值感兴趣:(PR优先级)和NI(友好度)。

如果我理解了我已经正确发现的内容,那么两者都会确定一个进程与其他进程相比将获得多少 CPU 时间。但是这些值之间有什么区别呢?

您能否还描述一下如何操纵流程的这些值以及在哪些情况下这可能有用?

pl_*_*ock 133

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

PR = 20 + NI
Run Code Online (Sandbox Code Playgroud)

所以, 的值PR = 20 + (-20 to +19)是 0 到 39,映射 100 到 139。

根据顶级手册:

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

NI是很好的任务价值。

NI -- Nice Value 任务的 nice 值。负的 nice 值意味着更高的优先级,而正的 nice 值意味着更低的优先级。此字段中的零仅表示在确定任务的调度能力时不会调整优先级

编辑:默认情况下,当程序在 Linux 中启动时,它以“0”的优先级启动。但是,您可以通过以下任一方法更改程序的优先级。

  1. 您可以使用所需的优先级启动程序

    nice -n nice_value program_name
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您还可以使用更改已运行进程的优先级

    renice -n nice_value -p process_id
    
    Run Code Online (Sandbox Code Playgroud)

  • PR=20+NI 最大值可以是 39 。实际上在 linux 系统中有 139 个优先级,其中 0 到 99 是实时优先级,对于用户来说有 100 到 139 。因此,NI 值 -20 到 +19 映射到优先级 100 到 139。你可以调整。但是内核仍然不确定您是否更改 NI 值然后它会更改优先级,NI 值只是对内核的建议。内核一段时间忽略它 (3认同)
  • 你是说,它们几乎是相反的东西(都代表优先级),但是“niceness”可以用来给出负优先级,以便具有“niceness”的任务摆脱高优先级任务的阻碍?(即它是“友善”并允许其他人访问资源?或者这只是让我感到困惑? (2认同)
  • 我的意思的一个例子是,两个任务的“pr”均为 20,因此相等,任务一的“ni”为 0,任务二的“ni”为 20,因此,这意味着任务二将放弃任务一的资源,因为它“更好” (2认同)
  • 那么 PR 和 NI 实际上是等效的,因为它们只是不同的偏移量?那为什么我们有两个值呢?并且您可以添加进程 <0 的设置要求需要 root 权限。 (2认同)

A.B*_*.B. 37

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

谈到进程优先级就是管理处理器时间。处理器或 CPU 就像一个人同时处理多个任务。有时我们可以有足够的空间来承担多个项目。有时我们一次只能专注于一件事。其他时候,一些重要的事情突然出现,我们想把所有的精力都投入到解决这个问题上,同时把不太重要的任务放在次要的位置上。

在 Linux 中,我们可以为 CPU 在查看它必须执行的所有任务时设置指导方针。这些准则称为niceness 或nice value。Linux 友好度从 -20 到 19。数字越小,任务获得的优先级越高。如果 niceness 值很高,比如 19,则任务将被设置为最低优先级,CPU 将在有机会时处理它。默认的 nice 值为零。

通过使用这种规模,我们可以更恰当地分配我们的 CPU 资源。可以将不重要的较低优先级程序设置为较高的 nice 值,而可以将诸如守护进程和服务之类的高优先级程序设置为获得更多 CPU 的关注。您甚至可以为特定用户的所有进程提供较低的 nice 值,这样您就可以限制他们降低计算机核心服务速度的能力。

来源

为新进程设置优先级nice,例如

nice -n 10 firefox
Run Code Online (Sandbox Code Playgroud)

对于现有流程

renice 10 -p $(pgrep firefox)
Run Code Online (Sandbox Code Playgroud)

要设置<0您需要的优先级sudo,例如:

renice -1 -p $(pgrep firefox)
renice: failed to set priority for 2769 (process ID): Permission denied
Run Code Online (Sandbox Code Playgroud)

但不是为了优先 >=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
Run Code Online (Sandbox Code Playgroud)

其他例子

为特定用户重新启动所有正在运行的进程

renice 20 -u user_name
Run Code Online (Sandbox Code Playgroud)

  • 在 renice -19 之后,`ps` 的结果是:`PRI: 38, NI: -19`,而 `top` 的结果是 `PR:1, NI -19` 为什么会这样? (2认同)

小智 28

简答

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
Run Code Online (Sandbox Code Playgroud)

其中NI是nice级别,PR是优先级别。所以我们可以看到,-20 实际上映射到 0,而 19 映射到 39。

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

nice -n <nice_value> ./myProgram 
Run Code Online (Sandbox Code Playgroud)

即时的

我们还可以走得更远。nice 优先级实际上用于用户程序。UNIX/LINUX 总体优先级的范围为 140 个值,而 nice 值使进程能够映射到范围的最后一部分(从 100 到 139)。该等式使 0 到 99 之间的值无法达到,这将对应于负 PR 级别(从 -100 到 -1)。为了能够访问这些值,该过程应声明为“实时”。

LINUX环境下有5种调度策略,可以通过以下命令显示:

chrt -m 
Run Code Online (Sandbox Code Playgroud)

这将显示以下列表:

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
Run Code Online (Sandbox Code Playgroud)

调度过程可以分为2组,正常调度策略(1到3)和实时调度策略(4和5)。实时进程将始终优先于正常进程。可以使用以下命令调用实时进程(示例是如何声明 SCHED_RR 策略):

chrt --rr <priority between 1-99> ./myProgram
Run Code Online (Sandbox Code Playgroud)

要获得实时过程的 PR 值,请应用以下等式:

PR = -1 - rt_prior
Run Code Online (Sandbox Code Playgroud)

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

需要注意的是,对于实时进程,不使用 nice 值。

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

top
Run Code Online (Sandbox Code Playgroud)

这显示了以下输出:

顶部截图

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