ได้รับแจ้งว่า 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