介绍
高负载/cpu使用的压力测试(模拟一个cpu 密集型的进程)
$ stress --cpu 1 --timeout 600 #模拟启动一个cpu 线程在不停的使用cpu ,持续时间600s
查看负载和cpu使用情况
uptime 09:28:51 up 25 min, 4 users, load average: 0.88, 0.48, 0.52
#大概一分钟左右之后,过去1分钟的负载就会达到1
top - 09:29:59 up 26 min, 4 users, load average: 1.01, 0.60, 0.56
Tasks: 136 total, 2 running, 134 sleeping, 0 stopped, 0 zombie
%Cpu(s): 99.0 us, 1.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
cpu 使用率接近100%
模拟I/O 密集型进程
$ stress -i 1 --timeout 600 #
查看负载和cpu 情况
$ watch -d uptime ..., load average: 1.06, 0.58, 0.37
# 显示所有CPU的指标,并在间隔5秒输出一组数据
$ mpstat -P ALL 5 1
Linux 4.15.0 (ubuntu) 09/22/18 _x86_64_ (2 CPU)
13:41:28 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
13:41:33 all 0.21 0.00 12.07 32.67 0.00 0.21 0.00 0.00 0.00 54.84
13:41:33 0 0.43 0.00 23.87 67.53 0.00 0.43 0.00 0.00 0.00 7.74
13:41:33 1 0.00 0.00 0.81 0.20 0.00 0.00 0.00 0.00 0.00 98.99
# 可以看到,1 分钟的平均负载会慢慢增加到 1.06,其中一个 CPU 的系统 CPU 使用率升高到了 23.87,而 iowait 高达 67.53%。这说明,平均负载的升高是由于 iowait 的升高。
查看哪个进程导致的
# 间隔5秒后输出一组数据,-u表示CPU指标 $ pidstat -u 5 1 Linux 4.15.0 (ubuntu) 09/22/18 _x86_64_ (2 CPU) 13:42:08 UID PID %usr %system %guest %wait %CPU CPU Command 13:42:13 0 104 0.00 3.39 0.00 0.00 3.39 1 kworker/1:1H 13:42:13 0 109 0.00 0.40 0.00 0.00 0.40 0 kworker/0:1H 13:42:13 0 2997 2.00 35.53 0.00 3.99 37.52 1 stress 13:42:13 0 3057 0.00 0.40 0.00 0.00 0.40 0 pidstat
注意: iowait无法升高的问题,是因为案例中stress使用的是 sync() 系统调用,它的作用是刷新缓冲区内存到磁盘中。对于新安装的虚拟机,缓冲区可能比较小,无法产生大的IO压力,这样大部分就都是系统调用的消耗了。所以,你会看到只有系统CPU使用率升高。解决方法是使用stress的下一代stress-ng,它支持更丰富的选项,比如 stress-ng -i 1 --hdd 1 --timeout 600(--hdd表示读写临时文件)。
模拟大量进程的场景
$ stress -c 8 --timeout 600 #8个进程使用cpu 的场景持续1h
查看负载等情况
$ uptime ..., load average: 7.97, 5.93, 3.02
查看进程情况
# 间隔5秒后输出一组数据,一共输出一组 $ pidstat -u 5 1 14:23:25 UID PID %usr %system %guest %wait %CPU CPU Command 14:23:30 0 3190 25.00 0.00 0.00 74.80 25.00 0 stress 14:23:30 0 3191 25.00 0.00 0.00 75.20 25.00 0 stress 14:23:30 0 3192 25.00 0.00 0.00 74.80 25.00 1 stress 14:23:30 0 3193 25.00 0.00 0.00 75.00 25.00 1 stress 14:23:30 0 3194 24.80 0.00 0.00 74.60 24.80 0 stress 14:23:30 0 3195 24.80 0.00 0.00 75.00 24.80 0 stress 14:23:30 0 3196 24.80 0.00 0.00 74.60 24.80 1 stress 14:23:30 0 3197 24.80 0.00 0.00 74.80 24.80 1 stress 14:23:30 0 3200 0.00 0.20 0.00 0.20 0.20 0 pidstat
假设测试服务器cpu 为2核,可以看出,8 个进程在争抢 2 个 CPU,每个进程等待 CPU 的时间(也就是代码块中的 %wait 列)高达 75%。这些超出 CPU 计算能力的进程,最终导致 CPU 过载。
注意:1、pidstat 里面的%wait 与top 心事的%wait不一样,前者表示进程等待cpu时间百分比后者表示cpu等待io 时间百分比。
2、pidstat输出中没有%wait的问题,可能是默认的sysstat稍微有点老,源码或者RPM升级到11.5.5版本以后就可以看到了。Ubuntu的包一般都比较新,没有这个问题。