赞
踩
mpstat的全称为Multiprocessor Statistics,是一款常用的多核CPU性能分析工具,用来实时查询每个CPU的性能指标,以及所有CPU的平均指标。
这个命令Linux缺省没有安装,它是Linux性能工具集sysstat中的一个工具,所以我们要装上sysstat,安装方法随不同的系统略有不同,自行百度,我列出CentOS和Ubuntu的安装方法:
[root@localhost ~]# yum -y install sysstat # CentOS
[root@localhost ~]# apt install sysstat # ubuntu
mpstat的语法:
mpstat [-P {|ALL}] [internal [count]]
参数解释:
实操一把:
[root@localhost ~]# mpstat -P ALL 3 2 # –P ALL 选项指示该命令显示所有 CPU 的统计信息 # 3 2 该指令每隔3秒运行一次,总共运行两次 Linux 2.6.32-642.el6.x86_64 (localhost.localdomain) 2020年04月11日 _x86_64_ (2 CPU) #第一部分 11时01分42秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 11时01分45秒 all 0.51 0.00 0.34 0.00 0.00 0.17 0.00 0.00 98.99 11时01分45秒 0 0.68 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.32 11时01分45秒 1 0.34 0.00 0.34 0.00 0.00 0.34 0.00 0.00 98.98 11时01分45秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 11时01分48秒 all 0.17 0.00 1.19 0.00 0.00 0.17 0.00 0.00 98.47 11时01分48秒 0 0.00 0.00 1.03 0.00 0.00 0.00 0.00 0.00 98.97 11时01分48秒 1 0.34 0.00 1.35 0.00 0.00 0.34 0.00 0.00 97.98 #第二部分 平均时间: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 平均时间: all 0.34 0.00 0.76 0.00 0.00 0.17 0.00 0.00 98.73 平均时间: 0 0.34 0.00 0.51 0.00 0.00 0.00 0.00 0.00 99.15 平均时间: 1 0.34 0.00 0.84 0.00 0.00 0.34 0.00 0.00 98.48
第一部分:输出首先显示了所有 CPU 的合计指标,然后显示了每个 CPU 各项的指标。
第二部分:在结尾处显示所有 CPU 的平均值。
各列的含义:
mpstat主要用在当系统变慢,平均负载增大时,我们想判断到底是CPU的使用率增大了,还是IO压力增大的情况。
当系统变慢,我们第一返佣是用top或uptime来了解系统的负载情况。
[root@localhost ~]# uptime
11:32:25 up 34 min, 2 users, load average: 0.20, 0.36, 0.32
load average理解
不是CPU的使用率,和CPU的使用率没有直接关系。它指的是单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。
既然是平均活跃进程数,那么最理想的,就是每个CPU上都刚好运行着一个进程,这样每个CPU都得到了充分的利用。比如当平均负载为2时:
前面我们说到,平均负载最理想等于CPU个数,所以要判断平均负载,就先得知道有几个CPU,用如下命令:
[root@localhost ~]# grep 'name' /proc/cpuinfo | wc -l
有了这个数据,如果平均负载大于大于CPU个数,说明过载了。
不过,平均负载有三个值,我们改参考哪一个呢?其实我们应该根据这三个值来判断系统负载的趋势。
一般在工作中,当平均负载高于70%时,我们根据系统负载的历史数据,判断变化趋势,来排查问题。
平均负载不仅包含正在使用CPU的进程,还包括等待CPU和等待IO的进程。而CPU的使用率,是单位时间内CPU的繁忙情况,跟平均负载不一定完全对应,比如:
计算密集型进程,会大量使用CPU导致平均负载增高,这时,两者一致。
I/O密集型进程,等待I/O导致负载很高,但CPU使用率不一定高。
大量等待CPU的进程调度也会导致平均负载增高,此时CPU的使用率也会比较高。
下面我们来演示,上面说的平均负载高的情况。我采用stress压力测试工具,模拟高计算,高IO的情况,使用uptime查看平均负载,使用mpstat和pidstat工具,找出平均负载高的根源。
模拟一个CPU使用率为100%的场景:
[root@localhost ~]# stress --cpu 1 --timeout 600
在第二个终端用uptime查看平均负载的变化情况:
[root@localhost ~]# watch -d uptime # -d表示高亮显示变化区域
... load average : 1.00 0.66 0.45
在第三个终端使用mpstat查看CPU使用率的变化情况:
[root@localhost ~]# mpstat -P ALL 3
12时51分43秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
12时51分46秒 all 50.42 0.00 0.17 0.00 0.00 0.00 0.00 0.00 49.41
12时51分46秒 0 99.67 0.00 0.33 0.00 0.00 0.00 0.00 0.00 0.00
12时51分46秒 1 1.00 0.00 0.33 0.00 0.00 0.00 0.00 0.00 98.66
通过uptime可以看到,1分钟的平均负载慢慢的增加到1.00,从第三个终端可以看到,有一个CPU的使用率99.67%了,iowait只有0.00。说明平均负载的增高是由于CPU的使用率高。
那么,到底是哪个进程导致了CPU使用率的增高,可以使用pidstat来查询:
[root@localhost ~]# pidstat -u 5 1
Linux 2.6.32-642.el6.x86_64 (localhost.localdomain) 2020年04月11日 _x86_64_ (2 CPU)
12时59分32秒 PID %usr %system %guest %CPU CPU Command
12时59分38秒 1915 0.00 0.19 0.00 0.19 1 vmtoolsd
12时59分38秒 4842 0.19 0.00 0.00 0.19 1 watch
12时59分38秒 5093 97.66 0.00 0.00 97.66 0 stress
12时59分38秒 5113 0.19 0.39 0.00 0.58 1 pidstat
平均时间: PID %usr %system %guest %CPU CPU Command
平均时间: 1915 0.00 0.19 0.00 0.19 - vmtoolsd
平均时间: 4842 0.19 0.00 0.00 0.19 - watch
平均时间: 5093 97.66 0.00 0.00 97.66 - stress
平均时间: 5113 0.19 0.39 0.00 0.58 - pidstat
可以看到是stress进程的CPU使用率都快接近100%了。
使用stress模拟IO压力。
[root@localhost ~]# stress -i 1 --timeout 600
在第二个终端用uptime查看平均负载的变化情况:
[root@localhost ~]# watch -d uptime
... load average : 1.00 0.66 0.45
在第三个终端使用mpstat查看CPU使用率的变化情况:
[root@localhost ~]# mpstat -P ALL 3
13时09分03秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
13时09分06秒 all 8.13 0.00 51.90 0.00 0.17 0.00 0.00 0.00 39.79
13时09分06秒 0 16.79 0.00 0.71 0.00 0.36 0.00 0.00 0.00 82.14
13时09分06秒 1 0.00 0.00 100.00 0.00 0.00 0.00 0.00 0.00 0.00
在这里,我本来是想模拟高IO,应该iowait上很高才对,可是为什么我这里都是0,但sys很高呢?原因是stress模拟高IO,一直调用sync(),用来刷新内存缓存区的数据到磁盘,但我内存缓存区并没有多少数据,所以没法产生IO压力,并且我的硬盘是SSD的。这里单纯大量的系统调用,导致了CPU使用率sys高。
// stress测试工具的测试io压力源代码。
int hogio() {
while (1)
sync();
return 0;
}
为了让IO更为极端的影响性能,下面是我自己实现了一个模拟高IO的程序。
禁用磁盘上的高速缓存
[root@localhost ~]# hdparm -W0 /dev/sda
实现代码:
int main( void ) {
int fd = open("test.txt", O_RDWR|O_DIRECT|O_CREAT, 0644);
int i;
void *buf = (char*)memalign(4096,1,1);
for (i=0; i<521*1024*1024; i++) {
buf = i%26 + 'a';
write(fd, &buf, 1);
fsync(fd);
}
close(fd);
}
执行上面代码,我们用mpstat在看看SSD盘上的情况。
14时46分05秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
14时46分10秒 all 2.87 0.00 29.41 26.40 1.72 0.57 0.00 0.00 39.02
14时46分10秒 0 3.74 0.00 39.12 1.02 4.08 0.00 0.00 0.00 52.04
14时46分10秒 1 2.48 0.00 22.28 45.05 0.00 0.74 0.00 0.00 29.46
我们可以看到iowait已经是45.05%,说明系统平均负载高是有高IO导致的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。