メモリ使用量とスラブ

PCを立ち上げて1日使っていくと使用メモリ(もちろんキャッシュとバッファを引いたもの)がやたら増えていたのが気になったので、再起動時と比較をしてみた。

稼働中いつのまにか779MBになっていた。以後-/+ buffers/cache:の隣の数字に着目。

$ free
             total       used       free     shared    buffers     cached
Mem:       2067968    1814008     253960          0     287908     746364
-/+ buffers/cache:     779736    1288232
Swap:            0          0          0
$ cat /proc/meminfo
MemTotal:      2067968 kB
MemFree:        253960 kB
Buffers:        287908 kB
Cached:         746364 kB
SwapCached:          0 kB
Active:         642656 kB
Inactive:       811592 kB
HighTotal:     1170688 kB
HighFree:        81296 kB
LowTotal:       897280 kB
LowFree:        172664 kB
SwapTotal:           0 kB
SwapFree:            0 kB
Dirty:             268 kB
Writeback:           0 kB
AnonPages:      419976 kB
Mapped:          44080 kB
Slab:           349704 kB
SReclaimable:   332008 kB
SUnreclaim:      17696 kB
PageTables:       2432 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:   1033984 kB
Committed_AS:   682328 kB
VmallocTotal:   114680 kB
VmallocUsed:      3696 kB
VmallocChunk:   110712 kB

起動直後はわずか336MB。

$ free
             total       used       free     shared    buffers     cached
Mem:       2067968     571936    1496032          0      19384     216488
-/+ buffers/cache:     336064    1731904
Swap:            0          0          0
$ cat /proc/meminfo
MemTotal:      2067968 kB
MemFree:       1496032 kB
Buffers:         19384 kB
Cached:         216488 kB
SwapCached:          0 kB
Active:         357544 kB
Inactive:       186340 kB
HighTotal:     1170688 kB
HighFree:       642960 kB
LowTotal:       897280 kB
LowFree:        853072 kB
SwapTotal:           0 kB
SwapFree:            0 kB
Dirty:            2416 kB
Writeback:           0 kB
AnonPages:      308016 kB
Mapped:          42580 kB
Slab:            18376 kB
SReclaimable:     9136 kB
SUnreclaim:       9240 kB
PageTables:       2264 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:   1033984 kB
Committed_AS:   557300 kB
VmallocTotal:   114680 kB
VmallocUsed:      3548 kB
VmallocChunk:   110724 kB


起動してファイルをキャッシュに入れた後。find | xargs cat > /dev/nullを使用。

$ free
             total       used       free     shared    buffers     cached
Mem:       2067968    1503100     564868          0      75548    1037684
-/+ buffers/cache:     389868    1678100
Swap:            0          0          0
$ cat /proc/meminfo
MemTotal:      2067968 kB
MemFree:        564868 kB
Buffers:         75548 kB
Cached:        1037684 kB
SwapCached:          0 kB
Active:        1237728 kB
Inactive:       189896 kB
HighTotal:     1170688 kB
HighFree:         1584 kB
LowTotal:       897280 kB
LowFree:        563284 kB
SwapTotal:           0 kB
SwapFree:            0 kB
Dirty:             140 kB
Writeback:           0 kB
AnonPages:      314444 kB
Mapped:          42644 kB
Slab:            65748 kB
SReclaimable:    51412 kB
SUnreclaim:      14336 kB
PageTables:       2184 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:   1033984 kB
Committed_AS:   564760 kB
VmallocTotal:   114680 kB
VmallocUsed:      3548 kB
VmallocChunk:   110724 kB

眺めていると、Slabの使用量が増えているのがわかる。まとめてみると、

used Slab AnonPages used-Slab AnonPages+Slab
起動直後 336064 18376 308016 317688 326392
キャッシュ後 389868 65748 314444 324120 380192
稼働中 779736 349704 419976 430032 769680

usedはAnonPages+Slab+αくらいのようだ。Slabは昨日調べてみたら、カーネルが使うキャッシュのようなものらしい。実際/proc/slabinfoを覗いてみたら、ext3_inode_cacheとdentry_cacheが多く占めていた。

ということで結論:使用メモリの見た目が増えていたのはSlabの仕業だった。Slabはキャッシュなので高速化に貢献しているのだろう。ただ太っているわけじゃないと知って安心した。