深入 Linux 的进程优先级

为什么要有进程优先级?这似乎不用过多的解释,毕竟自从多任务操作系统诞生以来,进程执行占用cpu的能力就是一个必须要可以人为控制的事情。因为有的进程相对重要,而有的进程则没那么重要。

本文作者:邹立巍

Linux系统技术专家。目前在腾讯SNG社交网络运营部 计算资源平台组,负责内部私有云平台的建设和架构规划设计。

曾任新浪动态应用平台系统架构师,负责微博、新浪博客等重点业务的内部私有云平台架构设计和运维管理工作。

进程优先级起作用的方式从发明以来基本没有什么变化,无论是只有一个cpu的时代,还是多核cpu时代,都是通过控制进程占用cpu时间的长短来实现的。就是说在同一个调度周期中,优先级高的进程占用的时间长些,而优先级低的进程占用的短些。

深入 Linux 的进程优先级

从这个角度看,进程优先级其实也跟cgroup的cpu限制一样,都是一种针对cpu占用的QOS机制。我曾经一直很困惑一点,为什么已经有了优先级,还要再设计一个针对cpu的cgroup?得到的答案大概是因为,优先级这个值不能很直观的反馈出资源分配的比例吧?

不过这不重要,实际上从内核目前的进程调度器cfs的角度说,同时实现cpushare方式的cgroup和优先级这两个机制完全是相同的概念,并不会因为增加一个机制而提高什么实现成本。既然如此,而cgroup又显得那么酷,那么何乐而不为呢?

在系统上我们最熟悉的优先级设置方式是nice和renice命令。那么我们首先解释一个概念,什么是:

NICE值

nice值应该是熟悉Linux/UNIX的人很了解的概念了,我们都知它是反应一个进程“优先级”状态的值,其取值范围是-20至19,一共40个级别。这个值越小,表示进程”优先级”越高,而值越大“优先级”越低。我们可以通过nice命令来对一个将要执行的命令进行nice值设置,方法是:

[root@zorrozou-pc0 zorro]#nice-n 10bash

这样我就又打开了一个bash,并且其nice值设置为10,而默认情况下,进程的优先级应该是从父进程继承来的,这个值一般是0。我们可以通过nice命令直接查看到当前shell的nice值

[root@zorrozou-pc0 zorro]#nice

10

对比一下正常情况:

[root@zorrozou-pc0 zorro]#exit

推出当前nice值为10的bash,打开一个正常的bash:

[root@zorrozou-pc0 zorro]#bash

[root@zorrozou-pc0 zorro]#nice

0

另外,使用renice命令可以对一个正在运行的进程进行nice值的调整,我们也可以使用比如top、ps等命令查看进程的nice值,具体方法我就不多说了,大家可以参阅相关manpage。

需要大家注意的是,我在这里都在使用nice值这一称谓,而非优先级(priority)这个说法。当然,nice和renice的man手册中,也说的是priority这个概念,但是要强调一下,请大家真的不要混淆了系统中的这两个概念,一个是nice值,一个是priority值,他们有着千丝万缕的关系,但对于当前的Linux系统来说,它们并不是同一个概念。

我们看这个命令:

[root@zorrozou-pc0 zorro]#ps-l

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

4 S 0692457760800-17952 poll_s pts/500:00:00sudo

4 S 0692569240800-4435 wait pts/500:00:00bash

0 R 01297169250800-8514- pts/500:00:00ps

大家是否真的明白其中PRI列和NI列的具体含义有什么区别?同样的,如果是top命令:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/15273.html