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

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的方式,对性能也是有些影响的。总之基本功还是很重要,而且不要驾驭自己驾驭不了的编码方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python3.6+selenium_Testsuits测试套件

#!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2018/11/23 11:23 # File : unittest_test2_2.pyTestsuits测试套件 import unittest from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.commo…

PBRT笔记(7)——反射模型

基础术语 表面反射可以分为4大类&#xff1a; diffuse 漫反射glossy specular 镜面反射高光perfect specular 完美反射高光retro-reflective distributions 后反射分布几何坐标系以及工具函数 pbrt中的反射是在反射坐标系中进行计算的。坐标系由着色点处法向量与两个切向量组成…

Linux grep命令、Linux cd命令、Linux pwd命令

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Linux grep命令用于查找文件里符合条件的字符串。 grep指令用于查找内容包含指定的范本样式的文件&#xff0c;如果发现某文件的内容符…

忠告:创业公司与大公司正面竞争易死

移动互联网的兴起给了创业公司足够的发展空间&#xff0c;也提供了一个相对公平的竞争平台。但机遇永远与挑战并存。   对于初创公司&#xff0c;最大的挑战莫过于在移动互联网大潮中生存下来。IDG资本合伙人高翔认为&#xff0c;初创公司不要和大公司正面竞争&#xff0c;应…

海康萤石摄像机远程监控机制分析

背景介绍 有一个远程监控的需求&#xff0c;正常情况下采用服务器转发视频流对服务器要求很高&#xff0c;所以p2p看似是一个比较好的方案&#xff0c;但是p2p打洞却不是一件容易的事情&#xff0c;所以打算分析下海康萤石摄像机远程监控的机制&#xff0c;是否采用了p2p的方式…

实体类中存在List集合,怎么在xml文件中,对应

public class AppointmentDTO {/**订单id**/private String appointmentId;/**订单里面的商品list**/private List<CommodityShowInAppoinment> list;/**订单里面的商品数量**/private Integer count;/**订单实际付款的金额**/private Float totalMoney; } 怎么弄呢&…

git管理复杂项目代码

背景 我初学前端的时候接触git&#xff0c;那时候只要会add/commit什么的就好了&#xff0c;网上的教程大多都停留在从头到尾一个个介绍git的命令&#xff0c;关于各种用法&#xff0c;特别是多个分支来回交叉冲突的实际处理&#xff0c;很少有这方面的介绍&#xff0c;经过很多…

实现一个通用的生产者消费者队列(c语言版本)

背景&#xff1a;笔者之前一直从事嵌入式音视频相关的开发工作&#xff0c;对于音视频的数据的处理&#xff0c;生产者消费者队列必不可少&#xff0c;而如何实现一个高效稳定的生产者消费者队列则十分重要&#xff0c;不过按照笔者从业的经验&#xff0c;所看到的现象&#xf…

美媒:小米新浪达成合作 采取行动对抗腾讯

来自美媒的报道称&#xff0c;两家中国最具发展潜力的科技公司&#xff0c;新浪和小米将会共同合作&#xff0c;结合各自的通信应用程序来共同对抗移动通信的挑战&#xff0c;尤其是拥有2亿用户的强劲对手微信。 来自中国的消息称&#xff0c;这次新浪与小米的合作将会涉及到新…

Linux expr命令、Linux wc命令、Linux let 命令

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 expr命令是一个手工命令行计数器&#xff0c;用于在UNIX/LINUX下求表达式变量的值&#xff0c;一般用于整数值&#xff0c;也可用于字符…

【English】六、am,is,are 分别用在什么地方

is&#xff1a;第三人称单数am&#xff1a;第一人称单数are&#xff1a;第二人称单数&#xff0c;第一、二、三人称的复数 用于第一人称, I am ......(我是.......)用于第三人称, He is ......(他是......) 或She is ......(她是......), It is ......(它是.......)用于第二人…

误删了公司数据库,但我还是活下来了

专栏 | 九章算法 网址 | www.jiuzhang.com 上周我与同事们进行了一次关于职业生涯中搞砸了一些事情的简短谈话。这确实会沦为他人笑柄&#xff0c;却更给我们带来了珍贵的教训。重要的是&#xff0c;我们应该分享那些曾经的错误&#xff0c;这样其他人就可以从其中学习。下文是…

改良程序的11技巧

有很多理由都能说明为什么我们应该写出清晰、可读性好的程序。最重要的一点&#xff0c;程序你只写一次&#xff0c;但以后会无数次的阅读。当你第二天回头来看你的代码时&#xff0c;你就要开始阅读它了。当你把代码拿给其他人看时&#xff0c;他必须阅读你的代码。因此&#…

历时四年,给Google提交的Android Framework Bug终于被Fixed了

历时四年&#xff0c;Google终于修复了一个我发现的Android Framework Bug 2014年在做一个Android终端设备开发过程中&#xff0c;发现了一个Android Framework层的Bug&#xff0c;给Google提交了issue和解决方案&#xff0c;和外界传言一致Google一般不太在意个人开发者提交的…

Linux ping命令、Linux kill命令、Linux logname命令、 Linux logout命令

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Linux ping命令用于检测主机。 执行ping指令会使用ICMP传输协议&#xff0c;发出要求回应的信息&#xff0c;若远端主机的网络功能没有…

前端布局神器display:flex

2009年&#xff0c;W3C提出了一种新的方案--Flex布局&#xff0c;可以简便、完整、响应式地实现各种页面布局。目前已得到所有现在浏览器的支持。 flex浏览器支持一、Flex布局是什么&#xff1f; Flex是Flexible Box的缩写&#xff0c;翻译成中文就是“弹性盒子”&#xff0c;用…

bind简单转发实验

2019独角兽企业重金招聘Python工程师标准>>> *主配置文件内容// [rootlocalhost /]# cat /etc/named.conf // // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a local…

数据结构:块状链表

一、概述 有时候我们需要设计这样一种数据结构&#xff1a;它能快速在要求位置插入或者删除一段数据。先考虑两种简单的数据结构&#xff1a;数组和链表。数组的优点是能够在O(1)的时间内找到所要执行操作的位置&#xff0c;但其缺点是无论是插入或删除都要移动之后的所有数据&…

记账本开发小计(四)

今天处理的是记账本小软件中的查询功能&#xff0c;由于账目的要求就是准确性&#xff0c;所以对于记账本程序来说&#xff0c;模糊查询并不适用&#xff0c;所以在这里只能是按照指定的条件来进行查询所以我做的事按照时间进行查询&#xff0c;为了方便进行处理&#xff0c;这…

Linux ps命令、Linux top命令

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Linux ps命令用于显示当前进程 (process) 的状态。 语法 ps [options] [--help][options] [--help] 参数&#xff1a; ps 的参数非常…