利器解读!Linux 内核调测中最最让开发者头疼的 bug 有解了|龙蜥技术
编者按:一直持续存在内核内存调测领域两大行业难题: "内存被改" 和 "内存泄漏"何解?本文整理自龙蜥大讲堂第 13 期,有效地解决这两大难题都需要什么方案?快来看作者的详细介绍吧!
一、背景
1.1 内存被改
//out-of-bound
char *s = kmalloc(8, GFP_KERNEL);
s[8] = '1';
kfree(s);
//use-after-free
char *s = kmalloc(8, GFP_KERNEL);
kfree(s);
s[0] = '1';
//double-free
char *s = kmalloc(8, GFP_KERNEL);
kfree(s);
kfree(s);
1.1.1 为什么调测难
1.1.2 现有方案的局限性
SLUB DEBUG 需要传入 boot cmdline 后重启,也影响不小的 slab 性能,并且只能针对 slab 场景;
KASAN 功能强大,同时也引入了较大的性能开销,因此不适用于线上环境;后续推出的 tag-based 方案能缓解开销,但依赖于 Arm64 的硬件特性,因此不具备通用性;
KFENCE 相对来讲进步不少,可在生产环境常态化开启,但它是以采样的方式极小概率地发现问题,需要大规模集群开启来提升概率。而且只能探测 slab 相关的内存被改问题。
1.2 内存泄漏
char *s;
for (;;) {
s = kmalloc(8, GFP_KERNEL);
ssleep(1);
}
1.2.1 为什么调测难
1.2.2 现有方案的局限性
二、解决方案
可以在生产环境的kernel动态开启和动态关闭。
功能关闭时无任何性能回退。
能够100% 捕获slab/order-0 page的out-of-bound、memory corruption, use-after-free、 invaild-free 等故障。
能够精准捕获问题发生的第一现场(从这个意义上来看,可以显著加速问题的复现时间)。
支持 per-slab 开关,避免过多的内存和性能开销。
支持 slab/page 内存泄露问题的排查。
2.1 使用方法
2.1.1 功能开启
(可选)配置按 slab 过滤
采样模式
全量模式
2.1.2 内存被改
2.1.3 内存泄漏
2.2 使用效果
对于内存被改,抓到该行为后会在 dmesg 打印现场的调用栈。从触发现场到该内存的分配/释放情况一应俱全,从而帮助精准定位问题。
2.3 性能影响
2.3.1 hackbench
2.3.2 sysbench mysql
三、总结
理论上的覆盖场景不全
内存开销大
关于回放和课件获取
加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;加入钉钉群:扫描下方钉钉群二维码。欢迎开发者/用户加入龙蜥社区(OpenAnolis)交流,共同推进龙蜥社区的发展,一起打造一个活跃的、健康的开源操作系统生态!
龙蜥社区(OpenAnolis)由企事业单位、高等院校、科研单位、非营利性组织、个人等在自愿、平等、开源、协作的基础上组成的非盈利性开源社区。龙蜥社区成立于 2020 年 9 月,旨在构建一个开源、中立、开放的Linux 上游发行版社区及创新平台。
龙蜥社区成立的短期目标是开发龙蜥操作系统(Anolis OS)作为 CentOS 停服后的应对方案,构建一个兼容国际 Linux 主流厂商的社区发行版。中长期目标是探索打造一个面向未来的操作系统,建立统一的开源操作系统生态,孵化创新开源项目,繁荣开源生态。
目前,龙蜥OS 8.4已发布,支持 X86_64 、Arm64、LoongArch 架构,完善适配 Intel、飞腾、海光、兆芯、鲲鹏、龙芯等芯片,并提供全栈国密支持。
欢迎下载:
https://openanolis.cn/download
加入我们,一起打造面向未来的开源操作系统!
https://openanolis.cn