记录一次kernel内存泄漏的查找定位过程

《Linux内核技术实战课》总结二:内存泄漏 总览 内存泄漏:内存被分配出去后 一直没有被释放,导致这部分内存无法被再次使用,更严重的是,指向这块内存空间的指针都不存在了,进而再也无法访问这块内存空间 场景:服务器中的后台任务持续运行,系统中可用内存越来越少; 应用程序正在运行时忽然被 OOM kill 掉了; 进程看起来没有消耗多少内存,但是系统内存就是不够用了 在遇到系统内存不足时,首先要做的是查看 /proc/meminfo 中哪些内存类型消耗较多,然后再去做针对性分析 泄漏的内存可能是应用程序的内存泄漏、内核(操作系统)的内存泄漏; 应用程序的 阅读详情

Bug描述:压力测试一个小工程时发现内存逐渐减少,10个小时后出现OOM

Bug定位过程:

  • 对整个工程模块进行分解,逐步缩小范围,由于整个工程包括几个相对独立的小模块,而整个工程采用单进程多线程的模型,导致进行分解时,要特别注意相互之间的耦合,只能逐步分离各个模块,运行测试(这里如果采用多进程模型,定位会更快一些,一个完整的功能,放在一个进程和多进程中,多进程天然的将功能细化了,定位问题,范围更小)
  • 在经过一段折磨人的拆分过程后,最后把问题定位到整个工程中一个小模块功能内。在对该模块进行了反复的代码review后,没有发现什么异常,甚至没有内存申请的操作。
  • 代码层面没有找到突破的情况下,重新通过各种命令查看了内存状态,由于在此之前一直通过free命令查看内存,发现长时间后free命令输出的可用内存在逐渐减少,但忽略了一点:通过top命令单独查看模块进程占用的内存时,该进程的rss段一直保持稳定,没有大幅度增长。
  • 基于前一步的发现,怀疑是kernel的内存有泄漏,查看/proc/meminfo发现一个疑点:slab内存占用很高,且SUnreclaim的slab一直在增加,此时基本确定kernel内存泄漏。
  • 通过kmemleak对内核内存进行了分析,定位在到一个函数接口中:
char *wr_pr_debug_begin(u8 const *data, u32 len, char *string)
{
    int ii;
    string = kmalloc(len * 2 + 1, GFP_KERNEL);
    for (ii = 0; ii < len; ii++)
        sprintf(&string[ii * 2], "%02X", data[ii]);
    string[len * 2] = 0;
    return string;
}
char *wr_pr_debug_end(char *string)
{
    kfree(string);
    return "";
}
void test()
{
    char *read = 0;
    pr_debug("%s RD%02X%02X%02X -> %s%s\n", st->hw->name,
         i2c_addr, reg, length,
         wr_pr_debug_begin(data, length, read),
         wr_pr_debug_end(read));
}

一眼可能不容易看出上面的有什么问题,有kmalloc,有kfree啊,好像成对出现的。
考验基本功的时候到了,熟悉函数调用传参的人应该会知道编译器一般对参数的处理采用堆栈的方式,是一个先进后出的过程,这样参数的执行一般是逆序的(由于编译器实现的不同,这个过程不是确定的),这样kfree会在kmalloc之前运行,导致每次运行都会泄漏一点内存。上面是一个debug输出,暂时注释掉后压测,问题解决,内存保持稳定。

总结:整个定位过程其实比较简单,如果第一步看下/proc/meminfo可能会更快的定位问题(由于这个kernel driver是“大厂”提供,以为不会出问题,一直从上层的角度去找问题,所以没有太关注kernel相关内存的使用),导致内存泄漏的原因也很简单,出现这种问题的原因,首先编写者的基本功一般,更主要的原因是编写者出于“炫技”的方式去写了这段代码,如果老老实实封装一个debug函数,按照正常顺序调用也就没有问题了,而且这种每次打印进行kmalloc的方式,对性能也是有些影响的。总之基本功还是很重要,而且不要驾驭自己驾驭不了的编码方式。

