Linuxのメモリ使用量は難しいです。
細かい解説はググるとでてきますが、結局何を使えばいいんだということでシンプルに。

free

freeは -/+ buffers/cache:のfreeの列(free+)を使いましょう。

freeコマンドを打つと

free
             total       used       free     shared    buffers     cached
Mem:      32838584   32182288     656296          0     441572   30458480
-/+ buffers/cache:    1282236   31556348
Swap:      2097400      33480    2063920

とでます。素直に読むとfreeが656296しか残っていなくてメモリを98%使ってしまっています。これはヤバイ!
ただ、実際はbuffers,cachedも再利用可能なメモリを含んでいます。
なので、free+ = free + buffers + cachedになっていて、これが空いているメモリと再利用可能っぽいキャッシュを足した数値です。

ただ、これは正確に使用できるメモリを表している訳ではありません。正確にメモリの使用量でアラートをだせとか言われると結構面倒です。

目次へ戻る

vmstat

もう少し詳しくみてみると。

vmstat -a
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 0  0  33480 653408 21200944 9808528    0    0    33   152    0    0  1  1 99  0  0

memoryにinactとactiveが増えました。

Buffers + Cached = active+ inact

っぽいですね。

目次へ戻る

/proc/meminfo

もっと詳しく見てみます。

cat /proc/meminfo
MemTotal:       32838584 kB
MemFree:          649588 kB
Buffers:          442624 kB
Cached:         30463772 kB
SwapCached:         1736 kB
Active:          9809276 kB
Inactive:       21203868 kB
Active(anon):    3524744 kB
Inactive(anon):  3443080 kB
Active(file):    6284532 kB
Inactive(file): 17760788 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       2097400 kB
SwapFree:        2063920 kB
Dirty:                96 kB
Writeback:             0 kB
AnonPages:        105972 kB
Mapped:           326192 kB
Shmem:           6861064 kB
Slab:             934076 kB
SReclaimable:     833896 kB
SUnreclaim:       100180 kB
KernelStack:        3568 kB
PageTables:         9612 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    18516692 kB
Committed_AS:    7500320 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      343416 kB
VmallocChunk:   34359391476 kB
HardwareCorrupted:     0 kB
AnonHugePages:     61440 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:        7852 kB
DirectMap2M:     3102720 kB
DirectMap1G:    30408704 kB

なんだか
ActiveとInactiveはfileとanonにわかれています。色々読んでみて自分なりにまとめたのが以下です。

Active最近使われたメモリで、どうしても必要な時以外は他の目的に再利用できないと書いてあったりしますが、Inactiveから優先に使われるだけとも書いてあったり。どうしても必要な時とか、最近使われたとか抽象表現多いです・・・。
Inactive最近使われていないし、他の目的に使っていい。
(file)ファイルに書き出せば消しちゃっていいメモリ。つまりディスクと同期がとれていればすぐ使える。
(anon)mallocなんかで確保したメモリ。使いたかったらスワップしないとだめ。

結局

Buffers + Cached = Active(file) + Inactive(file) + Shmem

であり、共有メモリは(大体)Active(anon)+Inactive(anon)に含まれるようです

結論として、利用可能なメモリはを以下採用しています。

free+ Inactive(file) + Active(file)

Active(file)には、Disk未同期(書き込み終わるまで使えない)がありますが、通常の状態で

  • Dirty: The total amount of memory waiting to be written back to the disk.
  • Writeback: The total amount of memory actively being written back to the disk.

を見ても非常に少ないです。気になるようならこの値を引いてもいいとは思います。

これをzabbixへ送ることができる用にmeminfoから計算するスクリプトは以下の通りです。

#!/bin/bash
cat /proc/meminfo | awk '
BEGIN {
    MemFree=0
    Inactive=0
    Shmem=0
}
$1 == "MemFree:" {MemFree=$2}
$1 == "Active(file):" {Active=$2}
$1 == "Inactive(file):" {Inactive=$2}
END {
    print (MemFree+Active+Inactive)*1024
}
'

参考URL
http://d.hatena.ne.jp/enakai00/20110906/1315315488

http://shinh.skr.jp/m/?date=20100516

http://linux.cloudibee.com/2008/02/know-about-procmeminfo/

※作成から2年前(783日経過)の記事です。内容が古い可能性があります。
東京都東日本橋の株式会社プレスマンPRESSMAN*Tech