Linux 内核技术实战课
邵亚方
前蘑菇街技术专家,Linux Kernel 活跃贡献者
23704 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 26 讲
Linux 内核技术实战课
15
15
1.0x
00:00/00:00
登录|注册

09 分析篇 | 如何对内核内存泄漏做些基础的分析?

编写一个systemtap脚本来追踪内核内存的申请和释放
使用kprobe或者systemtap针对具体的内核结构体申请释放函数进行追踪
使用内核提供的内核内存申请释放的tracepoint
使用内核内存泄漏检查工具kmemleak
使用/proc/vmallocinfo查看具体模块的内存使用情况
周期性观察VmallocUsed和SUnreclaim的变化
使用/proc/meminfo观察内核内存的分配情况
/proc/meminfo中的观察方法
区别:物理地址连续与不连续
内核内存申请方式:kmalloc()和vmalloc()
区分用户地址空间和内核地址空间
内核空间内存分配的基本方法
课后作业
复杂场景下内核内存泄漏问题分析思路
如何观察内核内存泄漏?
内核内存泄漏是什么?
如何对内核内存泄漏做些基础的分析?

该思维导图由 AI 生成,仅供参考

你好,我是邵亚方。
如果你是一名应用开发者,那你对应用程序引起的内存泄漏应该不会陌生。但是,你有没有想过,内存泄漏也可能是由操作系统(内核)自身的问题引起的呢?这是很多应用开发者以及运维人员容易忽视的地方,或者是相对陌生的领域。
然而陌生的领域不代表不会有问题,如果在陌生的领域发生了问题,而你总是习惯于分析应用程序自身,那你可能要浪费很多的分析时间,却依然一无所获。所以,对于应用开发者或者运维人员而言,掌握基本的内核内存泄漏分析方法也是必需的,这样在它发生问题时,你可以有一个初步的判断,而不至于一筹莫展。
内核内存泄漏往往都会是很严重的问题,这通常意味着要重启服务器来解决了,我们肯定并不希望只能靠重启服务器来解决它,不然那就只能没完没了地重启了。我们希望的应该是,在发生了内存泄漏后,能够判断出来是不是内核引起的问题,以及能够找到引起问题的根因,或者是向更专业的内核开发者求助来找到问题根因,从而彻底解决掉它,以免再次重启服务器。
那么,我们该如何判断内存泄漏是否是内核导致的呢?这节课我们就来讲一讲内核内存泄漏的基础分析方法。

内核内存泄漏是什么?

在进行具体的分析之前,我们需要先对内核内存泄漏有个初步的概念,究竟内核内存泄漏是指什么呢?这得从内核空间内存分配的基本方法说起。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了内核内存泄漏的基础分析方法,包括内核空间内存分配的基本方法、内核内存泄漏的观察建议以及复杂场景下的内核内存泄漏问题分析思路。文章指出了内核内存泄漏与用户空间内存泄漏的不同之处,并提出了观察内核内存泄漏的建议,包括质疑第三方驱动程序和自己开发的驱动程序。此外,还介绍了内核内存泄漏的常用分析方法,如通过/proc/meminfo观察内核内存的分配情况,以及使用kmemleak、tracepoint或者kprobe等工具来动态观察内核内存使用情况。最后,文章提出了课后作业,鼓励读者通过编写systemtap脚本来追踪内核内存的申请和释放。整体而言,本文为读者提供了对内核内存泄漏进行基础分析的方法和建议,有助于读者快速了解内核内存泄漏问题的特点和解决方法。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 内核技术实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • stackWarn
    根据本文写的一篇实验博客,链接 https://0xfe.com.cn/post/b6ee23d8.html 末尾碰到个问题,不知道有没有老师帮忙解惑!!

    作者回复: 大概看了下,应该是跟module_exit有关,在exit后kprobe就无法追踪到这个模块了,你可以分析下modlue_exit的逻辑。

    2020-09-12
    3
  • jssfy
    请问找到dentry的申请和释放函数有什么常规的套路吗? 因为这次是dentry下次可能是inode或者其他cache

    作者回复: 这需要看slab alloc和free,不过这些函数会调用的特别频繁。

    2020-09-08
    2
  • 从远方过来
    老师,不同版本的内核都提供了那些tracepoint呢?在哪里有记录么? 然后每个tracepoint的使用是需要看内核源码才知道怎么用么?

    作者回复: 这些tracepiont都在/sys/fs/kernel/debug/tracing/events这个路径,你也可以通过perf来查看。 很多情况下不需要看内核源码才能用,主要看你用他来做什么,看内核源码是为了了解内核的细节。

    2020-09-09
    4
    1
  • 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_64
    2022-05-18
  • MiraClei
    docker 内部的 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-08
    1
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部