[内存泄漏]kmalloc-128 slab内存泄漏定位过程 kmalloc-128 slab内存泄漏定位过程问题现象进展受阻现网排查分析coredump后记 问题现象 前几天,技术团队告知,线上几台ARM CentOS设备内存占用高,比其他相同设备占用高约200M。 查看 free,meminfo和slabinfo后,怀疑是slab kmalloc-128存在内存泄漏。 进展受阻 我们发现正常设备和内存占用高设备的 kmalloc-128 占用已经超过177万,粗算下来200多M,刚好是多占用的内存大小。 //异常设备的slab kmalloc-128 阅读详情

相关推荐

Windows程序内存泄漏(Memory Leak)分析之UMDH

小木发现线上的程序通过任务管理器发现内存不断的增长,怀疑是不是内存泄漏呢?用户态内存泄漏可能是句柄泄漏,堆内存泄露,Socket, GDI对象等等。而对于C++程序员来说,碰到最多的无疑是堆内存泄露:也就是通过malloc或者new从堆上申请的内存,使用完成后,并没有释放,导致程序使用的内存越来越多。 小木找到了一个分析利器UMDH: 这也是Windbg工具集中的其中一个利器,它可以在一个时间点记录程序的当前程序使用的堆内存申请的信息,过一段时间后再记录一次程序使用的堆内存申请的信息,然后比较两次的结果来找

一个程序员的修炼之路 1753

/proc/meminfo 内存参数内核分配/释放过程介绍

cat /proc/meminfo 能看到系统内存的统计信息,在分析内存问题时,灵活掌握这些内存参数的实现原理还是很有必要的。https://www.jianshu.com/p/391f42f8fb0d 这片文章对各个内存统计做了详细的分析,讲的很好。本文主要基于内核源码,讲解如下常见的内存统计参数的内核统计过程。 [root@localhost ~]# cat /proc/meminfo MemTotal: 3871288 kB MemFree: 1371388 kB ...

dongzhiyan_hjp 4201

Linux 内核 kmemleak 实战:3步定位 USB hub 驱动内存泄漏(附 backtrace 解析)

本文详细解析了Linux内核中kmemleak工具在USB hub驱动内存泄漏问题中的应用。通过3个关键步骤:环境配置、泄漏场景构造和backtrace解析,指导开发者精准定位并修复内核内存泄漏问题,提升系统稳定性。文章包含实战案例和高级技巧,是内核开发者的实用指南。

weixin_29913663的博客 338

内核内存泄露

泄露点:alloc_vmap_area、__get_vm_area_node。触发导致内存泄露的操作步骤,跟踪调用关系,确定申请的内存是否有正确释放。2、通过cat /proc/slabinfo,查看slab申请情况。对比发现kmalloc-2048、kmalloc-128又所增长。128泄露:(6507+6055)*128/1024=1570k。3、打开内核SLUB_DEBUG_ON选项,即可访问。案例:USB主从切换后轻微内存泄露,定位流程。泄露点:dwc3_probe。一、进程内存申请查看工具。

qq_27357145的博客 1277

内存泄漏的检测、定位和解决经验总结

详细介绍内存泄露出现的原因、分析工具使用、解决办法、内存泄露检测。

构建高可用CephFS NFS网关:NFS-Ganesha与RADOS集群的深度整合

本文详细介绍了如何构建高可用的CephFS NFS网关,通过NFS-Ganesha与RADOS集群的深度整合,实现高效文件共享。文章涵盖核心架构、部署实战、性能调优及避坑指南,帮助用户解决Ceph客户端兼容性问题,提升存储访问效率。特别强调高可用设计,确保服务稳定性,适用于金融、电商等高要求场景。

weixin_26976635的博客 254

【问题记录】kmemleak 定位内存泄露

在某些复杂的项目中,如果存在内存泄露问题,而又无法通过常规的命令工具去定位问题,若通过代码去逐步排查也很难去排查出来,通过kmemleak工具就可以很好的帮我们定位出来内存泄露的具体代码处,进而缩小问题的范围,向上面的示例中,定位出来是 tty_open 函数内申请的内存,那对应的应该想到是不是在 tty_close 或者对应的退出函数中该段内存没有去释放掉,可以通过添加打印来逐步排查。

qq_45527937的博客 1551

嵌入式存储入门:Emmc控制器与设备工作原理全解析(附Synopsys/Arasan架构图)

