Skip to content

Latest commit

 

History

History
64 lines (39 loc) · 3.61 KB

cpu-load.md

File metadata and controls

64 lines (39 loc) · 3.61 KB

CPU 负载

平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。

什么是可运行状态进程?所谓可运行状态的进程,是指正在使用 CPU 或者正在等待 CPU 的进程,也就是处于 R 状态(Running 或 Runnable)的进程。

什么是不可中断状态的进程?不可中断状态的进程是正处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件设备的 I/O 响应,也就是牌 D 状态的进程。

如何理解

判断系统负荷是否过重,必须理解load average的真正含义。首先,假设最简单的情况,你的电脑只有一个CPU,所有的运算都必须由这个CPU来完成。那么,我们不妨把这个CPU想象成一座大桥,桥上只有一根车道,所有车辆都必须从这根车道上通过。明显这是个单行道。

  • 系统负荷为0,说明大桥上一辆车也没有。
  • 系统负荷为0.5,说明大桥一半的路段有车。
  • 系统负荷为1.0,说明大桥的所有路段都有车,也就是说大桥已经"满"了。
  • 系统负荷为2.0,说明等待上桥的车辆与桥面的车辆一样多。

总之,当系统负荷大于1,后面的车辆就必须等待了;系统负荷越大,过桥就必须等得越久。

上面假设的是 1 个 CPU 的情况,如果是 2 个 CPU 或更多 CPU 呢? 两个 CPU 意味着大桥是单行道是 2 车道的,负载到 2.0 才说明大桥已经满了。N 个 CPU 原理相同。

如何查看

查看 CPU 负载一般通过 top 和 uptime 命令。

如下 top 输出格式:

[root@master ~]# top
top - 22:03:34 up 15 min,  1 user,  load average: 0.27, 0.35, 0.46
Tasks: 144 total,   2 running, 142 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.7 us,  2.1 sy,  0.0 ni, 96.6 id,  0.0 wa,  0.0 hi,  0.7 si,  0.0 st

在这个输出结果中,第一行的 load average 就是表示平均负载。后面三个数字分别表示 1 分钟、5 分钟和 15 分钟。

如下 uptime 输出格式:

[root@master ~]# uptime
 22:11:12 up 22 min,  1 user,  load average: 0.15, 0.26, 0.37

这个输出结果和 top 是一样的。

平均负载和 CPU 使用率

大家可能会疑惑平均负载代表的是活跃进程数,那平均负载高了,不就意味着 CPU 使用率高吗?

这个问题我们还是要回到平均负载的含义上来,平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。所以,它不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程。而 CPU 使用率,是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应。

比如:

  • CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的。
  • I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高。
  • 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。

使用经验

系统负荷的理想值是多少?负载达到 CPU 核数是理想值么?

这不一定。系统往往需要预留一点。一般定为 70%。当平均负载高于这个数值的时候,你就应该分析排查负载高的问题了。一旦负载过高,就可能导致进程响应变慢,进而影响服务的正常功能。

但 70% 这个数字并不是绝对的,推荐的方法,还是把系统的平均负载监控起来,然后根据更多的历史数据,判断负载的变化趋势。当发现负载有明显升高趋势时再去做分析和调查。