" /> " />

目 录CONTENT

文章目录

Linux Stress:CPU、内存、磁盘的压力测试

Administrator
2024-02-21 / 0 评论 / 0 点赞 / 15 阅读 / 8472 字

压力集中在用户态 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的计算能力,导致的系统的平均负载很高;

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区