[Linux] 在 CentOS 上使用 stress 模擬系統資源吃緊的狀況 (CPU/記憶體/磁碟 I/O)
最近想要在 CentOS 上製造系統忙碌的狀況,看看能不能重現某個奇怪的 bug,
查了一下不少人建議可以用 stress 這個套件,
但是這個套件在 CentOS 7 裡面怎麼找都找不到,base / epel 都找遍了,
後來查到說這個套件目前是沒有擺在 CentOS 7 裡面的…
但我們還是可以手動下載安裝~
到 http://pkgs.repoforge.org/stress/ 這邊可以找到適用各平台的 stress RPM,
像我選的是給 CentOS 7 用的 el7 版本,用 yum 直接安裝:
sudo yum install http://pkgs.repoforge.org/stress/stress-1.0.2-1.el7.rf.x86_64.rpm
裝好後,執行 stress 就可以看到使用說明了,下面也很好心的附上一個使用範例:
root@localhost / # 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() -i, --io N spawn N workers spinning on sync() -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 is 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) --hdd-noclean do not unlink files created by hdd workers 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).
像我想要製造的是記憶體不足,產生大量 PAGE SCAN 的狀況,
因此可以用 –vm 加上 –vm-bytes 來吃掉大量的記憶體,
但到底要產生幾個 worker、每個 worker 要吃掉多少記憶體,還是跟測試的情境有關,得自己調整才行~
像我是產生 5 個 worker 來各別吃掉 1G 記憶體 (也就是一共吃掉 5G):
stress --vm 5 --vm-bytes 1G
執行之後,atop 立刻看到 MEM 記憶體部分出現很大的壓力,
PAG 這邊也顯示了大量的 PAGE SCAN 產生,表示系統正在掃瞄可以被放到 swap 的記憶體分頁,
這 swap 的動作也導致硬碟的 I/O 量大增,一整個紅色啊:
感覺 stress 是個不錯用的工具,可以用來模擬系統遇到資源吃緊的狀況,
看看自己的程式是不是還能盡量正常的運作 (或是在資源充足時,回復正常的運作) 囉~
參考資料:
superuser: How can I produce high CPU load on a Linux server?
“No package stress available, nothing to do”,”bash: yum-config-manager:command not found