本文深入解析了嵌入式系统中Emmc控制器与设备的工作原理,重点剖析了其作为CPU与存储设备桥梁的核心架构。通过对比Synopsys和Arasan两家主流IP厂商的控制器设计,详细阐述了DMA引擎与FIFO缓冲模块如何协同工作以提升数据传输效率,并提供了从硬件PCB布局到驱动调试的实战指南,帮助硬件工程师与开发者优化系统性能。

weixin_29248653的博客 146

linux kernel内存泄漏检测工具之kmemleak

3.1 原理简介kmemleak实现方法是一个插桩加扫描过程, 它提供一个kmemleak_alloc桩函数,这个函数会在内核slab、vmalloc、alloc_bootmem、pcpu_alloc等函数分配接口中被调用,每次调用时该函数均会创建一个kmemleak object记录分配内存的相关信息比如内存地址,大小,调用栈等,并将这个object加入到一个rbtree里面;当内核释放内存时,也会调用kmemleak_free删除对应object。

yanghao23的专栏 3632

CAN信号定义避坑指南:Kvaser Database Editor里Byteorder和Bitpos设置的那些‘坑’

本文详细解析了在Kvaser Database Editor中配置CAN信号时,字节序(Byteorder)和起始位(Bitpos)设置的常见错误及解决方案。通过实际案例和验证技巧,帮助工程师避免DBC文件配置中的陷阱,确保车载电子系统的稳定通信。

weixin_28678831的博客 360

Ubuntu下Vim创建属于自己的头部注释和代码模板

痛点 每次打开vim想写个C或者C++的程序都要把固定的模板敲一遍,是不是感觉非常的繁琐,能不能把Vim弄得像IDE那样新建一个文件直接生成对应的头部注释和代码模板,减少这些重复工作呢?下面我尽量详细的介绍实现的方法: 先看看新建文件后的效果 C语言格式效果 C++语言效果 方法: 使用命令 vi /etc/vim/vimrc 打开vimrc这个文件,然后复制以下代码至文件末尾的空白处即可! 修改vimrc文件里面的内容必须要用root管理员身份才能进行修改,修改时先切换至root身份即可。 "新建.

weixin_42137584的博客 1561

Kernel Hacking之内核内存泄漏

内核态内存泄漏排查工具及使用方法

m0_51717456的博客 2006

深入解析Dataloader中shuffle机制与随机种子对模型训练的影响

本文深入探讨了Dataloader中shuffle机制与随机种子对机器学习模型训练的影响。通过实际案例分析,详细解释了数据打乱顺序的必要性、随机种子的正确设置方法以及两者协同工作的原理,帮助开发者避免常见陷阱并提升模型训练效果。

weixin_29166013的博客 141

什么是内存泄漏?

在wikipedia这样解读内存泄漏的:在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计...

嵌入式Linux 1176

【IC设计实战】去耦电容decap在电源完整性中的关键作用与选型策略

本文深入探讨了去耦电容(decap)在IC设计电源完整性中的核心作用。文章分析了decap如何通过提供本地电荷缓冲来抑制电源噪声与电压波动,并详细阐述了其选型与布局策略,包括MIM、MOM、MOS电容的特性对比,以及如何权衡峰值抑制与建立速度的矛盾,为设计稳定可靠的芯片电源系统提供实践指导。

weixin_29233857的博客 248

基于STM32F103C8T6的智能蓝牙手环系统设计与实现

