Linux stress 命令

stress 命令主要用來模擬系統負載較高時的場景,本文介紹其基本用法。文中 demo 的演示環境爲 ubuntu 18.04。linux

基本語法

語法格式:
stress <options>ios

經常使用選項:
-c, --cpu N              產生 N 個進程,每一個進程都反覆不停的計算隨機數的平方根
-i, --io N                  產生 N 個進程,每一個進程反覆調用 sync() 將內存上的內容寫到硬盤上
-m, --vm N             產生 N 個進程,每一個進程不斷分配和釋放內存
    --vm-bytes B      指定分配內存的大小
    --vm-stride B     不斷的給部份內存賦值,讓 COW(Copy On Write)發生
    --vm-hang N      指示每一個消耗內存的進程在分配到內存後轉入睡眠狀態 N 秒,而後釋放內存,一直重複執行這個過程
    --vm-keep          一直佔用內存,區別於不斷的釋放和從新分配(默認是不斷釋放並從新分配內存)
-d, --hadd N           產生 N 個不斷執行 write 和 unlink 函數的進程(建立文件,寫入內容,刪除文件)
    --hadd-bytes B  指定文件大小
-t, --timeout N       在 N 秒後結束程序        
--backoff N            等待N微妙後開始運行
-q, --quiet              程序在運行的過程當中不輸出信息
-n, --dry-run          輸出程序會作什麼而並不實際執行相關的操做
--version                顯示版本號
-v, --verbose          顯示詳細的信息git

安裝 stress

Ubuntu 系統默認沒有安裝 stress,須要經過下面的命令安裝:github

$ sudo apt install stress $ stress --version

消耗 CPU 資源

stress 消耗 CPU 資源的方式是經過調用 sqrt 函數計算由 rand 函數產生的隨機數的平方根實現的。下面的命令會產生 4 個這樣的進程不斷的進行計算:ubuntu

$ stress -c 4

使用 top 命令查看 CPU 的狀態以下(CPU 在用戶態滿負荷運轉):app

消耗內存資源

下面的命令產生兩個子進程,每一個進程分配 300M 內存:ide

$ stress --vm 2 --vm-bytes 300M --vm-keep

父進程處於睡眠狀態,兩個子進程負責資源消耗。函數

--vm-keep
一直佔用內存,區別於不斷的釋放和從新分配(默認是不斷釋放並從新分配內存)。
--vm-hang N
指示每一個消耗內存的進程在分配到內存後轉入睡眠狀態 N 秒,而後釋放內存,一直重複執行這個過程。工具

--vm-keep 和 --vm-hang 均可以用來模擬只有少許內存的機器,可是指定它們時 CPU 的使用狀況是不同的。性能

$ stress --vm 2 --vm-bytes 500M --vm-keep

一直在進行默認的 stride 操做,user 很是高(cpu 在用戶態忙碌)。

$ stress --vm 2 --vm-bytes 500M --vm-hang 5

上面這兩種狀態不斷切換,但總體上看 CPU 的負載並不高。

--vm-stride B
不斷的給部份內存賦值,讓 COW(Copy On Write)發生。只要指定了內存相關的選項,這個操做就會執行,只是大小爲默認的 4096。賦值內存的比例由參數決定:

for (i = 0; i < bytes; i += stride) ptr[i] = 'Z';           /* Ensure that COW happens. */

bytes 爲消耗的總內存大小,stride 爲間隔。
該參數會影響 CPU 狀態 us 和 sy:

$ stress --vm 2 --vm-bytes 500M --vm-stride 64

$ stress --vm 2 --vm-bytes 500M --vm-stride 1M

爲何會產生這樣的結果?緣由是單獨的賦值和對比操做可讓 CPU 在用戶態的負載佔到 99% 以上。--vm-stride 值增大就意味着減小賦值和對比操做,這樣就增長了內存的釋放和分配次數(cpu在內核空間的負載)。
不指定 --vm-stride 選項就使用默認值是 4096,CPU 負載狀況居於前二者之間:

$ stress --vm 2 --vm-bytes 500M

消耗 IO 資源

下面的命令產生 4 個進程,每一個進程都反覆調用 sync 函數將內存上的內容寫到硬盤上:

$ stress -i 4

使用 top 命令查看 CPU 的狀態以下:

sy 升高,wa(iowait) 很是高。

壓測磁盤及 IO

下面的命令建立一個進程不斷的在磁盤上建立 10M 大小的文件並寫入內容:

$ stress -d 1 --hdd-bytes 10M

使用 top 命令查看 CPU 的狀態以下(此時的 CPU 主要消耗在內核態):

下面是 iostat 2 的輸出(一樣是高 iowait,瓶頸是寫磁盤):

其它選項介紹

--verbose
顯示 stress 程序運行過程當中的詳細信息:

--timeout N
在 N 秒後結束程序。

--quiet
stress 程序運行的過程當中不輸出信息。

-n, --dry-run
輸出程序會作什麼而並不實際執行相關的操做:

--backoff N
讓新 fork 出來的進程 sleep N 微秒再開始運行。

除了單獨指定某一類的選項,還能夠同時執行多個類型的任務,好比產生 3 個 CPU 進程、3 個 IO 進程、2 個10M 的 vm 進程,而且每一個 vm 進程中不循環分配釋放內存:

$ stress --cpu 3 --io 3 --vm 2 --vm-bytes 10M --vm-keep

總結

對於學習 Linux 性能檢測相關的命令來講,stress 命令是個得力的助手。經過模擬各類高負載狀況,能夠幫助咱們更好的理解系統瓶頸並掌握性能檢測工具的用法。

參考:
stress man page
stress 1.0.4 code

相關文章
相關標籤/搜索