ระบบ Linux

How to fix memory leak from big nfs_inode_cache

ได้รับแจ้งว่า Linux server เครื่องหนึ่งมีการใช้งาน memory เกินกว่า 90% ซึ่งทางผู้ดูแลตรวจสอบแล้วไม่พบว่ามี process ใดใช้งาน memory มาก ซึ่งผมได้เข้าไปตรวจสอบเบื้ยงต้นด้วยคำสั่ง free ก็ไม่พบอะไรผิดปรกติ

[root@ezylinux ~]# free -m
total       used       free     shared    buffers     cached
Mem:          7982       7885         97          0        137        366
-/+ buffers/cache:       7380        601
Swap:         4285          0       4285

จากนั้นจึงได้ตรวจสอบ process ต่างๆอีกครั้ง ว่ามี process ไหนบ้างที่ใช้งาน memory สูง ซึ่งก็ไม่พบ ดังนั้นจึงได้ทำการตรวจสอบ /proc/meminfo ด้วยคำสั่งด้านล่าง

[root@ezylinux ~]# cat /proc/meminfo
MemTotal:      8174308 kB
MemFree:         96112 kB
Buffers:        143332 kB
Cached:         378332 kB
SwapCached:          0 kB
Active:         233340 kB
Inactive:       335120 kB
...
Slab:          7480856 kB
...
VmallocTotal: 34359738367 kB
VmallocUsed:    265956 kB
VmallocChunk: 34359470659 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

พบว่า Slab มีการใช้งานที่มากถึง 7306 MB หรือประมาณ 90% (แรมของระบบ 8GB) แล้ว Slab คืออะไร? Slab คือ Cache ของ memory pool allocator บน kernel object จากข้อมูลข้างบนให้รันคำสั่ง slaptop เพื่อหา object ที่มีการใช้งาน memory มากที่สุด

   OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME
8603424 8603424 100%    1.01K 2867808        3  7476347K nfs_inode_cache
3080826 3080737  99%    0.21K 171157       18    684628K dentry_cache
24717  12515  50%    0.52K   3531        7     14124K radix_tree_node
11365  11108  97%    0.74K   2273        5      9092K ext3_inode_cache

จากตัวอย่างพบว่า nfs_inode_cache มีการใช้งาน memory มากถึง 7GB แนวทางการแก้ไขปัญหา

  1. รันคำสั่ง sync เพื่อทำการ flush file system buffers
  2. รันคำสั่ง ด้านล่างเพื่อ clear dentries และ inodes echo 2 > /proc/sys/vm/drop_caches

หรือ รันคำสั่งด้านล่าง

 sync && echo 2 > /proc/sys/vm/drop_caches
EOF.← กลับไปอ่านบทความอื่น