1. 程式人生 > >Linux stress 命令

Linux stress 命令

() 系統負載 占用內存 結果 顯示 iostat 8.0 ide 隨機

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

基本語法

語法格式:
stress <options>

常用選項:
-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 顯示詳細的信息

安裝 stress

Ubuntu 系統默認沒有安裝 stress,需要通過下面的命令安裝:

$ sudo apt install stress
$ stress --version

技術分享圖片

消耗 CPU 資源

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

$ stress -c 4

技術分享圖片

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

技術分享圖片

消耗內存資源

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

$ 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

Linux stress 命令