linux_负载分析之LoadAverage

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

01,综合负载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无法工作了,这只是表示满负荷运行,例如实际生活中的例子,车道占满了,但是车流还能有序前进。
简单来说就是:“排队中的”除”正在处理中的”

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

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

02,vmstat(全局:cpu,内存,磁盘,进程队列,系统中断)

1
2
3
4
5
6
7
8
$ vmstat 1
procs ---------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
34 0 0 200889792 73708 591828 0 0 0 5 6 10 96 1 3 0 0
32 0 0 200889920 73708 591860 0 0 0 592 13284 4282 98 1 1 0 0
32 0 0 200890112 73708 591860 0 0 0 0 9501 2154 99 1 0 0 0
32 0 0 200889568 73712 591856 0 0 0 48 11900 2459 99 0 0 0 0
32 0 0 200890208 73712 591860 0 0 0 0 15898 4840 98 1 1 0 0

通过指定1作为 vmstat 的输入参数,它会输出每一秒内的统计结果。(在我们当前使用的)vmstat 输出的第一行数据是从启动到现在的平均数据,而不是前一秒的数据。所以我们可以跳过第一行,看看后面几行的情况。
检查下面各列:

CPU(用户态,系统态,IO等待)

us,sy,id,wa,st:它们是所有 CPU 的使用百分比。它们分别表示 用户态用时user time,系统态用时system time(处于内核态的时间),空闲idle,I/O 等待wait I/O和偷去的时间steal time(被其它租户,或者是租户自己的 Xen 隔离设备驱动域isolated driver domain所占用的时间)。
通过相加 us 和 sy 的百分比,你可以确定 CPU 是否处于忙碌状态。一个持续不变的 I/O 等待意味着瓶颈在硬盘上,这种情况往往伴随着 CPU 的空闲,因为任务都卡在磁盘 I/O 上了。你可以把 I/O 等待当作 CPU 空闲的另一种形式,它额外给出了 CPU 空闲的线索。
I/O 处理同样会消耗系统时间。一个高于20%的平均系统时间,往往值得进一步发掘:也许系统花在 I/O 的时间太长了。
在上面的例子中,CPU 基本把时间花在用户态里面,意味着跑在上面的应用占用了大部分时间。此外,CPU 平均使用率在90%之上。这不一定是个问题;检查下“r”列,看看是否饱和了。

内存(交换分区,空闲,cache,buff,换入换出)

free:空闲的内存千字节数。如果你数不清有多少位,就说明系统内存是充足的。接下来要讲到的第7个命令,free -m,能够更清楚地说明空闲内存的状态。
si,so:交换分区换入和换出。如果它们不为零,意味着内存已经不足,开始动用交换空间的存粮了。

磁盘(读写)

bi,bo:bi表示有多少数据从磁盘读入内存,bo表示有多少数据从内存写入磁盘

进程队列(排队,不可中断睡眠)

r:等待 CPU 的进程数。该指标能更好地判定 CPU 是否饱和,因为它不包括 I/O。简单地说,r 值高于 CPU 数时就意味着饱和。
b(blocked)处于不可中断睡眠状态的进程数。

系统(中断,上下文切换)

in(interrupt):每秒中断的次数
cs(context switch):每秒上下文切换的次数(cs一般大于in)。例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

系统中断cs一般大于in

原因大多中断大概率导致上下文切换,而上线文切换并不是只有中断能触发。所以,cs范畴相对较大。

03,mpstat(多核心:cpu,系统中断)

mpstat最大的特点是:可以查看多核心的cpu中每个计算核心的统计数据;而且类似工具vmstat只能查看系统的整体cpu情况。
mpstat的统计信息来自/proc/stat文件
mpstat命令主要用来查看多CPU系统中每个CPU的负载是否均衡

实例

查看多核cpu当前运行的状况,每两秒更新一次,一共更新5次

1
2
3
4
5
6
7
8
9
10
# mpstat 2 5
Linux 3.10.0-327.el7.x86_64 (yankerp) 11/01/2017 _x86_64_ (1 CPU)

07:13:28 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
07:13:30 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
07:13:32 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
07:13:34 PM all 0.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 99.00
07:13:36 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
07:13:38 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
Average: all 0.10 0.00 0.10 0.00 0.00 0.00 0.00 0.00 0.00 99.80

CPU