摘要:本文设计并实现了一款基于STM32F103C8T6单片机的智能蓝牙手环系统。该系统集成了ADXL345加速度计、DS18B20温度传感器、plusesennor心率模块和BT06蓝牙模块,实现了心率(±2bpm)、体温(±0.5℃)、步数(±3%)等健康数据的实时监测与显示。通过OLED屏提供人机交互界面,支持蓝牙APP远程控制,具备自动步数清零、异常提醒等功能。测试表明系统各项功能均达到设计要求,响应时间0.1-0.5秒,心率检测准确率98%,体温检测准确率99%,功耗50mA(工作)/10mA(待

3254968421的博客 205

使用UMDH查找内存泄漏

预览: 使用UMDH分析查找内存泄漏技术 上半年对内存泄漏查找作了一个总结,主要是使用crt的debug版本查找内存泄漏,但是存在的缺陷是只能定位到用户代码中自己分配的内存,对于使用其他库中分配的内存,应用程序没有释放的这种泄漏定位还是非常困难。本文介绍使用windbg工具中的UMDH来分析查找内存泄漏可以方便的定位到内存分配的堆栈,即使是在第三方库中分配的内存没有释放,也可以追溯

痞子龙3D编程 2783

Python爬虫实战:全面采集国家自然科学基金项目数据的全流程指南

国家自然科学基金委员会(NSFC)支持基础研究、应用基础研究,是我国科研投入的核心项目之一。公开的项目数据包括项目名称、负责人、资助金额、年度、单位等,具备极高科研和数据分析价值。requests:基础HTTP请求库,简单直观:异步HTTP请求库,适合大规模并发:HTML解析,提取数据:处理JavaScript渲染网页pandas:数据分析与清洗:数据库存储:重试机制实现。

2201_76125261的博客 753

vmalloc kmalloc slab native和kernel 内存泄漏

vmalloc kmalloc slab native和kernel内存泄漏

aa541850383的专栏 893

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

RK3588 Android12 DMABUF内存泄漏排查与定位实战

本文详细介绍了RK3588 Android12平台上DMABUF内存泄漏问题的排查与定位实战。通过分析内核日志、监控内存状态和逆向追踪文件描述符,最终锁定mediacodec进程的内存泄漏问题,并提供了从紧急修复到代码审计的完整解决方案,帮助开发者有效应对类似问题。

weixin_29300241的博客 347

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Linux Kernel 模块内存泄露查找 (2)

在之前的一篇博文<<Linux Kernel模块内存泄露的一种查找思路>>中,我介绍了一种查找内核内存泄露的一种方法。这不才几个月,又有客户埋怨:使用了产品5天左右后,Suse服务器由于内存耗尽而Crash。O My God,不会吧,在我机器上跑的好好的哇(程序员常用名言 嘿嘿)。 那么就让我们一起来看看,苦逼的博主是如何确定问题并且找到问题的....

一个程序员的修炼之路 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

开机卡在start kernel...情况分析

事件描述 环境:Linux4.4的内核 从rk拉下来的代码,然后直接编译,烧录完以后停在了Start Kernel…然后进行原因分析. 分析 1 在板子上烧录安卓的固件,可以正常跑起来,初步排除硬件问题. 2 在另外项目的板子上烧录同样的固件,也可以跑起来,这就奇怪了,但是在我调试的板子上就是Start Kernel… 3 添加打印信息,确定跑到了kernel_entry(0, machid, ...

arunboy的博客 6133

RK3588 Android12 DMABUF内存泄漏问题分析

RK3588 Android12 DMABUF内存泄漏问题分析 什么是DMABUF DMABUF是多媒体设备之间共享内存的一种特定buffer结构,不同设备可以通过DMABUF的fd进行跨进程共享内存,实现零拷贝提高性能,支持异步访问降低模块耦合度。 问题描述 RK3588机器在线视频播放长时间拷机出现系统重启,log里面可以看到dma-buf内存分配失败,最后导致系统重启。 [05-15 04:55:46][64021.496139][ T6554] rk_vcodec: mpp_task_attach_

weixin_43245753的博客 7759

linux kernel内核slab内存泄露debug经验

1. 打开内核的SLUB DEBUG选项+CONFIG_SLUB_DEBUG=y+CONFIG_SLUB_DEBUG_ON=y2. 观察slabinfocat /proc/slabinfo启动后记录下slabinfo。运行一段时间,再观察slabinfo。找到增长比较大的slab。3. 打开slab traceecho 1 &gt; /sys/kernel/slab/&lt;leaking_sla...

thwack的专栏 9587

gflags 调试内存_Windows程序内存泄漏(Memory Leak)分析之UMDH

小木发现线上的程序通过任务管理器发现内存不断的增长,怀疑是不是内存泄漏呢?用户态内存泄漏可能是句柄泄漏,堆内存泄露,Socket,GDI对象等等。而对于C++程序员来说,碰到最多的无疑是堆内存泄露:也就是通过malloc或者new从堆上申请的内存,使用完成后,并没有释放,导致程序使用的内存越来越多。小木找到了一个分析利器UMDH: 这也是Windbg工具集中的其中一个利器,它可以在一个...

weixin_39632467的博客 333
上一篇: 关于tcp网络通讯的几个场景的小测试
下一篇: 智能硬件的时代,嵌入式是否已经日薄西山
voidreturn
博客等级 码龄10年 53粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值