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 ですか?

問題は、これらが 'top' が報告したものと一致しなかったり、それに似ていなかったりすることです。上記の '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 が「使用済み」です (2 列目、一番上の行)。この「使用済み」メモリのうち、23132KB はバッファ (5 列目、一番上の行)、592484KB (6 列目、一番上の行) はキャッシュで、残りの 144840KB (2 列目、2 行目) の物理メモリがアクティブなプロセスによって使用されています。

バッファとキャッシュによって使用されるメモリをプロセスに使用できることを考慮すると、630716KB (3 列目、2 行目) の物理メモリが空きになります。

前述したように、スワップ パーティションは 500344KB (1 列目、下段) です。スワップ ファイルの 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 が free と同じ数値を表示していることがわかります。

答え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 Redbook「Linuxパフォーマンスとチューニングのガイドライン」(http://www.redbooks.ibm.com/abstracts/redp4285.html?開く)。多数のコマンドによって返されるデータの詳細が記載されており、役立つはずです。

私は通常、Linux の「free」コマンドまたは「cat /proc/meminfo」を使用します。

答え4

こちらはPOSIX希望するパーセントを最も近い整数に切り捨てるシェル関数(スクリプトの目的には、これがより便利かもしれません。POSIXシェルの算術比較テストは整数でのみ機能します):

# 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)) ; } }

関連情報