理解 CPU Load(译)

https://scoutapm.com/blog/understanding-load-averages

你可能已经很熟悉 Linux 的 load average,看着像下面这样(uptime 或者 top 命令查看):

load average: 0.09, 0.05, 0.01

大多数人对这些数都有一个模糊的概念:三个数分别代表了一个随着更长时间上的一个平均值(1分钟, 5分钟, 15分钟),并且值越小越好,越大的数可能就表明有问题或者已经高负载了。但是这个阈值是多少?什么是状态好的/坏的负载?什么时候我们需要关心这个平均值,什么时候我们需要赶紧起来修复它?

首先来了解什么是 load average,从最简单的 Case 来看看:一个单核单处理器的机器。

类比交通

一个单核单处理器的 CPU 就像一条单向车道,有时候车辆太多了,车辆都排成一条线等待通过,后面的人想知道这条路上的流量到底是多少。一个相当好的指标就是:某一时间有多少车在等待;如果没有车在等待,那么来的车就知道他们可以直接通过;如果有车在排队了,司机就知道他们要被延迟通过了。所以我们需要用什么来表示呢?

  • 0.00 表示路上没有任何流量(事实上 0.00 到 1.00 之间的值都表示路上没有任何阻塞),大家都可以及时通过;
  • 1.00 表示这段路刚好达到最大容量,目前为止,工作都很正常,但是如果车更多一点,事情就开始变的糟糕,需要开始等待;
  • 超过 1.00 表示已经有排队等待了。2.00 表示车辆数为最大容量的两倍,3.00 表示车辆数为最大容量的三倍倍,多余的车辆在等待;

这基本上就是 CPU Load 的含义。这里的车就是进程,路就是 CPU 时间片。Unix 使用类似的概念 runqueue length 来表示,当前有多个正在等待的进程和正在执行的进程的个数总和。

理想情况下,CPU Load 应该保持在1.00以下(汽车不会等待)。如果临时峰值超过 1.00 还是可以的,但当一直在 1.00 以上的时候,就需要担心。

理想负荷是 1.00 吗?

并不完全是,当 load 在 1.00 的时候, 已经没有任何空闲空间了。实际上, 许多系统管理员有一个经验值:0.70

  • 如果 load average 保持在 0.70 以上,那么是时候在事情变得更糟之前进行调查了。
  • 如果 load average 一直大于 1.00,那么赶紧找到问题原因并修复。
  • 如果 load average 一直大于 5.00,任务可能被挂起了,或者放慢了,必须解决它。

多核处理器怎么说?

对于一个4核处理器的系统, load 为 3.00 的时候依然很健康。
在一个多处理器系统上,负载与可用处理器核心的数量有关。100%的使用率在一个单核处理器系统上 load 是 1.00,在一个双核处理器上就是 2.00,在一个4核处理器上就是 4.00。

多核心(multi-core)vs 多处理器(multi-processor)

多核心(multi-core)指一个处理器上可能有多个 Core
多处理器(multi-processor)指一个处理器是一个晶元,多个处理器就有多个晶元

就性能而言, 一个双核处理器和2个单核处理器是差不多的,这里有很多关于缓存数量、处理器之间的进程切换等微妙之处,尽管有这些更精细的点,为了调整CPU负载值的大小,核心的总数才是重要的,不管这些核心分布在多少物理处理器上。两条新的经验法则:

  • “核心数=最大 load”的经验法则:在多核系统中,的负载不应超过可用的核心数。
  • “Cores is cores”的经验法则是:核心如何分布在CPU上并不重要。两个四芯=四个双芯=八个单芯。这八个核心都是为了这些目的。

额外说明

来看下 uptime 的输出:

$ uptime
19:54  up 1 day,  9:16, 2 users, load averages: 2.63 2.69 2.60

这是一个4核的处理器,所以还有很多空间,根本不需要担心,直到它到了 2.8 或者更高。
2.63 是最近1分钟的平均 load;2.69 是最近5分钟的平均 load;2.60 是最近15分钟的平均 load;

那么这里有2个问题:

  1. 应该关注哪个值?1分钟, 5分钟还是15分钟?
    应该关注5分钟或者15分钟的值,因为 CPU 偶尔有毛刺是比较正常的,而且一般都会正常工作。如果最近15分钟这个值都很高,那就真的要调查下了。

  2. 既然核心数这么重要,怎么知道系统有多少个核心?
    Linux 查看

$ cat /proc/cpuinfo

Tags:

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注

16 − 1 =