责编 | 张红月

来源 | 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. 单片机GPIO软件模拟I2C通讯程序
  2. Hyperledger Fabric 核心模块(6)configtxlator工具
  3. 一個全世界最珍貴的故事(轉載)
  4. 技术分享(持续更新)
  5. 安卓机高的地图要用浏览器打开_浏览器F12操作概述
  6. linux命令--sysctl
  7. 牛客题霸题目及题解汇总
  8. 笔记本计算机死机后如何启动,电脑戴尔死机如何重新启动的解决方法
  9. JSON在android中应用
  10. ASP.NET核心之路微服务第01部分:构建视图
  11. 微课|Python编写代理服务器程序(48分钟)
  12. Android中ActionBar中不显示overflow(就是三个点的那个按钮)解决办法
  13. python编程是啥-什么是少儿Python编程?这一篇就够啦!
  14. 硬着头皮,爬上龙门吊
  15. 教你自定义收支类别,收支账户进行记账
  16. Visual Studio 2022把C#代码打印出来的技巧 有屋设计拆单管理一体化软件 全屋定制拆单 橱柜衣柜整装 木门归方程序
  17. 这种网站我看见就收藏
  18. SAP中通过删除新建未记账成本要素期间的方式更改成本要素类别
  19. thinkpad重装系统不引导_联想装win10系统引导不进系统怎么办?(完美解决方法)
  20. 南京城市公共自行车推出共享单车,停在车桩附近可免费使用

热门文章

  1. t460p加固态硬盘 thinkpad_电脑小白的Thinkpad T460P升级之路
  2. 【PHP代码审计】TP框架初次了解学习
  3. 两相交的直线段夹角平分的直线上过交点距离为d的另一点求解公式
  4. 1980年微型计算机,微型计算机杂志
  5. 【移动设备取证扩展】桌面计算机分析
  6. android apk执行shell脚本
  7. 【软件工程】——软件工程用图
  8. AIOps做根因定位靠不靠谱?
  9. java反射路径_java反射
  10. MATLAB与STK互联12:卫星对象操作(3)—二维显示