メモリのfreeが10%を切ったとアラートが飛んできた時の対応のメモです。
top を見てもあやしいプロセスが見つからなくて、
/proc/meminfo を見てみると slab領域の肥大が確認できました。
slabtop で dentry_cache が肥大化している事がわかったので、
echo 2 > /proc/sys/vm/drop_caches を実行しました。
というはなし。
freeコマンドで現在のメモリの使用量を確認する
[root@bacchi ~]# free
total used free shared buffers cached
Mem: 1030516 971468 59048 1088 278348 166456
-/+ buffers/cache: 526664 503852
Swap: 2064380 654596 1409784
確かにこのサーバーはメモリの空きが10%切っていますね。
topでメモリドカ食いしてるプロセスが無いか確認
[root@bacchi ~]# top
top - 12:01:15 up 42 days, 43 min, 1 user, load average: 0.14, 0.08, 0.06
Tasks: 155 total, 1 running, 146 sleeping, 0 stopped, 8 zombie
Cpu(s): 0.1%us, 0.4%sy, 0.0%ni, 98.7%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1030516k total, 963612k used, 66904k free, 278196k buffers
Swap: 2064380k total, 654596k used, 1409784k free, 166460k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2727 root 20 0 2704 1160 884 R 0.6 0.1 0:00.03 top
11 root 20 0 0 0 0 S 0.3 0.0 2:44.13 events/0
2458 bacchi 20 0 11720 1600 832 S 0.3 0.2 0:00.02 sshd
1 root 20 0 2900 400 264 S 0.0 0.0 0:01.20 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 2:25.56 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 0:15.50 ksoftirqd/0
(省略)
ぱっとみた感じあやしいところはなさそう。
/proc/meminfoでメモリの使用状況を確認
[root@bacchi ~]# cat /proc/meminfo
MemTotal: 1030516 kB
MemFree: 60872 kB
Buffers: 278152 kB
Cached: 166232 kB
SwapCached: 10112 kB
Active: 306276 kB
Inactive: 476980 kB
Active(anon): 67404 kB
Inactive(anon): 272572 kB
Active(file): 238872 kB
Inactive(file): 204408 kB
Unevictable: 0 kB
Mlocked: 0 kB
HighTotal: 141308 kB
HighFree: 18184 kB
LowTotal: 889208 kB
LowFree: 42688 kB
SwapTotal: 2064380 kB
SwapFree: 1409784 kB
Dirty: 416 kB
Writeback: 8 kB
AnonPages: 335212 kB
Mapped: 14784 kB
Shmem: 1088 kB
Slab: 165696 kB
SReclaimable: 157604 kB
SUnreclaim: 8092 kB
KernelStack: 1392 kB
PageTables: 5864 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 2579636 kB
Committed_AS: 1534192 kB
VmallocTotal: 122880 kB
VmallocUsed: 4052 kB
VmallocChunk: 113980 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 8184 kB
DirectMap2M: 899072 kB
似たような構成のサーバーと比べると、Slab の消費量が多いことがわかりました。
slabtopコマンドで slab領域の確認
[root@bacchi ~]# slabtop
Active / Total Objects (% used) : 973570 / 996503 (97.7%)
Active / Total Slabs (% used) : 41542 / 41542 (100.0%)
Active / Total Caches (% used) : 98 / 183 (53.6%)
Active / Total Size (% used) : 154204.33K / 155891.14K (98.9%)
Minimum / Average / Maximum Object : 0.01K / 0.16K / 4096.00K
OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
736455 736455 100% 0.13K 25395 29 101580K dentry
96212 84714 88% 0.05K 1436 67 5744K buffer_head
71040 70985 99% 0.62K 11840 6 47360K ext4_inode_cache
23956 23836 99% 0.03K 212 113 848K size-32
9425 7244 76% 0.02K 65 145 260K anon_vma_chain
7644 7598 99% 0.04K 91 84 364K selinux_inode_security
7300 7278 99% 0.07K 146 50 584K sysfs_dir_cache
7059 5891 83% 0.10K 181 39 724K vm_area_struct
6344 5625 88% 0.29K 488 13 1952K radix_tree_node
5408 3541 65% 0.02K 32 169 128K anon_vma
4477 4402 98% 0.34K 407 11 1628K inode_cache
2832 2745 96% 0.06K 48 59 192K size-64
(省略)
確認すると dentry_cache の項目が群を抜いてメモリを消費していました。
また、同スペックの他のサーバーと比較してもこの項目の差異が大きいため、dentry_cache について調べみました。
dentry とは何か?
dentry はファイル名やディレクトリの階層構造、またディレクトリ名とinode情報を関連付けるもの(構造体?)らしい。
dentry_cacheは、それらの情報のキャッシュだと思って良さそう。
dentry_cacheは存在しないディレクトリ情報(i-nodeを持たないdentry)などもキャッシュするそうです。
これを negative dentry というらしいです。
negative dentryは、sar -v コマンドで確認する事ができます。
[root@bacchi ~]# sar -v
Linux 2.6.32-504.12.2.el6.i686 (bacchi.me) 2015年05月17日 _i686_ (2 CPU)
00時00分01秒 dentunusd file-nr inode-nr pty-nr
00時10分01秒 310748 1056 7999 3
00時20分01秒 310752 1056 7999 3
00時30分01秒 310760 1120 8022 3
00時40分01秒 316064 1088 8000 3
00時50分01秒 316067 1056 8000 3
01時00分01秒 324078 1120 8023 3
01時10分01秒 337870 1056 8002 3
(省略)
dentunusdがnegative dentryの数を示します。
このマシンでは negative dentry が有効に利用されるケースはないと判断できるので、このcacheを解放することにしました。
cache の削除
以下のコマンドを実行し、cache を飛ばします。
echo 2 > /proc/sys/vm/drop_caches
これで、dentry、 inode のキャッシュを削除することができました。
cache を削除した結果
slabtop を実行して、dentry のメモリ消費量を見てみます。
[root@bacchi ~]# slabtop
Active / Total Objects (% used) : 158397 / 217738 (72.7%)
Active / Total Slabs (% used) : 5275 / 5275 (100.0%)
Active / Total Caches (% used) : 99 / 183 (54.1%)
Active / Total Size (% used) : 14606.22K / 20159.07K (72.5%)
Minimum / Average / Maximum Object : 0.01K / 0.09K / 4096.00K
OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
106932 73739 68% 0.05K 1596 67 6384K buffer_head
23956 23798 99% 0.03K 212 113 848K size-32
13688 5989 43% 0.13K 472 29 1888K dentry
10585 7295 68% 0.02K 73 145 292K anon_vma_chain
7644 7598 99% 0.04K 91 84 364K selinux_inode_security
7332 5941 81% 0.10K 188 39 752K vm_area_struct
7300 7278 99% 0.07K 146 50 584K sysfs_dir_cache
7228 3804 52% 0.29K 556 13 2224K radix_tree_node
5746 3580 62% 0.02K 34 169 136K anon_vma
4477 4354 97% 0.34K 407 11 1628K inode_cache
3009 1912 63% 0.06K 51 59 204K size-64
2100 1276 60% 0.12K 70 30 280K filp
1902 692 36% 0.62K 317 6 1268K ext4_inode_cache
(省略)
うん、がっつり減っています。
次に free も実行してみます。
[root@bacchi ~]# free
total used free shared buffers cached
Mem: 1030516 699456 331060 1092 284604 38668
-/+ buffers/cache: 376184 654332
Swap: 2064380 691956 1372424
かなり空きができました!!
まとめ
多くのメモリが消費されている割に不審なプロセスが見つからない場合、
dentry_cache を疑うと幸せになれるかもしれませんね。