1
2
3
4
5
%user      在internal时间段里,用户态的CPU时间(%),不包含nice值为负进程  (usr/total)*100
%nice 在internal时间段里,nice值为负进程的CPU时间(%) (nice/total)*100
%sys 在internal时间段里,内核时间(%) (system/total)*100
%iowait 在internal时间段里,硬盘IO等待时间(%) (iowait/total)*100
%idle 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%) (idle/total)*100

系统中断

1
2
%irq         在internal时间段里,硬中断时间(%)     (irq/total)*100
%soft 在internal时间段里,软中断时间(%) (softirq/total)*100

vmstat和mpstat命令差别

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负值(提高进程优先度)

在不考虑虚拟化环境的情况下,有下面的公式
总CPU时间片 = user + nice + system + iowait + irq + softirq + idle

04,pidstat(进程:cpu,内存,磁盘,系统中断)

示例

查看资源占用情况:pidstat -urdwh -p xxx 1 1(-urd分别是cpu、内存和磁盘IO。-h合并显示,-p特定进程,-t特定线程,1采集周期,-w上下文切换情况)

1
2
3
4
5
(base) john@john-HLYL-WXX9:~$ pidstat -urdh -p 4192 1 1
Linux 5.11.0-27-generic (john-HLYL-WXX9) 2021年01月16日 _x86_64_ (12 CPU)

# Time UID PID %usr %system %guest %wait %CPU CPU minflt/s majflt/s VSZ RSS %MEM kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
21时24分20秒 1000 4192 19.80 0.99 0.00 0.00 20.79 9 505.94 0.00 21489332 248592 1.57 0.00 0.00 0.00 0 chrome

CPU(-u)

PID:进程ID
%usr:进程在用户空间占用cpu的百分比
%system:进程在内核空间占用cpu的百分比
%guest:进程在虚拟机占用cpu的百分比
%CPU:进程占用cpu的百分比
CPU:处理进程的cpu编号
Command:当前进程对应的命令

内存(-r)

Minflt/s:任务每秒发生的次要错误,不需要从磁盘中加载页
Majflt/s:任务每秒发生的主要错误,需要从磁盘中加载页
VSZ:虚拟地址大小,虚拟内存的使用KB
RSS:常驻集合大小,非交换区五里内存使用KB

磁盘(-d)

kB_rd/s:每秒从磁盘读取的KB
kB_wr/s:每秒写入磁盘KB
kB_ccwr/s:任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生。

系统(进程的上下文切换,-w)

每个进程的上下文切换情况(-w)
cswch表示每秒资源上下文切换(voluntary context switches)的次数,自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如,I/O、内存等系统资源不足时,就会发生自愿上下文切换。
nvcswch表示每秒非自愿上下文切换(non voluntary context switches)的次数。非自愿上下文切换,是指进程由于时间片已到等原因,被系统强制调度,进程发生的上下文切换。比如说,大量进程都在争抢CPU时候,就容易发生非自愿上下文切换。
自愿上下文切换变多了,说明进程都在等待资源,有可能发生了I/O等其他问题
非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢CPU。说明cpu是瓶颈
中断次数变多了,说明cpu被中断处理程序占用,需要通过查看/proc/interrupts文件来分析具体的终端类型。

线程的统计信息(-t)

选择任务的线程的统计信息外的额外信息 (-t)

1
2
pidstat -t -p 2831
或pidstat -turdwh -p xxx 1 1

TGID:主线程的表示
TID:线程id
%usr:进程在用户空间占用cpu的百分比
%system:进程在内核空间占用cpu的百分比
%guest:进程在虚拟机占用cpu的百分比
%CPU:进程占用cpu的百分比
CPU:处理进程的cpu编号
Command:当前进程对应的命令

iowait多少算高

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

05,iostat(磁盘:读写次数,大小,平均大小,请求队列,等待时间,繁忙)

命令举例

参数含义:
第一列Device比较容易理解,就是说这一行描述的是哪一个设备。
rrqm/s : 每秒合并读操作的次数
wrqm/s: 每秒合并写操作的次数
r/s :每秒读操作的次数
w/s : 每秒写操作的次数
rMB/s :每秒读取的MB字节数
wMB/s: 每秒写入的MB字节数
avgrq-sz:每个IO的平均扇区数,即所有请求的平均大小,以扇区(512字节)为单位
avgqu-sz:平均为完成的IO请求数量,即平均意义山的请求队列长度
await:平均每个IO所需要的时间,包括在队列等待的时间,也包括磁盘控制器处理本次请求的有效时间。
r_wait:每个读操作平均所需要的时间,不仅包括硬盘设备读操作的时间,也包括在内核队列中的时间。
w_wait: 每个写操平均所需要的时间,不仅包括硬盘设备写操作的时间,也包括在队列中等待的时间。
svctm: 表面看是每个IO请求的服务时间,不包括等待时间,但是实际上,这个指标已经废弃。实际上,iostat工具没有任何一输出项表示的是硬盘设备平均每次IO的时间。
%util: 工作时间或者繁忙时间占总时间的百分比

