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 命令是個得力的助手。經過模擬各類高負載狀況,能夠幫助咱們更好的理解系統瓶頸並掌握性能檢測工具的用法。