slab 内存泄漏
程序员文章站
2022-04-18 22:55:41
...
kernel log 出现 lowmemorykiller 判断 kernel 出现了内存泄漏
- 多次测试后对比 procrank 数据 寻找内存泄漏可能的原因
adb shell procrank > C:\procrank.txt
测试前:RAM: 1814588K total, 359780K free, 7372K buffers, 701496K cached, 964K shmem, 138804K slab
测试后:RAM: 1814588K total, 229016K free, 10204K buffers, 710408K cached, 1056K shmem, 146024K slab
发现 slab 明显的增大。 - 查看slabinfo 确定泄漏地方
adb shell pcat /proc/slabinfo > C:\slabinfo.txt
测试前:
kmalloc-8192 180 180 8192 4 8 : tunables 0 0 0 : slabdata 45 45 0
kmalloc-4096 203 232 4096 8 8 : tunables 0 0 0 : slabdata 29 29 0
kmalloc-2048 576 576 2048 16 8 : tunables 0 0 0 : slabdata 36 36 0
kmalloc-1024 1072 1072 1024 16 4 : tunables 0 0 0 : slabdata 67 67 0
kmalloc-512 1534 1568 512 16 2 : tunables 0 0 0 : slabdata 98 98 0
kmalloc-256 12937 13104 256 16 1 : tunables 0 0 0 : slabdata 819 819 0
kmalloc-128 50144 50144 128 32 1 : tunables 0 0 0 : slabdata 1567 1567 0
测试后:
kmalloc-8192 181 184 8192 4 8 : tunables 0 0 0 : slabdata 46 46 0
kmalloc-4096 232 232 4096 8 8 : tunables 0 0 0 : slabdata 29 29 0
kmalloc-2048 608 608 2048 16 8 : tunables 0 0 0 : slabdata 38 38 0
kmalloc-1024 1082 1104 1024 16 4 : tunables 0 0 0 : slabdata 69 69 0
kmalloc-512 3856 3856 512 16 2 : tunables 0 0 0 : slabdata 241 241 0
kmalloc-256 14447 14992 256 16 1 : tunables 0 0 0 : slabdata 937 937 0
kmalloc-128 48967 49888 128 32 1 : tunables 0 0 0 : slabdata 1559 1559 0
发现明显的增大。
- 打开kernel 调试功能
重新配置kernel选项,打开如下选项即可。
CONFIG_SLUB=y
CONFIG_SLUB_DEBUG=y
CONFIG_SLUB_DEBUG_ON=y
之后进行测试: - 查看异常kmem_cache 的统计信息
cat > /sys/kernel/slab/kmalloc-256/alloc_calls 或者free_calls - 查看每次的申请或释放的调用栈
echo 1 > /sys/kernel/slab/kmalloc-256/trace
通过上述 log 进一步分析出错的地方