该来的总会来
作者该来的总会来·2017-08-31 09:34
系统工程师·华润

用kmemleak检测内核内存泄漏

字数 1866阅读 2502评论 0赞 4
本文转载自一位专家朋友(微博@vmunix)的博客,他从事UNIX性能方面的工作近十年,今年来开始研究Linux。原文地址:http://linuxperf.com/?p=188

所谓内存泄漏(memory leak),是指分配出去的内存在用完之后忘了释放,造成内存浪费,可用的内存越来越少。内存泄漏是程序设计的错误导致的,既可能发生在用户程序里,也可能发生在内核中。

诊断内存泄漏问题的目标是定位为什么内存用完之后会忘了释放,最终都是需要阅读源代码,理解内在的逻辑,找出其中的错误。作为最基本的分析线索,我们至少需要观察内存的分配与释放操作,还有一些更高级的工具可以帮助我们找出无人引用的内存块以及最初分配它的backtrace,这就更有针对性了。诊断用户态程序内存泄漏最流行的工具是Valgrind,对于内核,类似的工具是kmemleak。

kmemleak的原理

kmemleak通过追踪kmalloc(), vmalloc(), kmem_cache_alloc()等函数,把分配内存的指针和大小、时间、stack trace等信息记录在一个rbtree中,等到调用free释放内存时就把相应的记录从rbtree中删除。也就是说rbtree中的记录就是已经分配出去但尚未释放的内存,其中有些内存尚未释放是因为还在被使用,这属于正常情况,而不正常的情况,即真正“泄漏”的内存都是不会再被使用的,那么如何找出泄漏的内存呢?kmemleak缺省每10分钟对内存做一次扫描,寻找内存中有没有rbtree中记录的地址,如果某个地址在内存中找不到,就认为这个地址是无人引用的,不会再被用到,是“泄漏”了,然后,把这些泄漏的内存地址以及rbtree中记录的相关信息通过 /sys/kernel/debug/kmemleak 这个接口展现给我们。

注:
kmemleak的扫描算法存在误报的可能,比如内存中碰巧有一个数据与rbtree中的某个地址相同,但它只是数据而非指针,kmemleak是无法分辨的,会认为它是正常使用中的内存块;再比如rbtree中的某个地址在内存中找不到,但程序可能还在用它,只是因为程序并没有直接保存访问地址,而是通过某种方式临时计算访问地址,kmemleak也无法分辨,会认为这是个泄漏。但是请注意,kmemleak 这个工具的目的是为了给进一步分析提供线索,并不需要绝对精确,小概率的误报是没关系的。

怎样启用kmemleak

要启用kmemleak,前提是内核编译时在“Kernel hacking”中开启了 CONFIG_DEBUG_KMEMLEAK 选项。怎样知道一个运行系统的内核是否支持kmemleak呢?可以查看 /boot/config-$(uname -r) 文件中 CONFIG_DEBUG_KMEMLEAK 是否等于”y”。以RHEL6为例,它的debug kernel是支持kmemleak的,我们看它的config文件:

640.webp.jpg

640.webp.jpg

√ CONFIG_DEBUG_KMEMLEAK=y
表示内核支持kmemleak;
√ CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y
表示kmemleak默认是关闭的,需要显式启用,启用的方式是在kernel command line中添加以下选项:
kmemleak=on

怎样使用kmemleak

kmemleak的用户接口是:
/sys/kernel/debug/kmemleak
发送指令和输出信息都是通过以上文件进行的。要访问这个文件,必须先挂载以下文件系统:

# mount -t debugfs nodev /sys/kernel/debug/

kmemleak缺省每10分钟扫描内存一次,找到可疑的内存泄漏会在syslog中写一条记录,提示更详细的信息可以通过/sys/kernel/debug/kmemleak看到:

640.webp (1).jpg

640.webp (1).jpg

也可以手工发起kmemleak的内存扫描:

# echo scan > /sys/kernel/debug/kmemleak

还可以调整kmemleak内存扫描的参数,更多的操作详见手册:
https://www.kernel.org/doc/html/latest/dev-tools/kmemleak.html

参考资料:
http://tekkamanninja.blog.chinaunix.net/uid-26859697-id-5758036.html

本文转自微信公众号:企业存储技术

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

4

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

X社区推广