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/