如何使用 vmstat 取得記憶體使用百分比?

如何使用 vmstat 取得記憶體使用百分比?

我需要從 vmstat 取得記憶體使用百分比,但我不太理解 vmstat 中顯示的與記憶體相關的一些數字。

特別是,給定這樣的輸出

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0 139728  45396 199128 1236360    1    2     4   622    3    1 51  4 43  2  0

系統的總記憶體量是多少?是“swpd”+“free”+“buff”+“cache”,總共 1620612 嗎?

系統的可用內存量是多少?是「免費」欄位中顯示的 45396 嗎?

問題是它們與“頂部”報告的內容不相符,甚至看起來不接近。我與上面的“vmstat”大約同時獲得的“top”的輸出是:

[...]
Mem:   4059616k total,  3965504k used,    94112k free,   200020k buffers
[...]

所以...我假設「vmstat」中一定有我不知道的隱藏數字/選項?

我需要使用“vmstat”來實現此目的,而不是其他命令,因為這是要求所規定的。

因此,理想情況下,我想從“vmstat”實現的是記憶體使用百分比,如下所示:

<used_memory>/<total_memory> * 100%.

謝謝!

答案1

您正在尋找的是“free”的輸出:

$ free
             total       used       free     shared    buffers     cached
Mem:        775556     759456      16100          0      22132     592484
-/+ buffers/cache:     144840     630716
Swap:       500344      21972     478372

這是一個遊覽:

這是一個帶有 768MB 實體 RAM 和 500344KB 交換分區的盒子。

759456KB 已「使用」(第二列,頂行)。在這些「已使用」記憶體中,23132KB 是緩衝區(第5 列,頂行),592484KB(第6 列,頂行)是緩存,剩下144840KB(第2 列,第2 行)物理記憶體正由活動進程使用。

當您考慮緩衝區和快取使用的記憶體可用於進程時,就會留下 630716KB(第 3 列,第 2 行)的可用實體記憶體。

正如我所說,交換分區是 500344KB(第一列,底行)。交換文件的 21972KB(第 2 列,底行)正在使用,剩下 478372KB(第 3 列,底行)可用。

因此,您對可用記憶體百分比的定義取決於您是否計算緩衝區和緩存,以及是否計算交換。

這應該足以讓您繼續計算您認為合適的百分比。


這是 top 和 free 的輸出:

$ top -n1 | grep "used," ; free
Mem:    775556k total,   751472k used,    24084k free,    20776k buffers
Swap:   500344k total,    21972k used,   478372k free,   586648k cached

             total       used       free     shared    buffers     cached
Mem:        775556     751344      24212          0      20776     586648
-/+ buffers/cache:     143920     631636
Swap:       500344      21972     478372

您可以看到 top 和 free 的一致性(儘管有一點區別——這是一台多用戶計算機,top 和 free 程式的記憶體使用情況都反映在其中)。


當你調用 vmstate 時添加一個“-s”,你會看到幾乎相同的輸出,只是形式不同:

$ vmstat -s ; free
       775556  total memory
       759920  used memory
       674680  active memory
        18440  inactive memory
        15636  free memory
        21892  buffer memory
       594372  swap cache
       500344  total swap
        21972  used swap
       478372  free swap
       ... output truncated ...

             total       used       free     shared    buffers     cached
Mem:        775556     759920      15636          0      21892     594372
-/+ buffers/cache:     143656     631900
Swap:       500344      21972     478372

您可以看到 vmstat 顯示所有相同的數字都是空閒的。

答案2

我和你有同樣的問題並提出了一個公式

vmstat -s | awk  ' $0 ~ /total memory/ {total=$1 } $0 ~/free memory/ {free=$1} $0 ~/buffer memory/ {buffer=$1} $0 ~/cache/ {cache=$1} END{print (total-free-buffer-cache)/total*100}'

我已經在 procps-ng 3.3.10 的 vmstat 版本和 procps-ng 3.3.9 的 vmstat 上測試了它

答案3

我建議您閱讀這本 IBM 紅皮書「Linux 效能和調優指南」(http://www.redbooks.ibm.com/abstracts/redp4285.html?打開)。它包含許多命令返回的數據的詳細信息,應該對您有所幫助。

我通常在 Linux 中使用“free”命令或“cat /proc/meminfo”。

答案4

這是一個POSIXshell 函數將所需的百分比向下舍入到最接近的整數(出於腳本編寫的目的,這可能更有用,因為POSIXshell 算術比較測試僅適用於整數):

# Vmstat (derived) Used Ram Percent
vurp() { vmstat -s | { read a b ; read c d ; echo $((100*$c/$a)) ; } ; }
vurp

輸出(在我的系統上):

12

同樣的事情,與free

furp() { free | { read z; read a b c d; echo $((100*$c/$b)) ; } }

相關內容