混沌測試--資源耗盡類故障注入


資源耗盡類故障主要參考如下:

 

 磁盤滿

方法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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM