vmstat 是一個查看虛擬記憶體(Virtual Memory)使用狀況的工具,但是怎樣通過 vmstat 來發現系統中的瓶頸呢? 1。 使用vmstat 使用前我們先看下命令介紹及參數定義 Usage: vmstat [options] [delay [count]] Options: -a, - ...
vmstat 是一個查看虛擬記憶體(Virtual Memory)使用狀況的工具,但是怎樣通過 vmstat 來發現系統中的瓶頸呢?
1。 使用vmstat
使用前我們先看下命令介紹及參數定義
Usage:
vmstat [options] [delay [count]]
Options:
-a, --active active/inactive memory
-f, --forks number of forks since boot
-m, --slabs slabinfo
-n, --one-header do not redisplay header
-s, --stats event counter statistics
-d, --disk disk statistics
-D, --disk-sum summarize disk statistics
-p, --partition <dev> partition specific statistics
-S, --unit <char> define display unit
-w, --wide wide output
-t, --timestamp show timestamp
-h, --help display this help and exit
-V, --version output version information and exit
For more details see vmstat(8).
中文翻譯
- -a:顯示活躍和非活躍記憶體
-f:顯示從系統啟動至今的 fork 數量 。
-m:顯示 slabinfo
-n:只在開始時顯示一次各欄位名稱。
-s:顯示記憶體相關統計信息及多種系統活動數量。
delay:刷新時間間隔。如果不指定,只顯示一條結果。
count:刷新次數。如果不指定刷新次數,但指定了刷新時間間隔,這時刷新次數為無窮。
-d:顯示磁碟相關統計信息。
-p:顯示指定磁碟分區統計信息
-S:使用指定單位顯示。參數有 k 、K 、m 、M ,分別代表 1000、1024、1000000、1048576 位元組(byte)。
預設單位為 K(1024 bytes)
-V:顯示 vmstat 版本信息。
2。實戰
例子:每 2 秒輸出一條結果
[root@k8s-master01 ~]# vmstat 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
4 0 0 485092 0 1249236 0 0 3 19 47 31 1 1 98 0 0
0 0 0 485364 0 1249364 0 0 0 34 2885 4952 1 3 97 0 0
0 0 0 485472 0 1249368 0 0 0 34 2107 3561 1 1 98 0 0
0 0 0 485316 0 1249368 0 0 0 60 1914 3326 1 1 98 0 0
結果如圖,對上面輸出結果含義解釋:
Procs(進程):
r: 運行的和等待(CPU 時間片)運行的進程數,這個值也可以判斷是否需要增加 CPU(長期大於 1)
b: 等待 IO 的進程數量,處於不可中斷狀態的進程數,常見的情況是由 IO 引起的
Memory(記憶體):
swpd: 使用虛擬記憶體大小,切換到交換記憶體上的記憶體(預設以 KB 為單位)
如果 swpd 的值不為 0,或者還比較大,比如超過 100M 了,但是 si, so 的值長期為 0,這種情況我們可以不用擔心,不會影響系統性能。
free: 空閑的物理記憶體
buff: 用作緩衝的記憶體大小
cache: 用作緩存的記憶體大小,文件系統的 cache,如果 cache 的值大的時候,說明 cache 住的文件數多,如果頻繁訪問到的文件都能被 cache 住,那麼磁碟的讀 IO bi 會非常小
Swap:
si: 每秒從交換區寫到記憶體的大小,交換記憶體使用,由磁碟調入記憶體
so: 每秒寫入交換區的記憶體大小,交換記憶體使用,由記憶體調入磁碟
記憶體夠用的時候,這 2 個值都是 0,如果這 2 個值長期大於 0 時,系統性能會受到影響。磁碟 IO 和CPU 資源都會被消耗
IO:
bi: 每秒讀取的塊數,從塊設備讀入的數據總量(讀磁碟) (KB/s)
bo: 每秒寫入的塊數,寫入到塊設備的數據總理(寫磁碟) (KB/s)
隨機磁碟讀寫的時候,這 2 個 值越大(如超出 1M),能看到 CPU 在 IO 等待的值也會越大
system:
in: 每秒中斷數,包括時鐘中斷。
cs: 每秒上下文切換數。
上面這 2 個值越大,會看到由內核消耗的 CPU 時間會越多
CPU(以百分比表示):
us: 用戶進程消耗的 CPU 時間百分比,us 的值比較高時,說明用戶進程消耗的 CPU 時間多,但是如果長期超過 50% 的使用,那麼我們就該考慮優化程式演算法或者進行加速了
sy: 內核進程消耗的 CPU 時間百分比,sy 的值高時,說明系統內核消耗的 CPU 資源多,這並不是良性的表現,我們應該檢查原因。
id: CPU 處在空閑狀態時間百分比(包括 IO 等待時間)
wa: IO 等待消耗的 CPU 時間百分比,wa 的值高時,說明 IO 等待比較嚴重
3。 問題處理中,如何運用?
現象:
1。)如果在processes中運行的序列(process r)是連續的大於在系統中的CPU的個數表示系統現在運行比較慢,有多數的進程等待 CPU。
2。)如果 r 的輸出數大於系統中可用 CPU 個數的 4 倍的話,則系統面臨著 CPU 短缺的問題,或者是 CPU 的速率過低,系統中有多數的進程在等待 CPU,造成系統中進程運行過慢。
3。)如果空閑時間(cpu id
)持續為 0 並且系統時間(cpu sy
)是用戶時間的兩倍(cpu us
)系統則面臨著 CPU 資源的短缺。
辦法建議:
1。調節 applications & servers 使得對記憶體和 cache 的使用更加有效。例如:先調整應用程式對 CPU 的占用情況。使得應用程式能夠更有效的使用 CPU、聯繫DBA查看是否有SQL語句堵塞。
2。增加系統的記憶體或者CPU。
實戰例子:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
7 0 0 475416 0 1251908 0 0 0 441 1961 3307 0 1 98 0 0
1 0 0 475372 0 1251908 0 0 0 32 1785 3083 1 1 98 0 0
0 0 0 475744 0 1251916 0 0 0 34 1891 3259 0 1 98 0 0
2 0 0 475744 0 1251916 0 0 0 18 1935 3381 1 1 98 0 0
0 0 0 475512 0 1251920 0 0 0 29 2062 3533 2 1 97 0 0
0 0 0 475884 0 1251920 0 0 0 22 1988 3410 0 1 99 0 0
0 0 0 475760 0 1251924 0 0 0 22 1757 3040 1 1 98 0 0
0 0 0 475340 0 1251924 0 0 0 28 2001 3415 0 2 98 0 0
0 0 0 475636 0 1251924 0 0 0 16 1941 3341 1 1 98 0 0
0 0 0 475264 0 1251928 0 0 0 29 1986 3408 1 1 98 0 0
0 0 0 475264 0 1251928 0 0 0 34 2112 3490 1 1 98 0 0
0 0 0 469308 0 1252084 0 0 0 487 2973 5094 2 3 96 0 0
0 0 0 471872 0 1252004 0 0 0 212 3007 5139 1 3 96 0 0
0 0 0 472368 0 1251972 0 0 0 156 2331 3936 1 2 97 0 0
0 0 0 472632 0 1251976 0 0 0 35 2119 3705 1 2 97 0 0
0 0 0 472236 0 1251976 0 0 0 425 2018 3372 0 1 99 0 0
0 0 0 472384 0 1251980 0 0 0 17 1807 3101 1 1 98 0 0
根據觀察值,我們可以得到以下結論:
1。有大量的中斷(in) 和較多的上下文切換(cs)。這意味著存在多個的進程在產生對硬體設備的請求。
2。進一步顯示某單個應用,user time(us)利用率低,說明應用用戶進程使用較少。
3。cpu id 經常保持再98%附近,說明當前系統基本上無負載壓力。