混沌测试--资源耗尽类故障注入
Posted mingfan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了混沌测试--资源耗尽类故障注入相关的知识,希望对你有一定的参考价值。
资源耗尽类故障主要参考如下:
磁盘满
方法1:
找到对应的分区,dd一个大文件
dd if=/dev/zero of=/home/cli/diskfull.drill bs=1G count=10 #写10G
方法2:
阿里chaosblade(推荐)
./blade create disk fill --size 20480 --path=/home/cli
方法3:
vmware脚本
https://github.com/vmware/mangle/blob/master/mangle-default-plugin/src/main/resources/InjectionScripts/diskspace.sh
磁盘IO高
方法1:
通过dd不停的写磁盘
dd if=/dev/zero of=/data/diskfull.drill bs=1M count=10240 oflag=dsync
方法2:
阿里chaosblade
./blade create disk burn --write --read --timeout 300
方法3:
vmware脚本
https://github.com/vmware/mangle/blob/master/mangle-default-plugin/src/main/resources/InjectionScripts/ioburn.sh
内存使用率高
方法1:
自己写个应用不停的分配内存
```bash #!/bin/sh value=$(seq -w -s ‘‘ 0 100000000) sleep 1200 ``` 以上脚本大概分配1G(100000000*9/1024/1024)左右的内存,注意seq大小的控制,如果太大会导致进程崩溃,适当调整seq的大小;如果内存压力不够,多起几个进程。 ```bash # -bash:xrealloc:无法分配18446744071562067968字节(已分配1945600字节) # bash 4.4修复了这个问题(未验证)
方法2:
使用stress命令
```bash yum install stress -y stress --vm 1 --vm-bytes 3.9G --vm-keep --timeout 120s --vm 启动几个worker来进行压测 --vm-bytes 每个work分配的内存大小,不能超过物理内存总量,否则会运行失败 --vm-keep 保持内存高状态,如果不使用这个参数,内存会在占用率上去之后又下去,循环往复。
方法3:
使用ramfs或tmpfs往内存里写入文件
```bash mkdir z #以下2选1,区别参见括号 1. mount -t ramfs ramfs z/ #(z目录写空间写满后会可以继续写入) 2. mount -t tmpfs -o size=2048M tmfs z/ #(z目录写满后,无法继续写入) dd if=/dev/zero of=z/file bs=1M count=128 ```
使用ramfs时要注意控制写入内存的大小,如果太大会触发系统OOM,从而导致系统不停的杀进程,比如ssh进程可能被杀导致远程连接失败。
可以通过设置以下参数,如果系统OOM,就让系统kernel panic后重启。
```bash echo "vm.panic_on_oom=1" >> /etc/sysctl.conf echo "kernel.panic=10" >> /etc/sysctl.conf sysctl -p ```
方法4:
一行命令
```bash cat <(yes | tr \\n x | head -c $((1024*1024*100))) <(sleep 120) | grep n #占用100M内存 ```
方法5:
循环创建n个进程来占用内存空间(推荐)
有现成的脚本可以参考,来自vmware:
https://github.com/vmware/mangle/blob/master/mangle-default-plugin/src/main/resources/InjectionScripts/memoryspike.sh#L286 ```bash ./memoryspike.sh --operation=inject --load=80 --timeout=120000 #时间单位是毫秒 #help: --operation=<remediate | precheck | status > # --operation=inject --load=<load> --timeout=<timeoutinMilliseconds> ```
方法6:
使用阿里的chaosblade(推荐)
# 执行内存占用 50% blade c mem load --mode ram --mem-percent 50 # 保留 200M 内存 blade c mem load --mode ram --reserve 200 --rate 100
网卡流量满
方法1.
使用netperf工具进行打流,可以使用多个客户端对同一个服务端进行打流,造成网卡满的效果
下载安装:
https://github.com/HewlettPackard/netperf
服务端:
./netserver -p 20000 #服务端监听 20000端口
客户端(如果服务端网卡多,使用多个客户端同时打)
./netperf -t UDP_STREAM -H 172.16.0.22 -p 20000 -l 60 -- -m 1400
Netperf [global options] –-[test-specific options]
其中:
全局命令行参数包括如下选项:
-H host :指定远端运行netserver的server IP地址。
-l testlen:指定测试的时间长度(秒)
-t testname:指定进行的测试类型,包括TCP_STREAM,UDP_STREAM,TCP_RR,TCP_CRR,UDP_RR
测试相关的局部参数包括如下选项:
-s size 设置本地系统的socket发送与接收缓冲大小
-S size 设置远端系统的socket发送与接收缓冲大小
-m size 设置本地系统发送测试分组的大小
-M size 设置远端系统接收测试分组的大小
-D 对本地与远端系统的socket设置TCP_NODELAY选项
更多详细内容参见:
https://hewlettpackard.github.io/netperf/doc/netperf.html
方法2.使用iperf
详细参见
https://iperf.fr/iperf-doc.php#3doc
cpu利用率高
方法1:
使用yes命令(推荐)
yes>/dev/null
这个命令只能使cpu的1个核跑满100%,多核的话就起多个命令。
或使用vmware现成的脚本(推荐):
https://github.com/vmware/mangle/blob/master/mangle-default-plugin/src/main/resources/InjectionScripts/cpuburn.sh
方法2:
循环跑一个系统调用
#!/bin/bash while true do date>/dev/null done
方法二和方法二的区别在于方法一是us比较高,方法二是sy比较高,因为方法2的date命令会进行疯狂的系统调用,从而导致sy占比较高。
方法一和方法二对演练目的也没啥影响。
方法3:
循环跑ssl测试
#!/bin/bash while true do /usr/bin/openssl speed>/dev/null 2>&1 done
方法4.
使用stress工具
yum install stress -y stress -c 4 -t 120
stress简单用法:
-c cpu核心数量
-t 压测时长
方法5:
使用阿里的chaosblade(推荐)
./blade create cpu fullload
以上是关于混沌测试--资源耗尽类故障注入的主要内容,如果未能解决你的问题,请参考以下文章