当前位置: 首页>>技术教程>>正文


处理’niceness’与’priority’

, , ,

问题描述

运行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(Niceness)。

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

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

最佳解决方案

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

PR = 20 + NI

因此,PR = 20 + (-20 to +19)的值为0到39,映射100到139。

根据顶级手册:

PR — Priority The scheduling priority of the task. If you see ‘rt’ in this field, it means the task is running under ‘real time’ scheduling priority.

NI是很好的任务价值。

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 dispatch-ability

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

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

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

    renice -n nice_value -p process_id
    

次佳解决方案

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

在谈论流程时,优先级就是管理处理器时间。处理器或CPU就像人类同时处理多个任务一样。有时我们可以有足够的空间来承担多个项目。有时我们一次只关注一件事。其他时候会出现一些重要的事情,我们希望将所有精力投入到解决问题的同时将不太重要的任务放在后面。

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

通过使用此比例,我们可以更适当地分配CPU资源。可以将不重要的低优先级程序设置为更高的nice值,而可以将守护进程和服务等高优先级程序设置为接收更多CPU的焦点。您甚至可以为特定用户提供他/她所有进程的较低值,这样您就可以限制他们减慢计算机核心服务速度的能力。

Source

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

第三种解决方案

简答

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)。为了能够访问这些值,该过程应表示为”real time”。

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

其中显示以下输出:

process,process-priority,nice,ubuntu

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1176.html,未经允许,请勿转载。