avgqu-sz和繁忙程度
首先我们用超市购物来比对iostat的输出。我们在超市结账的时候,一般会有很多队可以排,队列的长度,在一定程度上反应了该收银柜台的繁忙程度。那么这个变量是avgqu-sz这个输出反应的,该值越大,表示排队等待处理的io越多。
avgrq-sz和平均大小
avgrq-sz这个值反应IO是大IO还是小IO。它的含义是说,平均下来,这这段时间内,所有请求的平均大小,单位是扇区,即(512字节,就是0.5KB)。
rrqm/s和wrqm/s和合并IO
块设备有相应的调度算法。如果两个IO发生在相邻的数据块时,他们可以合并成1个IO。

iostat数据的来源是Linux操作系统的/proc/diskstats

06,sar(全局:cpu,内存,磁盘,进程队列,网络)

sar-命令详解
https://zhuanlan.zhihu.com/p/165565968
Linux系列之SAR命令使用详解:https://blog.csdn.net/volitationLong/article/details/81741754

CPU(-u)

1
sar -u 1 10 (1:每隔一秒,10:写入10次)

字段含义:

1
2
3
4
5
6
7
8
9
10
11
CPU:all 表示统计信息为所有 CPU 的平均值。  
%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。
%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。
%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。
%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。
%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。

1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。

内存(-r)


输出项说明:
kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间.
kbmemused:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间.
%memused:这个值是kbmemused和内存总量(不包括swap)的一个百分比.
kbbuffers和kbcached:这两个值就是free命令中的buffer和cache.
kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).
%commit:这个值是kbcommit与内存总量(包括swap)的一个百分比.

I/O(-b)

输出项说明:
tps:每秒钟物理设备的 I/O 传输总量
rtps:每秒钟从物理设备读入的数据总量
wtps:每秒钟向物理设备写入的数据总量
bread/s:每秒钟从物理设备读入的数据量,单位为 块/s
bwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s

内存分页(-B)


输出项说明:
pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)
pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)
fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)
majflt/s:每秒钟产生的主缺页数.
pgfree/s:每秒被放入空闲队列中的页个数
pgscank/s:每秒被kswapd扫描的页个数
pgscand/s:每秒直接被扫描的页个数
pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数
%vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比

进程队列长度和平均负载(-q)


输出项说明:
runq-sz:运行队列的长度(等待运行的进程数)
plist-sz:进程列表中进程(processes)和线程(threads)的数量
ldavg-1:最后1分钟的系统平均负载(System load average)
ldavg-5:过去5分钟的系统平均负载
ldavg-15:过去15分钟的系统平均负载
blocked:当前阻塞的任务数,等待I / O完成

网络

sar -n DEV (查看全天)
sar -n DEV 1 2 (1:每隔一秒,2:写入2次)

DEV关键字以设备为单位提供网络统计报告,方便快速观察各网卡性能:

IFACE:设备名;
rxpck/s:每秒钟接收的数据包;
txpck/s:每秒钟发送的数据包;
rxbyt/s:每秒钟接收的字节数;
txbyt/s:每秒钟发送的字节数;
rxcmp/s:每秒钟接收的压缩数据包;
txcmp/s:每秒钟发送的压缩数据包;
rxmcst/s:每秒钟接收的多播数据包。

ETCP关键字报告TCP层的错误统计,包括重试、断连、重传、错误、RST包等:
atmptf/s:每秒重试失败数;
estres/s:每秒断开连接数;
retrans/s:每秒重传数;
isegerr/s:每秒错误数;
orsts/s:每秒RST数。

通常情况下可以将DEV和ETCP结合使用,如:sar -n DEV -n ETCP ,快速观察网络性能状况,结果如图2:

07,系统异常dmesg | tail

