责编 | 张红月

来源 | Linux阅码场

2020 年转眼间白驹过隙般飞奔而去,在岁末年初的当口,笔者在回顾这一年程序员世界的大事件后,突然发觉如何避免程序员面向监狱编程是个特别值得一谈的话题。

什么是内存泄漏

程序向系统申请内存,使用完不需要之后,不释放内存还给系统回收,造成申请的内存被浪费。

发现系统中内存使用量随着时间的流逝,消耗的越来越多,例如下图所示:

接下来的排查思路是:

1.监控系统中每个用户进程消耗的PSS (使用pmap工具(pmap pid));

PSS:按比例报告的物理内存,比如进程A占用20M物理内存,进程B和进程A共享5M物理内存,那么进程A的PSS就是(20 - 5) + 5/2 = 17.5M;

2.监控/proc/meminfo输出,重点观察Slab使用量和slab对应的/proc/slabinfo信息;

3.参考/proc/meminfo输出,计算系统中未被统计的内存变化,比如内核驱动代码;

直接调用alloc_page()从buddy中拿走的内存不会被单独统计。

以上排查思路分别对应下图中的1,2,3 :

在排查的过程中发现系统非常空闲,都没有跑任何用户业务进程。

其中在使用slabtop监控slab的使用情况时发现size-4096 不停增长

通过监控/proc/slabinfo也发现SReclaimable 的使用量不停增长

由此判断很可能是内核空间在使用size-4096 时发生了内存泄漏。

接下来使用trace event(tracepoint)功能来监控size-4096的使用和释放过程,主要用来跟踪kmalloc()和kfree()函数对应的trace event,因为他们的trace event被触发之后会打印kmalloc()和kfree()所申请和释放的内存地址,然后进一步只过滤申请4096字节的情况。

(-T 打印堆栈)

等待几分钟之后…

#ctrl ^c 中断trace-cmd

#trace-cmd report

以上步骤相当于:

等待几分钟之后…

从trace-cmd report的输出结果来看,很多kmalloc 对应的ptr值都没有kfree与之对应的ptr值

这就说明了cat进程在内核空间使用size-4096之后并没有释放,造成了内存泄漏。

为了进一步精确定位到是使用哪个内核函数造成的问题,此时手动触发vmcore。

然后使用crash工具分析vmcore:

读出上面kmalloc申请的ptr内存信息

(读取0xffff880423744000内存开始的4096个字节,并以字符形式显示)

发现从上面几个ptr内存中读出的内容都是非常相似,仔细看一下发现都是/proc/schedstat 的输出内容。

通过阅读相关代码发现,当读出/proc/schedstat内容之后,确实没有释放内存。

然后发现kernel上游已经有patch解决了这个问题:

commit: 8e0bcc722289

fix a leak in /proc/schedstats

在第 111 个女神节到来之际,CSDN 向所有技术女神致敬!并特邀产学研界的技术女神代表,共同探讨女性开发者的职业发展机遇与挑战,助力更多程序媛谱写精彩的程序人生。

