広告 Linux

不審なプロセスがないのにメモリ使用量が高い場合はslab領域の肥大化を疑うといいかも

メモリの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 を疑うと幸せになれるかもしれませんね。

Sponsor Link

-Linux