压力集中在用户态 stress,顾名思义是一款压力测试工具。你可以用它来对系统CPU,内存,以及磁盘IO生成负载
执行内容
当stress测试CPU时,会不断调用进程,计算随机数的平方根;当测试内存时,会不断调用内存调用malloc和内存释放free函数;当测试磁盘I/O时,会不断调用sync()中断,以测试磁盘I/O。
命令说明
stress是一款压力测试工具,可以用它来对系统CPU,内存,以及磁盘IO生成负载。
安装:
yum install stress
参数:
# stress -?
`stress' imposes certain types of compute stress on your system
Usage: stress [OPTION [ARG]] ...
-?, --help show this help statement
--version show version statement
-v, --verbose be verbose
-q, --quiet be quiet
-n, --dry-run show what would have been done
-t, --timeout N timeout after N seconds
--backoff N wait factor of N microseconds before work starts
-c, --cpu N spawn N workers spinning on sqrt() 代表进程个数(每个进程会占用一个cpu,当超出cpu个数时,进程间会互相争用cpu)
-i, --io N spawn N workers spinning on sync() 表示调用sync(),它表示通过系统调用 sync() 来模拟 I/O 的问题; 但这种方法实际上并不可靠,因为 sync() 的本意是刷新内存缓冲区的数据到磁盘中,以确保同步。 如果缓冲区内本来就没多少数据,那读写到磁盘中的数据也就不多,也就没法产生 I/O 压力。stress-ng 来代替 stress
-m, --vm N spawn N workers spinning on malloc()/free()
--vm-bytes B malloc B bytes per vm worker (default is 256MB)
--vm-stride B touch a byte every B bytes (default is 4096)
--vm-hang N sleep N secs before free (default none, 0 is inf)
--vm-keep redirty memory instead of freeing and reallocating
-d, --hdd N spawn N workers spinning on write()/unlink()
--hdd-bytes B write B bytes per hdd worker (default is 1GB)
Example: stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s
Note: Numbers may be suffixed with s,m,h,d,y (time) or B,K,M,G (size).
CPU压力测试
虚拟机为4核,命令如下:
#stress -c 4
查看stress进程信息
#ps -elf |grep stress
2. 对内存进行压力测试
虚拟机内存为8G,使用4个工作进程来占用内存,每个进程占用512M内存,命令如下:
#stress -m 4 --vm-bytes 512M
# ps -ef | grep stress
root 19439 4248 0 07:08 ttyS0 00:00:00 stress -m 4 --vm-bytes 512M
root 19440 19439 99 07:08 ttyS0 00:00:12 stress -m 4 --vm-bytes 512M
root 19441 19439 99 07:08 ttyS0 00:00:12 stress -m 4 --vm-bytes 512M
root 19442 19439 99 07:08 ttyS0 00:00:12 stress -m 4 --vm-bytes 512M
root 19443 19439 99 07:08 ttyS0 00:00:12 stress -m 4 --vm-bytes 512M
root 19473 4248 0 07:09 ttyS0 00:00:00 grep --color=auto stress
3. 对磁盘进行压力测试
对磁盘压力测试有两个参数:
stress -i N 会产生N个进程,每个进程反复调用sync()将内存上的内容写到硬盘上.
而 stress -d N 会产生N个进程,每个进程往当前目录中写入固定大小的临时文件,然后执行unlink操作删除该临时文件。 临时文件的大小默认为1G,但可以通过 --hdd-bytes 设置临时文件的大小。
#stress -i 4 -d 4 --hdd-bytes 2G
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 8.0G 8.0G 2.8M 100% /
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 17M 3.9G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
tmpfs 783M 0 783M 0% /run/user/0
4. 同时对多项进行压力测试
stress支持同时对多个指标进行压力测试,只需要把上面的参数组合起来就行
stress -c 4 -m 2 -d 1
这个时候你再看stress进程
ps -elf |grep stress |grep -v grep
你会发现工作进程一共有7个,也就是说每个进程只负责一项测试。
5. 设置超时时间
通过 -t TIMEOUT 可以让stress只运行一段时间后自动退出。这一般在写脚本的时候会用到。
比如我想要运行上面的测试,但是10秒后自动退出,那么
stress -c 4 -m 2 -d 1 -t 10s
使用场景
应用场景1 CPU 密集型进程(使用CPU的进程)
使用2颗CPU
[root@nginx ~]# stress --cpu 2 --timeout 600
[root@nginx ~]# uptime
10:33:44 up 28 min, 4 users, load average: 1.99, 1.39, 0.81
[root@nginx ~]# mpstat -P ALL 5 1
Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
Average: all 50.05 0.00 0.08 0.00 0.00 0.00 0.00 0.00 0.00 49.87
Average: 0 0.07 0.00 0.17 0.00 0.00 0.01 0.00 0.00 0.00 99.75
Average: 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: 2 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: 3 0.08 0.00 0.15 0.01 0.00 0.01 0.00 0.00 0.00 99.76
[root@nginx sysstat-12.1.5]# pidstat -u 5
1.通过uptime可以观察到,系统平均负载很高,通过mpstat观察到2个CPU使用率很高,平均负载也很高,而iowait为0,说明进程是CPU密集型的;
2.是由进程使用CPU密集导致系统平均负载变高、CPU使用率变高;
3.可以通过pidstat查看是哪个进程导致CPU使用率较高
复制
应用场景2 I/O 密集型进程(等待IO的进程)
对IO进行压测(使用stress观测到的iowait指标可能为0,所以使用stress-ng)
[root@nginx ~]# stress-ng -i 4 --hdd 1 --timeout 600
[root@nginx ~]# uptime
11:11:12 up 1:05, 4 users, load average: 4.35, 4.11, 3.65
[root@nginx ~]# mpstat -P ALL 5
Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
Average: all 0.20 0.00 13.04 38.70 0.00 1.33 0.00 0.00 0.00 46.73
Average: 0 0.07 0.00 6.63 40.96 0.00 3.72 0.00 0.00 0.00 48.62
Average: 1 0.19 0.00 20.14 26.77 0.00 0.04 0.00 0.00 0.00 52.85
Average: 2 0.27 0.00 13.81 45.15 0.00 0.88 0.00 0.00 0.00 39.89
Average: 3 0.27 0.00 11.22 42.20 0.00 0.80 0.00 0.00 0.00 45.51
[root@nginx sysstat-12.1.5]# pidstat -u 5
1.可以通过uptime观察到,系统平均负载很高,通过mpstat观察到CPU使用很低,iowait很高,一直在等待IO处理,说明此进程是IO密集型的;
2.是由进程频繁的进行IO操作,导致系统平均负载很高而CPU使用率不高的情况;
复制
场景三:大量进程的场景(等待CPU的进程->进程间会争抢CPU)
模拟16个进程,本机是4核
[root@nginx ~]# stress -c 16 --timeout 600
[root@nginx ~]# uptime
11:23:24 up 1:18, 4 users, load average: 15.10, 8.98, 6.04
[root@nginx ~]# mpstat -P ALL 5
Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
Average: all 99.92 0.00 0.08 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: 0 99.87 0.00 0.13 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: 1 99.96 0.00 0.04 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: 2 99.90 0.00 0.10 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: 3 99.93 0.00 0.07 0.00 0.00 0.00 0.00 0.00 0.00 0.00
[root@nginx sysstat-12.1.5]# pidstat -u 5 1
Linux 3.10.0-957.21.3.el7.x86_64 (nginx) 07/10/2019 _x86_64_ (4 CPU)
11:23:07 AM UID PID %usr %system %guest %wait %CPU CPU Command
11:23:12 AM 0 23613 25.15 0.00 0.00 75.25 25.15 1 stress
11:23:12 AM 0 23614 24.95 0.00 0.00 75.45 24.95 0 stress
11:23:12 AM 0 23615 25.15 0.00 0.00 75.25 25.15 0 stress
11:23:12 AM 0 23616 24.95 0.00 0.00 74.65 24.95 0 stress
11:23:12 AM 0 23617 25.15 0.00 0.00 74.85 25.15 1 stress
11:23:12 AM 0 23618 24.75 0.00 0.00 75.25 24.75 1 stress
11:23:12 AM 0 23619 24.75 0.00 0.00 75.85 24.75 2 stress
11:23:12 AM 0 23620 24.55 0.00 0.00 75.65 24.55 2 stress
11:23:12 AM 0 23621 25.35 0.00 0.00 74.85 25.35 3 stress
11:23:12 AM 0 23622 25.35 0.00 0.00 74.45 25.35 3 stress
11:23:12 AM 0 23623 25.15 0.00 0.00 75.65 25.15 1 stress
11:23:12 AM 0 23624 25.35 0.00 0.00 74.45 25.35 3 stress
11:23:12 AM 0 23625 24.55 0.00 0.00 75.45 24.55 2 stress
11:23:12 AM 0 23626 24.95 0.00 0.00 75.45 24.95 0 stress
11:23:12 AM 0 23627 24.75 0.00 0.00 75.65 24.75 3 stress
11:23:12 AM 0 23628 24.55 0.00 0.00 75.05 24.55 2 stress
11:23:12 AM 0 23803 0.20 0.40 0.00 0.80 0.60 2 watch
11:23:12 AM 0 24022 0.00 0.20 0.00 0.00 0.20 2 pidstat
1.通过uptime观察到系统平均负载很高,通过mpstat观察到CPU使用率也很高,iowait为0,说明此进程是CPU密集型的,或者在进行CPU的争用;
2.通过pidstat -u观察到wait指标很高,则说明进程间存在CPU争用的情况,可以判断系统中存在大量的进程在等待使用CPU;
3.大量的进程,超出了CPU的计算能力,导致的系统的平均负载很高;
评论区