09 分析篇 | 如何对内核内存泄漏做些基础的分析?
邵亚方
该思维导图由 AI 生成,仅供参考
你好,我是邵亚方。
如果你是一名应用开发者,那你对应用程序引起的内存泄漏应该不会陌生。但是,你有没有想过,内存泄漏也可能是由操作系统(内核)自身的问题引起的呢?这是很多应用开发者以及运维人员容易忽视的地方,或者是相对陌生的领域。
然而陌生的领域不代表不会有问题,如果在陌生的领域发生了问题,而你总是习惯于分析应用程序自身,那你可能要浪费很多的分析时间,却依然一无所获。所以,对于应用开发者或者运维人员而言,掌握基本的内核内存泄漏分析方法也是必需的,这样在它发生问题时,你可以有一个初步的判断,而不至于一筹莫展。
内核内存泄漏往往都会是很严重的问题,这通常意味着要重启服务器来解决了,我们肯定并不希望只能靠重启服务器来解决它,不然那就只能没完没了地重启了。我们希望的应该是,在发生了内存泄漏后,能够判断出来是不是内核引起的问题,以及能够找到引起问题的根因,或者是向更专业的内核开发者求助来找到问题根因,从而彻底解决掉它,以免再次重启服务器。
那么,我们该如何判断内存泄漏是否是内核导致的呢?这节课我们就来讲一讲内核内存泄漏的基础分析方法。
内核内存泄漏是什么?
在进行具体的分析之前,我们需要先对内核内存泄漏有个初步的概念,究竟内核内存泄漏是指什么呢?这得从内核空间内存分配的基本方法说起。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了内核内存泄漏的基础分析方法,包括内核空间内存分配的基本方法、内核内存泄漏的观察建议以及复杂场景下的内核内存泄漏问题分析思路。文章指出了内核内存泄漏与用户空间内存泄漏的不同之处,并提出了观察内核内存泄漏的建议,包括质疑第三方驱动程序和自己开发的驱动程序。此外,还介绍了内核内存泄漏的常用分析方法,如通过/proc/meminfo观察内核内存的分配情况,以及使用kmemleak、tracepoint或者kprobe等工具来动态观察内核内存使用情况。最后,文章提出了课后作业,鼓励读者通过编写systemtap脚本来追踪内核内存的申请和释放。整体而言,本文为读者提供了对内核内存泄漏进行基础分析的方法和建议,有助于读者快速了解内核内存泄漏问题的特点和解决方法。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 内核技术实战课》,新⼈⾸单¥59
《Linux 内核技术实战课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(10)
- 最新
- 精选
- stackWarn根据本文写的一篇实验博客,链接 https://0xfe.com.cn/post/b6ee23d8.html 末尾碰到个问题,不知道有没有老师帮忙解惑!!
作者回复: 大概看了下,应该是跟module_exit有关,在exit后kprobe就无法追踪到这个模块了,你可以分析下modlue_exit的逻辑。
2020-09-123 - jssfy请问找到dentry的申请和释放函数有什么常规的套路吗? 因为这次是dentry下次可能是inode或者其他cache
作者回复: 这需要看slab alloc和free,不过这些函数会调用的特别频繁。
2020-09-082 - 从远方过来老师,不同版本的内核都提供了那些tracepoint呢?在哪里有记录么? 然后每个tracepoint的使用是需要看内核源码才知道怎么用么?
作者回复: 这些tracepiont都在/sys/fs/kernel/debug/tracing/events这个路径,你也可以通过perf来查看。 很多情况下不需要看内核源码才能用,主要看你用他来做什么,看内核源码是为了了解内核的细节。
2020-09-0941 - A免帅叫哥内核代码少了 #include <linux/module.h>
作者回复: 多谢指出来
2021-09-11 - Ilovek8s编译完之后,加载到内核模块,提示kmalloc失败,麻烦老师指点一下
作者回复: 可能是系统内存不够用了?
2021-04-09 - 风清扬有没有朋友遇到make报错的情况,这种如何解决呀? make -C /lib/modules/`uname -r`/build M=`pwd` make[1]: Entering directory '/usr/src/linux-headers-5.15.0-39-generic' make[2]: *** No rule to make target '/root/workspace/cpp/kmalloc/kmem_test.o', needed by '/root/workspace/cpp/kmalloc/kmem_test.mod'. Stop. make[1]: *** [Makefile:1875: /root/workspace/cpp/kmalloc] Error 2 make[1]: Leaving directory '/usr/src/linux-headers-5.15.0-39-generic' make: *** [Makefile:4: all] Error 2 root@52coder:~/workspace/cpp/kmalloc#2022-06-28
- lJ老师,根据代码在自己虚拟机实验了一下,kmem_test安装前后,VmallocUsed始终都是0,只有MemFree、MemAvailable发生了1G左右的变化,其它指标无明显变化。‘’ [root@rune32bit module]# uname -r 4.18.9-1.el7.elrepo.x86_642022-05-18
- MiraCleidocker 内部的 slab无法回收问题,是在内核什么版本修复的。我们使用的CentOS7.6 内核版本:3.10.0-957.21.3.el7.x86_64,存在类似问题,free看到的cache持续增高超过系统50%,docker启动的容器频繁的被系统kill后重启,此cache手动无法释放掉,必须重启服务器才能释放掉此部分内存2022-02-15
- MiraClei请问下docker 内部的 slab无法回收的问题,是在内核什么版本上修复的2022-02-15
- 冬风向左吹涨见识了2020-09-081
收起评论