(-) 的 niceness 值是什么意思?

spu*_*der 20 linux process-management priority nice linux-kernel

根据手册页和维基百科;nice范围从 -20 到 20。

但是,当我运行以下命令时,我发现某些进程具有非数值,例如 (-)。请参阅标题为“NI”的左起第六列。

(-) 的美好表示什么?

 ps axl 
 F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0     1     0  20   0  19356  1548 poll_s Ss   ?          0:00 /sbin/init
1     0     2     0  20   0      0     0 kthrea S    ?          0:00 [kthreadd]
1     0     3     2 -100  -      0     0 migrat S    ?          0:03 [migration/0]
1     0     4     2  20   0      0     0 ksofti S    ?          0:51 [ksoftirqd/0]
1     0     5     2 -100  -      0     0 cpu_st S    ?          0:00 [migration/0]
5     0     6     2 -100  -      0     0 watchd S    ?          0:09 [watchdog/0]
1     0     7     2 -100  -      0     0 migrat S    ?          0:08 [migration/1]
1     0     8     2 -100  -      0     0 cpu_st S    ?          0:00 [migration/1]
1     0     9     2  20   0      0     0 ksofti S    ?          1:03 [ksoftirqd/1]
5     0    10     2 -100  -      0     0 watchd S    ?          0:09 [watchdog/1]
1     0    11     2 -100  -      0     0 migrat S    ?          0:05 [migration/2]
Run Code Online (Sandbox Code Playgroud)

我检查了 3 台正在运行的服务器:Ubuntu 12.04 和 CentOs 6.5 以及 Mac OsX 10.9。只有 Ubuntu 和 CentOs 机器有非数字 niceness 值。

gol*_*cks 19

(-) 的美好表示什么?

注意那些也有-100的PRI分数;这表明该进程被安排为实时进程。实时进程不使用好的分数并且总是比普通进程具有更高的优先级,但仍然彼此不同。

您可以使用chrt命令(例如chrt -p 3)查看每个进程的详细信息。您的 -100 中的一个可能会报告 99 的“当前调度优先级”——与 不同nice,这里的高值具有更高的优先级,这可能是 top 创建-100数字的地方。chrt无论 nice 值如何,非实时进程将始终显示“当前调度优先级”为 0 ,而在 linux 下,“当前调度策略”为 SCHED_OTHER.

只有 Ubuntu 和 CentOs 机器有非数字 niceness 值。

某些版本top似乎rtPRI下报告实时进程,然后0NI下报告。


Ram*_*esh 7

@Goldlilock 的回答指导我在正确的道路上进行研究。这是我的研究细节。

可用于进程的调度算法

Linux 支持 3 种调度策略。SCHED_FIFOSCHED_RR、 和SCHED_OTHERSCHED_OTHER是大多数进程使用的默认通用分时调度程序策略;SCHED_FIFO并且SCHED_RR适用于需要精确控制选择执行可运行进程的方式的特殊时间关键应用程序。

可用的优先级

为了选择要运行的进程,Linux 调度程序必须考虑每个进程的优先级。实际上,有两种优先级。

每个进程都分配了一个静态优先级值,并且调度依赖于这个静态优先级。被调度的进程SCHED_OTHER具有静态优先级 0;下的进程调度SCHED_FIFOSCHED_RR可具有范围内的静态优先级199(99为最高)。

sys_sched_get_priority_max( )例程返回进程的静态优先级,它0为非实时进程返回。

动态优先级用于非实时应用程序。

所有实时进程的优先级都高于普通进程。Linux 按照 POSIX 实现实时优先级。下图可能概述了如何根据优先级安排流程。

HIGH PRIORITY – - – - – > – - – - – > – - – - – > – - – - – > – - – – LEAST PRIORITY
……..real time priority (static priority)…….| …. nice value (dynamic priority) …..
99 ……………………….. 50 ……………………… 1 | -20 …….. -10 …….. 0 …….. 10 ……. 19
Run Code Online (Sandbox Code Playgroud)

现在,我们可以发出以下命令来检查进程的实时优先级。在这里我使用看门狗,因为它有一个很好的值列为 -。

ps -e -o class,rtprio,pri,nice,cmd | grep watchdog
Run Code Online (Sandbox Code Playgroud)

这是上面命令的输出。正如我们所看到的,实时优先级是 99,这是可能的最高优先级。

FF      99 139   - [watchdog/0]
FF      99 139   - [watchdog/1]
TS       -  21   0 grep watchdog
Run Code Online (Sandbox Code Playgroud)

因此,根据我的理解,实时优先级的最大值可以为 99,因此不能有任何好的价值。这就是原因,我们得到了很好的输出 - 对于看门狗和其他系统进程。

参考

http://oreilly.com/catalog/linuxkernel/chapter/ch10.html http://atipaday.wordpress.com/2008/08/19/atad-21-linux-process-priority-range/