什么是平均负载
当系统响应变慢时,一般使用top或者uptime来查看系统负载情况。运行uptime命令的输出信息如下:
其中 23:12:21 为当前系统时间
up 42 min:为系统已经运行的时间
2 users:当前登录的用户数
load average:则是过去 1 分钟、5 分钟、15 分钟的平均负载。
***平均负载***是单位时间内系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃的进程数。
可运行状态
是指正在使用cpu或者正在等待cpu的进程。也就是使用ps命令看到的处于R状态的进程。
不可中断状态的进程
则是处于内核态关键流程中的进程,且这些进程是不可以被打断的,比如常见的等待硬件设备的IO响应。也就是使用ps命令处于D状态的进程。不可中断状态是系统对进程和硬件设备的一种保护机制。
平均活跃进程数最理想的状态就是每个CPU上刚好运行一个进程,这样每个CPU都得到了充分的利用,也就是说平局负载刚好等于系统CPU的个数。
如果平均负载为2意味着什么呢?
也就是单位时间平均活跃进程数为2.那么对于只有2个CPU的系统来说,CPU刚好被得到了充分的利用。
而在有4个CPU的系统上,有50%的CPU会处于空闲状态。
而在只有一个CPU的系统上 则进程需要竞争CPU才能被运行 会有50%的进程因为竞争不到CPU而处于等待状态。
如何查看系统有几个CPU:
上面的命令显示 系统cpu数目为2
平均负载与CPU使用率
平均负载代表代表的是平均活跃进程数,是不是平均负载升高了CPU使用率就高了呢?
首先平均负载是单位时间内系统处于可运行状态和不可中断状态的平均进程数,它不仅包括了正在使用CPU的进程,还包括了等待CPU和等待I/O的进程。CPU使用率则是单位时间内CPU的繁忙情况统计,跟平均负载不一定对应
分析工具
tress 是一个 Linux 系统压力测试工具,可以用于模拟异常的平均负载升高的情况
sysstat包含了linux性能分析的常用工具用于监控和分析系统性能,其中就包含了mpstat和pidstat两个命令。
mpstat 是一个常用的多核 CPU 性能分析工具,用来实时查看每个cpu的性能指标以及每个CPU的平均指标
pidstat是一个常用的进程性能分析工具 用来实时查看cpu 内存 io以及上下文切换等性能指标。
场景1 CPU密集型进程
在终端1中运行下面的命令 stress –cpu 1 –timeout 600 模拟cpu使用率100%的场景
在终端2中继续运行下面的命令:watch –d uptime
大概1-2分钟以后平均负载逐渐上升到1
然后在在新的终端中执行给下面的命令 mpstat –P ALL 5
会发现其中一个进程的cpu idle占比接近0% %user则接近100%
mpstat并不能给出具体是哪个进程占用了CPU 需要使用pidstat命令,继续运行下面的命令 pidstat -u 5 1
会发现 进程stress的CPU使用率已经达到了100%
场景2 大量进程的场景
运行测试命令前的平均负载状况:
然后在第二个中端运行测试命令:stress –c 8 –timeout 600
这里的-c选项是产生n个进程 每个进程都反复不停的计算随机数的平方根
再来观察平均负载情况 发现平均负载很快就上升到了7.63 平均负载已经严重超标
运行pidstat命令来查看每个进程的运行情况如下:
无论是pidstat的输出还是top命令的输出都显示,8个进程在争抢2个CPU,每个进程导致的CPU使用都达到了25%左右。
小结
平均负载提供了一个快速查看系统整体性能的手段,反应了系统的整体负载情况。理解平均负载需要注意:
1) 平均负载高有可能是CPU密集型进程导致的
2) 平均负载升高,CPU使用率不一定升高,有可能是I/O更繁忙了
3) 当平均负载升高时可以使用mpstat、pidstat命令来辅助分析系统性能。