linux_负载分析之LoadAverage

平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数。和 CPU 使用率并没有直接的关系
一般的进程需要消耗 CPU、内存、磁盘I/O、网络I/O等资源,在这种情况下,平均负载就不是单独指的CPU使用情况。即内存、磁盘、网络等因素也可以影响系统的平均负载值。不过影响最大的是 CPU 使用率、CPU 等待和磁盘I/O
他不仅包扩了正在使用CPU的进程,还包括等待 CPU 和等待磁盘I/O的进程。

查看load average

1
2
3
4
# cat /proc/loadavg 
# top
# uptime
# w

top为例:

这里的 load average 的三个值分别指系统在最后 1/5/15 分钟 的平均负载值。

如何理解load average

将CPU负载理解为车道的负载,对单车道而言:
如果路面上的车不多,没有占满车道,那么load < 1;
如果占满了车道,load = 1;
如果车道外面还有车在等待,load > 1;
需要注意的是,load = 1 不代表CPU无法工作了,这只是表示满负荷运行,例如实际生活中的例子,车道占满了,但是车流还能有序前进。
简单来说就是:“排队中的”除”正在处理中的”

案例分析

使用如下工具:
stress:Linux 系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景。
sysstat:Linux 性能工具,用来监控和分析系统的性能,以下案例中会用到这个包的 2 个命令 mpstat 和 pidstat。
mpstat:常用的多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标。
pidstat:常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标

场景1:CPU密集型进程,单个进程

终端一运行 stree 命令,模拟一个 CPU 使用率 100% 的场景

1
stress --cpu 1 --timeout 600

终端二,查看 CPU 负载的上升状态

1
2
uptime
# or watch -n 1 uptime

终端三,查看 CPU 使用状态

1
mpstat -P ALL 5

终端四,哪个进程导致了 CPU 使用率为 100% 呢? 使用 pidstat 查询

1
pidstat -u 5 1

如下图

结果

结果分析:
图1:stress模拟测试
图2:uptime结果的负载率依次增加,但是并未超过1,原因是此时只有1个线程执行,任务队列中也只有1个任务(暂不考虑操作系统的其他任务)。
图3:有个核占用率达到100%了。
图4:占用100%的进程名称是stress(但是进程id3269和图1的不同,这个不清楚为何,测试多次都是+1的关系)。

场景2:I/O 密集型进程,单个进程

基本命令和上面类似
差别在于终端1的测试stress命令

1
stress -i 1 --timeout 3600

如下图

结果

需要关注的是图3和图4,都体现了iowait是系统瓶颈。

场景3:大量进程的场景,多个进程

终端一:使用 stress 模拟 24 个进程

1
stress -c 24 --timeout 3600

结果如下

图2:loadavg,大幅增加,说明系统负载偏高
图4:多个进程的iowait取值偏大,说明io时间此时大概率是瓶颈资源

故障排除

不能单纯以load值来判断cpu的负载,要结合cpu的使用率、进程的状态和load值来综合判断。
load飙高一般有三种情况:
1.cpu使用率高,load值高,有状态为R的进程
 这就是网上大部分文章提到的情况,此时,说明任务都是cpu密集型的,都在等待着cpu,这种情况下说明cpu负载很高。
2.cpu使用率不高,load值高,有状态为D的进程
 这种情况会发现进程状态为D,说明任务为IO密集型的任务,都在等待IO,这种情况下要检查io设备。
3.cpu使用率高,load值高,系统中既有R状态又有D状态的进程
 这种情况就不好判断cpu负载了,但是存在D状态的任务,就说明IO操作出现了阻塞,要关注一下IO设备情况了;cpu负载需要排查了D状态进程问题后再去判断;

粗略来看,下图是成立的(之所以说粗略看,因为cpu使用率和loadAVG并无必然关系,但这个图中将二者建立关系了)。

状态为R,表示正在运行,或者处于运行队列,可以被调度运行。
状态为D,表示 uninterruptible sleep,这种状态是不可中断的,无论是kill,kill -9,还是kill -15。
处于D状态的进程通常是在等待IO,比如磁盘 IO,网络 IO,其他外设 IO。
如果处于D状态的时间较长,意味着可能是IO设备本身出了故障。

其他注意事项

什么样的进程会被统计到load里?

进程状态出于R和D(不可中断睡眠)。D状态的进程不常见,等待IO的时候会处于这个状态,一般情况下这个状态时间非常短,如果我们看到大量的D状态的进程,这个时候cpu的使用率未必很高,说明IO遇到瓶颈或IO设备出现了问题;

