天天看點

Linux stress指令詳解(下)4 消耗 CPU 資源消耗記憶體資源總結

4 消耗 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 指令是個得力的助手。通過模拟各種高負載情況,可以幫助我們更好的了解系統瓶頸并掌握性能檢測工具的用法。

參考

繼續閱讀