之前在 Openwrt 负载 中也曾经谈到过 CPU 的负载,通过 top, uptime 等等命令都可以非常快速的查询当前 CPU 的负载。

CPU 的 load average(平均负载)指的是一段时间内正在使用和等待使用 CPU 的平均任务数

还有一个判断 CPU 的指标是 CPU 的利用率。同样使用 top 命令也能够查到。但是并不是负载高就一定意味着 CPU 利用率高。

用电话亭来表示 CPU ,把等待打电话的人比作 CPU 任务的话,假设一个队列的人排队打电话,每个人只能打 1 分钟电话,时间到了必须重新排队,那么随着时间变化排队的人数会发生变化,那么 CPU 的平均负载就是每隔 1 分钟,5 分钟,15 分钟采样一次的数值。

而 CPU 的利用率就是电话在拨打的时间长度,但是负载高并不意味着利用率高,可能有人排队等到能打电话时拿着话筒等待了几十秒才拨打电话,那么这浪费的几十秒就不能算是 CPU 的利用率。

问题分析

负载高 CPU 利用率低

说明等待运行的任务很多,很有可能有任务僵死,通过 ps –axjf 查看有没有任务处于 D 状态,该状态为不可中断的睡眠状态,处于 D 状态的进程通常是在等待 IO,通常是 IO 密集型任务,如果大量请求都集中于相同的 IO 设备,超出设备的响应能力,会造成任务在运行队列里堆积等待,也就是 D 状态的进程堆积,那么此时 Load Average 就会飙高。

负载低 CPU 利用率高

说明任务少,但是任务执行时间长,有可能是程序本身有问题,如果没有问题那么计算完成后则利用率会下降。这种场景,通常是计算密集型任务,即大量生成耗时短的计算任务。

CPU 使用率低,IO 繁忙,负载低

这种场景,通常是低频大文件读写,由于请求数量不大,所以任务都处于 R 状态(表示正在运行,或者处于运行队列,可以被调度运行),负载数值反映了当前运行的任务数,不会飙升,IO 设备处于满负荷工作状态,导致系统响应能力降低。