iowait多少算高

一般 iowait 达 30% 就算高了,需要关注。
使用:iostat -x 1 10
其中如果 %util 到 70%,那么磁盘IO 就很频繁了,需要重点关注。

vmstat命令

查看loadavg中,由于cpu任务队列贡献(cpu竞争排队)和IO任务队列贡献(IO竞争排队)。
vmstat是一个常用的系统性能分析工具,主要用来分析系统内存使用情况,也常用来分析CPU上下文切换和中断的次数。

1
2
## 每隔3秒输出一组数据,输出一次
vmstat 3 1


其中:
r(running or runnable)就是就绪队列的长度,也就是正在运行和等待CPU的进程数。
b(blocked)处于不可中断睡眠状态的进程数。
此外:
cs(context switch):每秒上下文切换的次数。
in(interrupt):每秒中断的次数。

vmstat只给出了系统总体的上下文切换情况,想要查看每隔进程的详细情况,可以使用pidstat。

其中:
cswch表示每秒资源上下文切换(voluntary context switches)的次数
自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如,I/O、内存等系统资源不足时,就会发生自愿上下文切换。

nvcswch表示每秒非自愿上下文切换(non voluntary context switches)的次数。
非资源上下文切换,是指进程由于时间片已到等原因,被系统强制调度,进程发生的上下文切换。比如说,大量进程都在争抢CPU时候,就容易发生非自愿上下文切换。

资源上下文切换变多了,说明进程都在等待资源,有可能发生了I/O等其他问题
非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢CPU。说明cpu是瓶颈。
中断次数变多了,说明cpu被中断处理程序占用,需要通过查看/proc/interrupts文件来分析具体的终端类型

mpstat命令

mpstat的统计信息来自/proc/stat文件
mpstat命令主要用来查看多CPU系统中每个CPU的负载是否均衡

输出各参数含义:

Note:
1.vmstat和mpstat 命令的差别:mpstat 可以显示每个处理器的统计,而 vmstat 显示所有处理器的统计。因此,编写糟糕的应用程序(不使用多线程体系结构)可能会运行在一个多处理器机器上,而不使用所有处理器。从而导致一个 CPU 过载,而其他 CPU 却很空闲。通过 mpstat 可以轻松诊断这些类型的问题。
2.vmstat中所有关于CPU的总结都适合mpstat。当您看到较低的 %idle 数字时,您知道出现了 CPU 不足的问题。当您看到较高的 %iowait 数字时,您知道在当前负载下 I/O 子系统出现了某些问题。
3,一般来说nice值应该是在-20~19的范围 默认是0。nice值越小 进程的优先度越高 只有root用户才可以设置nice负值(提高进程优先度)

pidstat命令

使用pidstat进行问题定位时,以下命令常被用到:

1
2
3
pidstat -u 1
pidstat -r 1
pidstat -d 1

以上命令以1秒为信息采集周期,分别获取cpu、内存和磁盘IO的统计信息。

示例七:pidstat -T

1
2
3
pidstat -T TASK
pidstat -T CHILD
pidstat -T ALL

TASK表示报告独立的task。
CHILD关键字表示报告进程下所有线程统计信息。
ALL表示报告独立的task和task下面的所有线程。
注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。

参考

一文带你全面了解 Load Average (负载):https://www.sohu.com/a/217589014_262549
linux 平均负载 load average 的含义:www.zhangblog.com/2019/09/14/linux-load/
linux服务器load average飚的很高,但是cpu和内存还可以,这是怎么回事呢:https://segmentfault.com/q/1010000003764511/a-1020000003766640
正确使用load average的姿势:https://blog.csdn.net/zqz_zqz/article/details/80392830
linux性能优化:https://zhuanlan.zhihu.com/p/141451255
进程实时监控pidstat命令详解:https://www.cnblogs.com/mululu/p/5833722.html
pidstat 命令详解(转载):https://www.cnblogs.com/wx170119/p/11411312.html
linux mpstat 命令使用详解:https://blog.csdn.net/wangquan1992/article/details/109490324
Linux硬中断和软中断:https://zhuanlan.zhihu.com/p/85597791
linux为什么要统计nice值为负的cpu占用情况:https://bbs.csdn.net/topics/360017438
Linux性能分析——mpstat求高手讲解?:https://www.zhihu.com/question/379075728

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×