1. 内核内存泄漏问题处理流程
1.1 处理方式
用kmemleak
检测内核内存泄漏
kmemleak的原理
kmemleak通过追踪kmalloc(), vmalloc(), kmem_cache_alloc()等函数,把分配内存的指针和大小、时间、stack trace等信息记录在一个rbtree中,等到调用free释放内存时就把相应的记录从rbtree中删除,也就是说rbtree中的记录就是已经分配出去但尚未释放的内存,其中有些内存尚未释放是因为还在被使用,这属于正常情况,而不正常的情况即内存尚未释放但又不会再被使用,就是“泄漏”的内存,那么如何找出泄漏的内存呢?kmemleak缺省每10分钟对内存做一次扫描,在内存中寻找rbtree中记录的地址,如果某个rbtree记录的地址在内存中找不到,就认为这个地址是无人引用的,以后也不可能再被用到,是“泄漏”的内存,然后,把这些泄漏的内存地址以及rbtree中记录的时间、大小、strack trace等相关信息通过 /sys/kernel/debug/kmemleak 这个接口展现给我们。
1.2 启动kmemleak
CONFIG_DEBUG_FS=y #开启debugfs
CONFIG_DEBUG_KMEMLEAK=y # 开启kmemleak debug
CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=n # 开启kmemleak
CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=40000 # 大小
echo watchdog=disable > /proc/watchdog/ctrl # 关闭看门狗
mount -t debugfs nodev /sys/kernel/debug/ #挂载debugfs