1
2
3
4
5
6
$ dmesg | tail
[1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
[...]
[1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child
[1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB
[2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request. Check SNMP counters.

这个命令显示了最新的10个系统信息,如果有的话。注意会导致性能问题的错误信息。上面的例子里就包括对过多占用内存的某进程的死刑判决,还有丢弃 TCP 请求的公告。
不要漏了这一步!检查dmesg总是值得的。

08,典型场景分析和故障排除

使用如下工具:
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时间此时大概率是瓶颈资源

场景4:CPU低、Load高

通过top命令查看CPU等待IO时间,即%wa;
通过iostat -d -x -m 1 10查看磁盘IO情况;(安装命令 yum install -y sysstat)
通过sar -n DEV 1 10查看网络IO情况;
通过如下命令查找占用IO的程序;

1
ps -e -L h o state,cmd  | awk '{if($1=="R"||$1=="D"){print $0}}' | sort | uniq -c | sort -k 1nr

场景5:网络问题定位(ping,netstat,sar)

通过ping命令检测网络的连通性。
通过netstat -i 组合检测网络接口状况。
通过netstat -r 组合检测系统路由表信息。
通过sar -n 组合显示系统的网络运行状态(sar -n DEV 5 3)。

1
2
3
4
5
6
7
8
9
10
$ sar -n DEV 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
12:16:48 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
12:16:49 AM eth0 18763.00 5032.00 20686.42 478.30 0.00 0.00 0.00 0.00
12:16:49 AM lo 14.00 14.00 1.36 1.36 0.00 0.00 0.00 0.00
12:16:49 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
12:16:49 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
12:16:50 AM eth0 19763.00 5101.00 21999.10 482.56 0.00 0.00 0.00 0.00
12:16:50 AM lo 20.00 20.00 3.25 3.25 0.00 0.00 0.00 0.00
12:16:50 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

这个命令可以用于检查网络流量的工作负载:rxkB/s 和 txkB/s,以及它是否达到限额了。上面的例子中,eth0接收的流量达到 22Mbytes/s,也即 176Mbits/sec(限额是 1Gbit/sec)
我们用的版本中还提供了%ifutil作为设备使用率(接收和发送两者中的最大值)的指标。我们也可以用 Brendan 的 nicstat计量这个值。一如nicstat,sar显示的这个值不一定是对的,在这个例子里面就没能正常工作(0.00)。

1
2
3
4
5
6
7
8
9
10
$ sar -n TCP,ETCP 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
12:17:19 AM active/s passive/s iseg/s oseg/s
12:17:20 AM 1.00 0.00 10233.00 18846.00
12:17:19 AM atmptf/s estres/s retrans/s isegerr/s orsts/s
12:17:20 AM 0.00 0.00 0.00 0.00 0.00
12:17:20 AM active/s passive/s iseg/s oseg/s
12:17:21 AM 1.00 0.00 8359.00 6039.00
12:17:20 AM atmptf/s estres/s retrans/s isegerr/s orsts/s
12:17:21 AM 0.00 0.00 0.00 0.00 0.00

这个命令显示一些关键TCP指标的汇总。其中包括:
active/s:本地每秒创建的 TCP 连接数(比如 concept() 创建的)
passive/s:远程每秒创建的 TCP 连接数(比如 accept() 创建的)
retrans/s:每秒 TCP 重传次数
主动连接数active和被动连接数passive通常可以用来粗略地描述系统负载。可以认为主动连接是对外的,而被动连接是对内的,虽然严格来说不完全是这个样子。(比如,一个从 localhost 到 localhost 的连接)
重传是网络或系统问题的一个信号;它可能是不可靠的网络(比如公网)所造成的,也有可能是服务器已经过载并开始丢包。在上面的例子中,每秒只创建一个新的 TCP 连接。

故障排除总结

不能单纯以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 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
Linux 性能分析的前 60 秒:https://www.cnblogs.com/tcicy/p/8512159.html
vmstat命令中System下in cs 何时为高?:https://blog.csdn.net/weixin_34392906/article/details/93360256
看了这篇还不会Linux性能分析和优化,你来打我:https://my.oschina.net/u/3499852/blog/5040635
深入理解iostat:https://blog.csdn.net/shaochenshuo/article/details/76212566
pidstat 命令详解:https://www.jianshu.com/p/3991c0dba094
详解mpstat、iostat、sar、vmstat命令的使用:https://blog.csdn.net/qq_39591494/article/details/78418162
sar-命令详解:https://zhuanlan.zhihu.com/p/165565968
Linux排查Load过高问题:https://blog.csdn.net/m0_38110132/article/details/84187399
网易老司机:网络性能问题该怎样监控与定位?:https://blog.csdn.net/wangyiyice/article/details/53502682

Your browser is out-of-date!

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

×