我需要從 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)) ; } }