排查内核空间的内存泄露,主要关注slab。需要分析 /proc/slabinfo 文件。如果没有需要配置。
默认openwrt是没有打开 /proc/slabinfo 的。打开方式如下:
进入openwrt 主目录,执行
make menuconfig
选中
xxxxxxxxxx
Global build settings ---> Kernel build options ---> []Enable /proc slab debug info
保存配置
重新编译并烧写
实际上,在选中 Enable /proc slab debug info后,.config 中是将如下配置打开了
xxxxxxxxxx
CONFIG_KERNEL_SLUB_DEBUG=y
CONFIG_KERNEL_SLUB_DEBUG_ON=y
CONFIG_KERNEL_SLABINFO=y
这里以AP321为例
未开启选项前
xxxxxxxxxx
root@AP-03:C0:/tmp# uptime
17:14:11 up 28 min, load average: 0.04, 0.16, 0.17
root@AP-03:C0:/tmp# cat /proc/meminfo
MemTotal: 890920 kB
MemFree: 531752 kB
MemAvailable: 609772 kB
Buffers: 17816 kB
Cached: 66176 kB
SwapCached: 0 kB
Active: 64772 kB
Inactive: 41800 kB
Active(anon): 24776 kB
Inactive(anon): 2600 kB
Active(file): 39996 kB
Inactive(file): 39200 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 4 kB
Writeback: 0 kB
AnonPages: 22580 kB
Mapped: 16232 kB
Shmem: 4796 kB
Slab: 181020 kB
SReclaimable: 13824 kB
SUnreclaim: 167196 kB
KernelStack: 3936 kB
PageTables: 1120 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 445460 kB
Committed_AS: 47188 kB
VmallocTotal: 258998208 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
开启此选项后
xxxxxxxxxx
root@AP-03:C0:~# uptime
17:32:12 up 39 min, load average: 0.41, 0.23, 0.16
root@AP-03:C0:~# cat /proc/meminfo
MemTotal: 890904 kB
MemFree: 488672 kB
MemAvailable: 569496 kB
Buffers: 17808 kB
Cached: 65768 kB
SwapCached: 0 kB
Active: 63856 kB
Inactive: 42320 kB
Active(anon): 24612 kB
Inactive(anon): 2600 kB
Active(file): 39244 kB
Inactive(file): 39720 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 4 kB
Writeback: 0 kB
AnonPages: 22600 kB
Mapped: 16188 kB
Shmem: 4612 kB
Slab: 224556 kB
SReclaimable: 16860 kB
SUnreclaim: 207696 kB
KernelStack: 3936 kB
PageTables: 1140 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 445452 kB
Committed_AS: 47420 kB
VmallocTotal: 258998208 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
通过分析内存占用较大的slab可以定位大概是哪里的问题。
其中 在 /proc/meminfo 中 SReclaimable 项,表示可以回收的。可以通过以下命令回收
xxxxxxxxxx
echo 2 > /proc/sys/vm/drop_caches
该命令释放dentries and inodes的可回收slab内存。
dentry内存如果是因为应用层导致,则基本是可回收的。主要关注应用层相关程序。
排查内核内存泄露,关注 /proc/slabinfo 中 kmalloc- 开头的项。