技术杂谈

全面了解 Load Average 定位问题

一、什么是Load Average?

系统负载(System Load)是系统CPU繁忙程度的度量,即有多少进程在等待被CPU调度(进程等待队列的长度)。

平均负载(Load Average)是一段时间内系统的平均负载,这个一段时间一般取1分钟、5分钟、15分钟。

二、如何查看Load?

top,uptime,w等命令都可以查看系统负载:

[jenkinstop@dev02 ~]$ uptime
13:53:39 up 10 days, 2:15, 1 user, load average: 1.5, 2.5, 5.5

如上所示,dev02机器1分钟平均负载,5分钟平均负载,15分钟平均负载分别是1.5、2.5、5.5

三、对负载的理解

可以将CPU负载理解为车道的负载,对单车道而言:

  • 如果路面上的车不多,没有占满车道,那么load < 1;
  • 如果占满了车道,load = 1;
  • 如果车道外面还有车在等待,load > 1;

需要注意的是,load = 1 不代表CPU无法工作了,这只是表示满负荷运行,例如实际生活中的例子,车道占满了,但是车流还能有序前进。

四,实际运维工作的指导意义

实际工作环境中,面对的是不同性能(核数,超频)的机器,不同模型的程序(单线程、多线程、分布式),不同部署方式的业务(只部署数据库、webserver、混部),所以搞清楚不同场景下load average 是如何工作的对于问题排查,服务健康检测都是很有必要的,下面通过几种场景来说明。

五,Load Average在故障排查时的运用

w

状态为R和D的任务

状态为R,表示正在运行,或者处于运行队列,可以被调度运行。

状态为D,表示 uninterruptible sleep,这种状态是不可中断的,无论是kill,kill -9,还是kill -15。

处于D状态的进程通常是在等待IO,比如磁盘 IO,网络 IO,其他外设 IO。

如果处于D状态的时间较长,意味着可能是IO设备本身出了故障,需要排查设备是否正常。

5.1 CPU使用率高,IO无作业,Load Average低,系统反应颠簸

这种场景,通常是计算密集型任务,即大量生成耗时短的计算任务。

这种任务会占满CPU资源,造成系统响应速度颠簸,但由于每个任务能快速计算完成,不会在运行队列堆积,所以在Load Average里不会体现出来。

1

嗯~ o(* ̄▽ ̄*)o

python示例程序占满CPU,但LoadAvergae 不高

5.3 CPU使用率低,IO等待,Load Average高,系统不卡

Load Average高,dd程序都处于D状态

示例命令,大量写小文件: dd if=/dev/zero of=testx.img bs=512 count=1000000 oflag=dsync

这种场景,通常是IO密集型任务,如果大量请求都集中于相同的IO设备,超出设备的响应能力,会造成任务在运行队列里堆积等待,也就是D状态的进程堆积,那么此时Load Average就会飙高。

由于任务都处于等待状态,所以Load Average的值虽然很高,但系统响应速度不受影响。

5.3 CPU使用率低,IO繁忙,Load Average低,系统卡

这种场景,通常是低频大文件读写,由于请求数量不大,所以任务都处于R状态,Load Average数值反映了当前运行的任务数,不会飙升,IO设备处于满负荷工作状态,导致系统响应能力降低。

IO设备满负荷工作

示例命令,少量写大文件:dd if=/dev/zero of=testx.img bs=5120000 count=10000 oflag=dsync

dd程序都处于R状态

5.4 CPU使用率高,IO繁忙/等待,Load Average高,系统卡

这种场景,通常是服务混部,即IO、计算密集型任务混部在一起,相当于CPU、IO都处于高负荷状态,那么Load Average 自然很高。

总结

可以根据业务的特性(CPU、IO密集型、两者混部),在系统响应速度异常时,快速定位原因。本文通过简单命令模拟了业务的类型,介绍了相应的思路,读者可结合自己所运维的业务实践一下。

来源于「曲行人」

Prev Next
No Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注