1. 程式人生 > 其它 >使用 stress 和 sysstat 分析平均負載過高的場景

使用 stress 和 sysstat 分析平均負載過高的場景

原文連結:小polo測試筆記

stress 介紹

Linux 系統壓力測試工具,這裡通過異常程序模擬平均負載升高的場景

stress 命令列引數的講解

欄位 含義
-?、--help 幫助文件
--version、-v 版本號
-q 退出
-n 顯示已完成指令的情況
-t N、--timeout N 執行 N 秒後停止
--backoff N 等待 N 微秒後開始執行
-c N、--cpu N 產生 N 個程序
每個程序反覆的計算隨機數的平方根
模擬 CPU 計算密集型場景
-i N、--io N 產生 N 個程序
每個程序反覆呼叫 sync()
模擬 I/O 密集型場景
-m N、--vm N 產生 N 個程序
每個程序不斷呼叫記憶體分配 malloc() 和記憶體釋放 free() 函式
--vm-bytes B 指定 malloc() 時記憶體的位元組數,預設256MB
--vm-hang N 指定執行 free() 前等待的秒數
-d N、 --hdd N 產生 N 個程序
每個程序執行 write() 和 unlink() 的程序
--hdd-bytes B 每個 hdd worker 寫入 B 位元組(預設為1GB)

Numbers may be suffixed with s,m,h,d,y (time) or B,K,M,G (size)
時間單位可以為秒 s,分m,小時h,天d,年y,檔案大小單位可以為 K,M,G

預設為s 示例 -t 2m 指定時間為2min

sysstat 介紹

  • 包含了常用的 Linux 效能工具,用來監控和分析系統的效能
  • 接下來會用到 mpstat 和 pidstat 兩個命令
  • 後面用單獨一篇詳細講解裡面包含的所有命令

mpstat

  • 常用的多核 CPU 效能分析工具
  • 實時檢視每個 CPU 的效能指標以及所有 CPU 的平均指標

pidstat

  • 常用的程序效能分析工具
  • 實時檢視程序的 CPU、記憶體、I/O 以及上下文切換等效能指標

安裝

stress 安裝

yum install -y epel-release
yum install stress -y

sysstat 安裝

提取碼: 連結:https://pan.baidu.com/s/1iph2bNjHwTUwjY6X6-pZ-Q
提取碼:a43h
解壓: tar -zxvf sysstat-12.1.5.tar.gz
進入到資料夾內,執行下面兩個命令
./configure
make&&make install

示例

1. CPU 密集型程序

開啟三個終端

第一個終端
在第一個終端執行 stress 命令,模擬一個 CPU 使用率 100% 的場景
stress -c 1 -t 600
第二個終端
執行 uptime 檢視系統平均負載情況,-d 引數表示高亮顯示變化的區域
watch -d uptime

可以看到,1 分鐘的平均負載會慢慢增加到 1.00

第三個終端
執行 mpstat 檢視 CPU 使用率的變化情況
mpstat -P ALL 5

可以看出

  • 僅有一個 CPU 的使用率接近 100%,但它的 iowait 只有 0
  • 這說明,平均負載的升高正是由於 CPU 使用率為 100%

使用 pidstat 命令
間隔 5 秒後輸出一組資料
pidstat -u 5 1

從這裡可以明顯看到,stress 程序的 CPU 使用接近 100%

I/O 密集型程序

第一個終端

執行 stress 命令,但這次模擬 I/O 壓力,即不停地執行 sync()

第二個終端
執行 uptime 檢視系統平均負載情況,-d 引數表示高亮顯示變化的區域

第三個終端
執行 mpstat 檢視 CPU 使用率的變化情況

mpstat -P ALL 5 1

其實 iowait 並沒有上去,反而還是系統態(%sys)升高了,這是怎麼回事?難道是工具的問題?

  • iowait 無法升高是因為案例中 stress -i 使用的是 sync() 系統呼叫,它的作用是重新整理緩衝區記憶體到磁碟中
  • 對於新安裝的虛擬機器,緩衝區可能比較小,無法產生大的io壓力
  • 這樣大部分都是系統呼叫的消耗了
  • 所以,只看到系統 CPU 使用率升高

解決辦法
使用 stress 的另一個引數 -d

stress --hdd 1 -t 600 --hdd-bytes 4G

模擬超負載執行

這次模擬 8 個程序(決定你機器的核數,這裡是針對4核機器來說超了一倍的負載)
stress -c 8 -t 600

可以直接通過 pidstat 來檢視程序的情況了,每隔 5s 收集一次,收集 5 次,看平均值
pidstat -u 5 5

可以看到

  • 8 個程序在競爭 4 個 CPU
  • 每隔程序等待 CPU 的時間(%wait)高達 50%
  • 這些超出 CPU 計算能力的程序,導致 CPU 過載

對於平均負載的一個理解和總結

  • 平均負載提供了一個快速檢視系統整體效能的手段,反映了整的負載情況
  • 但只看平均負載本身,我們並不能直接發現到底是哪裡出現了瓶頸
  • 平均負載過高的分析排查思路
  • 有可能是 CPU 即密集型程序導致的
  • 平均負載過高不代表 CPU 使用率高,也有可能是 I/O 更密集了
  • 當發現平均負載過高時,可以通過 mpstat、pidstat 等工具,輔助分析負載的來源