1、通过free 看 剩余内存

# free

total used free shared buffers

Mem: 2065866752 1268113408 797753344 0 9060352

-/+ buffers/cache: 1259053056 806813696

Swap: 524283904 0 524283904

假如通过“Free”查看内存几乎耗尽,但通过top/ps命令却看不出来用户态应用程序占用太多的内存空间, 那么内核模块可能发生了内存泄露

# top -m 5

User 4%, System 2%, IOW 0%, IRQ 0%

User 49 + Nice 0 + Sys 32 + Idle 1120 + IOW 0 + IRQ 0 + SIRQ 1 = 1202

PID USER PR NI CPU% S #THR VSS RSS PCY Name

4264 system 18 -2 2% S 95 1765108K 98260K fg system_server

5145 u0_a41 20 0 2% S 41 1692144K 65372K bg com.douyu.xl.douyutv

7063 root 20 0 0% R 1 4532K 1548K fg top

2602 root RT 0 0% D 1 0K 0K fg vdec-core

2、查看Slab 内存

SLAB是Linux内核中按照对象大小进行分配的内存分配器。

通过SLAB的信息来查看内核模块占用的内存空间:

方法1. 查看meminfo文件

# cat /proc/meminfo | grep Slab

Slab: 121588 kB

++++++++++++++++++++++++++++++++++++++++++++++++++++++

方法2. 查看slabinfo文件

# cat /proc/slabinfo

slabinfo - version: 2.1

# name : tunables : slabdata

cifs_small_rq 31 32 448 8 1 : tunables 54 27 8 : slabdata 4 4 0

cifs_request 5 5 16512 1 8 : tunables 8 4 0 : slabdata 5 5 0

cifs_oplock_structs 0 0 64 59 1 : tunables 120 60 8 : slabdata 0 0 0

......

size-32 29904 29904 32 112 1 : tunables 120 60 8 : slabdata 267 267 0

kmem_cache 156 156 2688 1 1 : tunables 24 12 8 : slabdata 156 156 0

一般查看slabinfo文件就足以,如果发现slabinfo中占用内存过大,那基本可以断定,内核模块出现了内存泄露了

还有个命令 slabinfo 也是可以看,其实也是去读 /proc/slabinfo 后可视化出来

3.Kmemleak工具

Demo:

看看下面这个函数是哪里导致的内存泄漏呢?

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 成对出现的。

问题正好出在 pr_debug 这个函数中的参数传递, 熟悉函数调用传参的人应该会知道编译器一般对参数的处理采用堆栈的方式,是一个先进后出的过程,这样参数的执行一般是逆序的(由于编译器实现的不同,这个过程不是确定的),这样kfree会在kmalloc之前运行,导致每次运行都会泄漏一点内存。

参考资料

linux 内存泄露 工具,Linux Kernel模块内存泄露分析相关推荐

  1. Linux漏洞建议工具Linux Exploit Suggester

     Linux漏洞建议工具Linux Exploit Suggester 在Linux系统渗透测试中,通常使用Nessus.OpenVAS对目标主机进行扫描,获取目标主机可能存在的漏洞.如果无法进行漏洞 ...

  2. linux系统进程管理工具,Linux系统进程管理工具

    对于Linxu系统运维工程师来说好的系统进程管理工具,就像一把利器,无坚不摧,可以使用这些工具发现造成性能问题可能原因,提升团队的工作效率,本篇知识提及一些简单常用系统管理工具包括了pstree.ps ...

  3. linux中top工具,Linux命令工具 top详解

    Linux命令工具 top详解 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.top是一个动态显示过程,即可以通过用户按键来不 ...

  4. linux c语言工具,Linux下C语言编程环境的工具.doc

    Linux下C语言编程环境的工具 Linux下C语言编程环境的工具 Linux下C语言编程环境的工具 要想在Linux下进行C语言编程,首先得搭建好一个编程环境.这里分别说明一下几个非常有用的软件包. ...

  5. windows7内存诊断工具有用吗_windows内存诊断工具有什么用

    windows内存诊断工具有什么用 导读:内存可以说是电脑的重灾区,很多电脑问题都跟内存有关.内存稍微有点问题都有可能导致系统运行不稳定,最常见的表现就是蓝屏,自动重启,甚至开不起机.如果是开不起机的 ...

  6. linux语言 翻译工具,Linux文本转语音工具eSpeak介绍

    Text to speech tool in Linux eSpeak是一款 Linux 命令行工具,能把文本转换成语音.它是一款简洁的语音合成器,用C语言编写而成,它支持英语和其它多种语言. eSp ...

  7. linux的locate工具,linux文本查找工具之locate、find

    linux文本查找工具之locate.find 一.文件查找分为两类: 1.非实时查找:locate 2.实时查找:find 二.非实时查找:locate 非实时查找:查找速度快.非精准查找.模糊查找 ...

  8. windows7内存诊断工具有用吗_Win7内存诊断工具开启与使用技巧

    Win7系统能够流畅的运行,内存起到很大的作用,但在使用的过程中难免会遇到错误,这时候系统内置的内存诊断工具就可以排上用场了,考虑到部分用户不知道怎么使用Win7内存诊断工具,下面我们就详细的介绍下W ...

  9. linux 内存泄露工具,linux下检查内存泄露的工具--mtrace

    下面是它的用法 #include #include #include #include intmain(){ setenv("MALLOC_TRACE","output& ...

最新文章

  1. 借助Glances Monitor,密切关注你的系统
  2. LR12的log解释
  3. python小程序-第一个python小程序——即时动态时钟(代码解读)
  4. 编程python怎么读-python怎么读sql数据?
  5. 49、Power Query-合并查询温故知新
  6. XAMPP Apache + MySQL + PHP + Perl
  7. 使用msui的回到顶部的一个小问题
  8. Xor HDU - 6899
  9. Python字符串格式:%vs.format
  10. HTML5在手机端实现视频全屏展示
  11. [心得] 如何利用liquibase進行資料庫版本控制 - 實際練習
  12. 运动目标跟踪(八)--时空上下文(STC)跟踪原理
  13. 【BMC】Redfish简述
  14. 计算机组成原理汉字编码与校验设计实验报告(汉字国标码转区位码实验、汉字机内码获取实验、海明编码电路设计与海明解码)
  15. php李炎恢代码,李炎恢老师thinkphp5.1视频教程含课程讲义代码SQL文件php视频
  16. Mac OS X 背后的故事(三)Mach之父Avie Tevanian
  17. Python读取excel生成正态分布图
  18. 【微动弹性带方法——续鞍点】
  19. systemctl重新加载_CentOS7利用systemctl添加自定义系统服务【转】
  20. springboot+Vue+Elementui医院网上预约挂号系统java项目

热门文章

  1. java请求报错(原因:CORS 头缺少 ‘Access-Control-Allow-Origin‘)
  2. log4j2 日志框架小记
  3. 阿里云服务器报 Liunx异常文件下载处理办法
  4. 哈密顿图 哈密顿回路 哈密顿通路(Hamilton)
  5. XML文件解析之--DOM与SAX
  6. 安装 Windows 自动化 API 3.0 时,visual Studio 2010 更快地运行
  7. 在网站中使用Cookie的简单例子
  8. 计算机大作业visio选题,大作业一 用Visio绘网络结构图
  9. mysql+join的原理,Mysql连接join查询原理知识点
  10. y空间兑换代码_【CV学习笔记】色彩空间