海思linux内核 太大,一次解决Linux内核内存泄漏实战全过程相关推荐

  1. 一次解决Linux内核内存泄漏实战全过程

    责编 | 张红月 来源 | Linux阅码场 2020 年转眼间白驹过隙般飞奔而去,在岁末年初的当口,笔者在回顾这一年程序员世界的大事件后,突然发觉如何避免程序员面向监狱编程是个特别值得一谈的话题. ...

  2. 海思 截图显示_三星Note10+5G国行跑分达到45万,华为海思麒麟990压力大不大?

    作为一款旗舰手机,跑分不是最重要的,但是跑分很重要.安卓手机之间的跑分还是存在的,而三星即将国行发布的Note系列跑分数据就出现了.三星Note10+5G国行跑分达到45万,45万的跑分数据已经非常强 ...

  3. 海思3519A上运行yolov3(二)——Linux和Windows开发环境和运行环境搭建

    本文主要讲Linux环境配置和Windows上软件的安装 一.Linux 1. Linux服务器上安装Hi3519A的Linux交叉编译器arm-himix200-linux, 复制Linux交叉编译 ...

  4. linux 内核模块太大,Linux内核模块文件大小

    我正在尝试使用vanilla 3.1.0-rc10内核在CentOS 6机器上更新内核.它似乎有效,除了创建的模块的大小明显大于来自发行版RPM的模块.这是一个问题,因为mkinitrd命令最终会创建 ...

  5. 海思YT8511千兆网不通的解决方法

    文章目录 前言 1.YT8511是什么? 2.调试准备工作 3.千兆网口不通,是否需要移植裕太微官方驱动? 4.开始调试网口 4.1 硬件调试 4.2 内核配置 4.2 内核编译 5.运行内核并测试网 ...

  6. 海思视频传输延时与速率问题初步解决

    题记:在上个月,用hi3518c+live555,实现在局域网中传输视频后,然后延时太大,大概延时域网中720p的画面延时在8s,640*480 在5s,320*240在3s左右,当时没有多去研究,然 ...

  7. windows软件窗口或者对话框太大超出屏幕解决办法

    软件窗口太大显示不全 问题:软件窗口或对话框太大,最大化也无法显示全部,拖动标题栏移动到屏幕顶部,底部也显示不出来.具体见下面两张图片. 解决方法: 使用第三方工具: 窗口移动精灵 AltDrag 使 ...

  8. mac u盘文件过大 拷贝不进去_mac文件太大无法复制到u盘怎么办-mac文件太大无法拷贝解决方法 - 河东软件园...

    在日常的学习/生活/工作中我们常常使用U盘储存文件,而想必许多用户在Mac上将比较大的文件拷贝到U盘时,常常会出现"文件太大无法拷贝"的错误提示,而此时我们会发现,其实我们的U盘明 ...

  9. linux u盘文件乱码,轻松解决Linux下U盘乱码的方法

    很少情况会在Linux系统下使用U盘,但是最近有朋友在Linux系统下加载U盘设备的时候发现U盘内的文件出现了乱码现象,这该怎么办呢?很多朋友对Linux系统又不太熟悉,不知道该怎么操作,没关系,让小 ...

最新文章

  1. python模拟按键_python 模拟按键放在模拟器Python初学者的17个技巧
  2. 洛谷p1208 水题贪心 思想入门
  3. pip安装库包以及.whl库包、.tar.gz库包具体方式
  4. python编码与存储读取数据(数组字典)
  5. MySQL优化group by和distinct
  6. POJ 1013 Counterfeit Dollar 称硬币
  7. web 界面设计 Axure元件样式
  8. docker php 安装swoole,swoole(1)使用docker安装swoole环境
  9. 操作系统课程设计之磁盘调度系统的设计与实现c语言
  10. 4G模块UICC逻辑通道入口+CGLA
  11. 计算机合成音乐及扩展名为,计算机合成声音
  12. php 内存设置无效,内存位置访问无效_php提示 内存位置访问无效 解决方法总结...
  13. webm视频怎么转换成mp4?
  14. TP5 页面跳转与重定向
  15. vue项目用antv/g6做网络拓扑图
  16. PCIE操作基础原理
  17. 一本入门深度学习的好书
  18. go语言开发有哪些工具
  19. kettle-增加序列
  20. Uniapp-微信小程序实现全局事件监听并进行数据埋点

热门文章

  1. nexus3 仓库类型
  2. TAG的9C的交易类型
  3. 特洛伊木马服务器源代码(C#)
  4. FFmpeg命令实例合集
  5. 如何建立高效的质量管理系统?
  6. iText的简单应用
  7. java后台(java后端开发)
  8. k8s etcd-2 Unhealthy HTTP probe failed with statuscode: 503
  9. ABAQUS学习(教你学会看写 input 文件)
  10. atitit.企业管理----商业间谍策略的使用与防务