Linux 理解 CPU 负载
in Note with 0 comment
Linux 理解 CPU 负载
in Note with 0 comment

工作中难免会遇到 Linux 的性能问题,但是不知道怎么下手,所以这篇文章将会帮助我们去理解 Linux 性能问题,来辅助我们更好解决性能问题。

Load average

熟悉 Linux 者知道,使用topuptime命令可以查看 load average 指标。

uptime
16:22:29 up 3 days, 19:14,  1 user,  load average: 0.08, 0.03, 0.05

使用 man uptime 查看 Load average 解释:

System load averages is the average number of processes that are either in a runnable or uninterruptable state. A process in a runnable state is either using the CPU or waiting to use the CPU. A process in uninterruptable state is waiting for some I/O access, eg waiting for disk. The averages are taken over the three time intervals. Load averages are not normalized for the number of CPUs in a system, so a load average of 1 means a single CPU system is loaded all the time while on a 4 CPU system it means it was idle 75% of the time.

理解关键地方,平均负载是指,在单位时间内,系统中处于可运行状态不可中断状态的平均进程数,简称平均活跃进程数。值得注意的是,它与 CPU 使用率没有直接关系

使用命令 ps aux 可以查看进程的状态 stat,如本文要注意的:

D 状态为何不可打断呢,举个例子,系统调用起硬件设备的 I/O 响应,为了保证数据的一致性,在磁盘设备返回数据前,它是不能被其他进程或者中断打断的,如果被打断,就容易造成磁盘数据与进程数据不一致的问题。于是,不可中断(D)状态是系统对进程与硬件设备的一种保护机制。

平均活跃进程数,严格意义上,它是活跃进程数的指数衰减平均值(某个量的下降速度和它的值成比例)。通常情况下,理解为单位时间上的活跃进程数即可。

CPU 利用率

从 CPU 角度来说,Load average 只是反映单位时间内占用 CPU 的进程数量,而 CPU 利用率与进程数量没有直接关系,我们可以使用命令topvmstat查看 CPU 的利用率,有以下几个指标:

top
...
%Cpu(s):  0.2 us,  0.1 sy,  0.0 ni, 99.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
...

如何使用 LA 和 CU

LA 为 Load average,即为平均活跃进程数, CU 为 CPU use,即为 CPU 使用率.

一般来讲,Load average 低于 CPU 数量的话,机器性能满足服务需求,超出一些也没关系,Load average 不直接代表 CPU 利用率,可能是 io 阻塞比较多。当 Load average 高于 CPU 数量的 70%,就可能导致进程响应变慢,进而影响服务的正常功能。

从历史数据看

一般来讲,topuptime提供 load average 三个时间点的指标,分别是:1分钟、5分钟、15分钟。这反映了系统最近的状态变化趋势。在实际生产环境中,我们需要做长期的监控记录。如果有异常的数值变化,比如平均负载数是CPU的两倍,需要分析调查问题。

两个指标综合分析

结合 Load average 和 CPU 使用率两个指标,会出现以下几种可能情况:

模拟与验证

我们如何分析平衡负载与 CPU 利用率这两类指标不同组合的案例,寻找造成指标变化的来源?

主要使用两个工具,分别是stress系统压力测试工具,和sysstat性能分析工具包,其中我们会使用到sysstat工具包中的mpstatpidstat

yum install stress
yum install sysstat

模拟

使用stress模拟以下两个场景

1、 CPU 密集型进程

# 模拟一个进程, 对 cpu 使用率 100%,限时 600s
stress --cpu 1 --timeout 600

2、IO 密集型进程
stress 的 -i 选项,spawn N workers spinning on sync()

# 模拟一个进程不停的执行 sync
stress -i 1 --timeout 600

3、大量进程的场景

# 模拟16个进程, 对 cpu 使用率 100%,限时 600s
stress --cpu 16 --timeout 600

验证

mpstat -P ALL 5

监控所有 CPU,每隔5秒输出一组数据,注意指标 %usr 使用率,%iowait IO 阻塞时间,从这可以判断是 CPU 密集型还是 IO 密集型。

pidstat -u 5 1

统计间隔5秒内,使用过 CPU 的进程的数据,注意指标 %usr 使用率,%wait 等待使用 CPU 的时间,从这可以判断是否进程(线程)过多。


完结~ 👊

Responses