資源耗盡類故障主要參考如下:
磁盤滿
方法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