混沌测试--资源耗尽类故障注入

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

 

以上是关于混沌测试--资源耗尽类故障注入的主要内容,如果未能解决你的问题,请参考以下文章

混沌工程 Chaosd

混沌工程-物理机Chaosd使用

干货 | 阿里巴巴混沌测试工具ChaosBlade两万字解读

linux故障处理:磁盘资源耗尽故障

线上故障分析-故障分级,原因,分类,混沌工程,排除方法

云原生 | 混沌工程工具 ChaosBlade Operator Pod 篇