1、工具簡介
mpstat
用來查看系統(tǒng)每個 CPU 的性能指標,以及所有 CPU 的平均指標航棱。
vmstat
可以查看系統(tǒng)上下文切換、內(nèi)存萌衬。
前兩個只給出了系統(tǒng)總體的情況饮醇,要想查看每個進程的詳細情況,就需要使用 pidstat
奄薇。
pidstat
用來查看具體進程的 CPU驳阎、內(nèi)存、I/O 以及上下文切換等性能指標馁蒂。
pidstat
默認顯示進程的數(shù)據(jù)呵晚,加 -t
參數(shù)可以輸出線程的數(shù)據(jù)。加 -w
參數(shù)可以輸出上下文切換情況沫屡。
2饵隙、平均負載
$ uptime
12:49:05 up 2 days, 10:26, 2 users, load average: 0.11, 0.08, 0.02
12:49:05
是當(dāng)前時間;
up 2 days, 10:26
是系統(tǒng)運行時間沮脖;
2 users
是正在登錄用戶數(shù)(因為我開了 2 個ssh終端金矛,所以是 2);
load average
三個值分別是過去 1勺届、5驶俊、15
分鐘的平均負載(top
命令的第一行也有輸出)。平均負載是平均活躍進程數(shù)免姿,如果這三個值相差不大饼酿,說明系統(tǒng)負載很平穩(wěn)。
獲取 CPU 數(shù)量可以用命令:
$ grep 'model name' /proc/cpuinfo | wc -l
1
最理想的情況是每個 CPU 上都剛好運行著一個進程胚膊,每個 CPU 都得到了充分利用故俐。
當(dāng)平均負載比 CPU 個數(shù)大的時候,系統(tǒng)已經(jīng)出現(xiàn)了過載紊婉。
當(dāng)平均負載高于 CPU 數(shù)量 70% 的時候药版,就應(yīng)該分析排查負載高的問題了。
下面用 stress 命令模擬一個 CPU 壓力的場景喻犁,先安裝 stress
:
sudo apt install stress
stress --cpu 1 --timeout 600
--cpu 1
是產(chǎn)生 1 個進程不停的計算隨機數(shù)的平方根, --timeout 600
是在 600 秒之后結(jié)束槽片。
在另一個終端查看 uptime
輸出何缓,平均負載很快就接近 1
了。
$ uptime
13:07:39 up 2 days, 10:45, 2 users, load average: 0.01, 0.01, 0.00
$ uptime
13:10:49 up 2 days, 10:48, 2 users, load average: 0.94, 0.40, 0.15
$ uptime
13:12:33 up 2 days, 10:50, 2 users, load average: 0.99, 0.58, 0.25
或者用 watch -d -n 1 uptime
可以自動刷新筐乳,也可以觀測到平均負載在變高歌殃。
-d
表示變化的部分可以高亮顯示乔妈,
-n
是刷新間隔蝙云,這里選每 1 秒刷新,
用 mpstat
也可以觀察到路召,%usr
在升高:
$ mpstat
Linux 4.15.0-117-generic (uu) 09/14/2020 _x86_64_ (1 CPU)
01:09:57 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
01:09:57 PM all 0.27 0.01 0.34 0.09 0.00 0.01 0.00 0.00 0.00 99.28
$ mpstat
Linux 4.15.0-117-generic (uu) 09/14/2020 _x86_64_ (1 CPU)
01:13:44 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
01:13:44 PM all 0.38 0.01 0.34 0.09 0.00 0.01 0.00 0.00 0.00 99.17
$ mpstat
Linux 4.15.0-117-generic (uu) 09/14/2020 _x86_64_ (1 CPU)
01:14:54 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
01:14:54 PM all 0.42 0.01 0.34 0.09 0.00 0.01 0.00 0.00 0.00 99.14
用 pidstat
可以查看具體哪個進程的 %usr
在變高勃刨。
3、上下文切換
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 268 550080 108920 1077896 0 0 1677 26 86 127 1 1 99 0 0
指標含義:
cs
(context switch)是每秒 上下文切換的次數(shù)股淡。
r
(Running or Runnable)是就緒隊列的長度身隐,也就是正在運行和等待 CPU 的進程數(shù)。
in
(interrupt)則是每秒 中斷的次數(shù)唯灵,可以從 /proc/interrupts
文件中讀取贾铝。
pidstat -w -t
指標含義:
cswch
表示每秒自愿上下文切換(voluntary context switches)的次數(shù),比如 I/O埠帕、內(nèi)存 等資源不足時垢揩,就會發(fā)生自愿上下文切換。
nvcswch
表示每秒非自愿上下文切換(non voluntary context switches)的次數(shù)敛瓷。比如大量進程在爭搶 CPU叁巨。
sudo apt install -y sysbench
下面用 sysbench
做實驗,模擬系統(tǒng)多線程調(diào)度呐籽,--threads=2
是 2 個線程锋勺,--max-time=60
是運行60秒的基準測試:
sysbench --threads=2 --max-time=60 threads run
可以看到 vmstat
的 cs
升高了:
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
12 0 268 470996 110748 1154896 0 0 1669 26 86 128 1 1 99 0 0
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
6 0 268 469180 110756 1155052 0 0 1669 26 86 196 1 1 99 0 0
再用 pidstat -w -t
可以看到具體是 __sysbench 線程的上下文切換比較多。