阅读 199

(译)理解Linux系统的CPU负载均值

译自Understanding Linux CPU Load - when should you be worried?

你可能已经很早就熟悉Linux负载均值这个概念了,通过uptime或者top命令就可以得到三个数字,具体如下所示:

load average: 0.09, 0.05, 0.01

绝大多数人对负载均值只是有个粗浅的认识:即这三个数字分别代表系统最后1分钟、最后10分钟以及最后15分钟的平均负载值,并且这些数字越小越好,如果比较大则表示系统设备有可能负荷超载等问题。

但是你有没有想过,这些数字有没有边界?代表“好”或者“坏”的边界值又是多少?你什么时候应该关注这些数值?你应该什么时候去尽快处理使其降下来?

在讨论这些问题之前,先了解一些负载均值相关的背景知识。我们用一台配置了单核处理器的设备,举个简单例子解释说明下。

道路千万条,安全第一条。行车不规范,亲人两行泪。

单核CPU就像一条车道的交通情况。假设你是一座大桥的操作员,有时桥上太忙了,有很多车等着过桥。你想让人们知道桥上的交通状况。那么一个合适的度量标准,就是在特定时间有多少辆车在等待。如果没有车在等,新来的司机知道他们可以马上开过去。如果桥上堵车,那么司机就知道他们会遇到延误。

因此,这些数值用于如下用途:

  • 0.00表示桥上一辆车都没有。也就是说,如果数值介于0.00~1.00之间,则表示没有堵车,所有的车辆都可以流畅通过。

    负载为0.00
    负载为0.00

  • 0.50表示桥上的车辆只有一半。可以看到车辆间距较大,不会拥挤。

    负载为0.50
    负载为0.50

  • 1.00表示桥上的车辆达到最大值。一切刚刚好,但如果桥上再来一辆车,那么就出现堵车的情况了。

    负载为1.00
    负载为1.00

  • 大于1.00表示堵车了。负载数值和堵车严重程度有什么关系呢?举例说明,2.00表示等待过桥的车辆和桥上满负载的车辆一样多,3.00表示等待的车辆是桥上满负载的车辆的2倍,以此类推。

    负载为1.70
    负载为1.70

这基本上就是CPU负载的解释。“汽车”就是使用CPU时间片(即“过桥”)或排队使用CPU(等待“过桥”)的进程,Unix将其称为运行队列长度,即当前运行的进程数加上等待(排队)运行的进程数之和。

就像作为一个大桥的管理者,你肯定不愿意车辆/进程一直处于等待状态,所以应该让你的CPU负载低于1.00。如果偶尔超过1.00不用担心,但如果一直大于1.00,那么就需要考虑哪里出了问题了。

所以说最理想的负载是1.00吗?

其实并不是这样的。当负载达到1.00时表示已经触及天花板了,所以一般来说会有一条边界线,即0.70。

  • 经验法则之“需要关注”——0.70:如果你的CPU负载均值一直处于>0.70的状态,那么在事情变得更糟之前,需要调查一下原因所在。

  • 经验法则之“立刻修复”——1.00:如果你的CPU负载均值一直处于>1.00的状态,那么赶紧查原因修复它吧!

  • 经验法则之“紧急状况”——5.00:如果你的CPU负载均值超过了5.00,你恐怕是遇到大麻烦了!你的系统设备可能卡顿或者特别慢,随时会出现意外情况。

多处理器下,负载为3.00,但运行结果一切正常!

是4个处理器的系统吗?如果是,那就没事儿。

在多处理器系统上,负载与可用处理器内核的数量有关。“100%利用率”在单核系统上负载为1.00,在双核系统上为2.00,在四核系统上为4.00等等。

回到刚才大桥的例子上,1.00表示一条车道上的车辆。在单行道上的大桥上,1.00表示刚好满载;在两条车道的大桥上,1.00表示只有50%的负载——即一条车道满载,而另一条车道是空的。

同样地在CPU上:负载为1.00表示在单核系统上是100%利用率,负载为2.00表示在双核系统上是100%利用率。

多核处理器VS多处理器

现在,我们讨论下多核以及多处理器的话题。从性能的角度来看,一台只有一个双核处理器的机器基本上等同于一台只有两个单核处理器的机器。这里有许多关于缓存数量、处理器之间的进程切换频率等的细微之处。尽管有这些细微之处,但是为了评估CPU负载值,无论这些内核分布在多少物理处理器上,内核的总数量都很重要。

这就引出了两条新的经验法则:

  • 内核总数=最大负载:在一个多核系统里,负载不应该超过可用的内核数之和。

  • 内核就是内核:内核如何分布在CPU上并不重要,2个四核== 4个双核== 8个单核,这些都是8个内核。

回归正传

输入uptime命令,得到如下的负载均值:

~ $ uptime 23:05 up 14 days, 6:08, 7 users, load averages: 0.65 0.42 0.36

这是一个双核处理器,所以还有很大的余量空间,不需要为它担心,除非负载长期处于1.7或更大。

那么这三个数字怎么处理呢?0.65是最后1分钟的平均值,0.42是最后5分钟的平均值,0.36是最后15分钟的平均值。这就引出了一个问题:

这三个数值,我应该关注哪个?1分钟,5分钟,还是15分钟?

关于这些数值的含义我们已经讨论过(1.00表示需要马上修复等等),你最应该关注的是5分钟或15分钟的平均值。坦率地说,如果你的机器在一分钟内的平均峰值超过1.0,仍然是可以正常工作的。当15分钟的平均值超过1.0时,你需要迅速去调整直至正常范围内(当然具体数值要看你的系统内核数量)。

内核的数量对于解释平均负载非常重要,那么我如何得知系统有多少内核?

通过cat /proc/cpuinfo命令获取每个处理器的详细信息,grep 'model name' /proc/cpuinfo | wc -l命令则获取所有的内核数量。