当前位置:   article > 正文

面试官都在问 | Linux命令mpstat详解_mpstat -p all

mpstat -p all

面试官都在问 | Linux命令mpstat详解

在这里插入图片描述

1. mpstat的基本用法

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
  • 1
  • 2

mpstat的语法:

mpstat    [-P {|ALL}]     [internal    [count]]
  • 1

参数解释:

  • -P: 指定要监控哪个CPU,范围是[0 ~ n-1], ALL表示监控所有CPU都监控
  • 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

第一部分:输出首先显示了所有 CPU 的合计指标,然后显示了每个 CPU 各项的指标。

第二部分:在结尾处显示所有 CPU 的平均值。

各列的含义:

  • %user: 表示用户态所使用 CPU 的百分比。
  • %nice: 表示使用 nice 命令对进程进行降级时 CPU 的百分比。
  • %sys: 表示内核进程使用的 CPU 百分比。
  • %iowait: 表示等待进行 I/O 所使用的 CPU 时间百分比。
  • %irq: 表示用于处理系统中断的 CPU 百分比。
  • %soft: 表示用于软件中断的 CPU 百分比。
  • %steal:虚拟机强制CPU等待的时间百分比。
  • %guest: 虚拟机占用CPU时间的百分比。
  • %idle: CPU 的空闲时间的百分比。

2. 高频问题案例

2.1 理解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
  • 1
  • 2

load average理解

  • 后面数字是过去1分钟、5分钟、15分钟的平均负载。
2.2 平均负载理解:

不是CPU的使用率,和CPU的使用率没有直接关系。它指的是单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。

  • 所谓的可运行状态,就是用ps命令看到的R状态,它指的是正在使用CPU和正在等待CPU的进程。
  • 所谓的不可中断状态,就是正处于内核状态关键流程的进程,并且这些流程是不可打断的,比如等待硬件设备I/O响应,也就是ps中看到的D状态的进程。

既然是平均活跃进程数,那么最理想的,就是每个CPU上都刚好运行着一个进程,这样每个CPU都得到了充分的利用。比如当平均负载为2时:

  • 在2个CPU的系统上,意味着每个CPU刚好被占完。
  • 在4个CPU的系统上,意味着每个CPU只占50%。
  • 在1个CPU的系统上,意味着有一半的进程竞争不到CPU。
2.3 平均负载到底多少比较合适呢?

前面我们说到,平均负载最理想等于CPU个数,所以要判断平均负载,就先得知道有几个CPU,用如下命令:

[root@localhost ~]# grep 'name' /proc/cpuinfo | wc -l
  • 1

有了这个数据,如果平均负载大于大于CPU个数,说明过载了。

不过,平均负载有三个值,我们改参考哪一个呢?其实我们应该根据这三个值来判断系统负载的趋势。

一般在工作中,当平均负载高于70%时,我们根据系统负载的历史数据,判断变化趋势,来排查问题。

2.4 平均负载和CPU使用率的关系

平均负载不仅包含正在使用CPU的进程,还包括等待CPU和等待IO的进程。而CPU的使用率,是单位时间内CPU的繁忙情况,跟平均负载不一定完全对应,比如:

  1. 计算密集型进程,会大量使用CPU导致平均负载增高,这时,两者一致。

  2. I/O密集型进程,等待I/O导致负载很高,但CPU使用率不一定高。

  3. 大量等待CPU的进程调度也会导致平均负载增高,此时CPU的使用率也会比较高。

3. 动手实战

下面我们来演示,上面说的平均负载高的情况。我采用stress压力测试工具,模拟高计算,高IO的情况,使用uptime查看平均负载,使用mpstat和pidstat工具,找出平均负载高的根源。

3.1 计算密集型

模拟一个CPU使用率为100%的场景:

[root@localhost ~]# stress --cpu 1 --timeout 600
  • 1

在第二个终端用uptime查看平均负载的变化情况:

[root@localhost ~]# watch -d uptime  # -d表示高亮显示变化区域
... load average : 1.00  0.66   0.45
  • 1
  • 2

在第三个终端使用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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

通过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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

可以看到是stress进程的CPU使用率都快接近100%了。

3.2 I/O密集型

使用stress模拟IO压力。

[root@localhost ~]# stress -i 1 --timeout 600
  • 1

在第二个终端用uptime查看平均负载的变化情况:

[root@localhost ~]# watch -d uptime
... load average : 1.00  0.66   0.45
  • 1
  • 2

在第三个终端使用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
  • 1
  • 2
  • 3
  • 4
  • 5

在这里,我本来是想模拟高IO,应该iowait上很高才对,可是为什么我这里都是0,但sys很高呢?原因是stress模拟高IO,一直调用sync(),用来刷新内存缓存区的数据到磁盘,但我内存缓存区并没有多少数据,所以没法产生IO压力,并且我的硬盘是SSD的。这里单纯大量的系统调用,导致了CPU使用率sys高。

// stress测试工具的测试io压力源代码。
int hogio() {
  while (1)
    sync();
  return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

为了让IO更为极端的影响性能,下面是我自己实现了一个模拟高IO的程序。

禁用磁盘上的高速缓存

[root@localhost ~]# hdparm -W0 /dev/sda
  • 1

实现代码:

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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

执行上面代码,我们用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
  • 1
  • 2
  • 3
  • 4

我们可以看到iowait已经是45.05%,说明系统平均负载高是有高IO导致的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/952256
推荐阅读
相关标签
  

闽ICP备14008679号