利用procrank和lsof定位出客户软件内存OOM的问题

    最近遇到一些事情,觉得挺憋屈的,可是再憋屈总得往前走吧!打工人,不好办啊!事情是这样的,笔者在芯片原厂负责SDK和行业解决方案输出的,可以理解成整体SDK turnkey方案。但是有些客户多少还要改一下自己的东西进去,所以问题来了。在我们释放SDK出来的时候也会有固件测试整体功能的,客户修改了自己的东西后,开发的程序跑起来十来分钟就oom了.我方leader跟客户对接呢又不那么自信似的,客户在群里反复抱怨程序有内存泄露. 我们在公司内也组织了再次内测,跑两天都没有任何内存泄露,因此我们建议客户在我们SDK的基础上,做增量的问题定位,把修改过的代码一点点加到原始SDK上去定位. 你猜现在客户都多牛逼,人家不干,拍着胸脯说我们改过的代码100%没有内存泄露,我们没有申请内存,客户反正就是不想去回退代码定位.

    退一步,我们想客户把修改过的代码给我们,我们来定位,本身这客户也是我们的乙方,我们有付一定开发费给他们去给终端客户做一些少量的定制化开发,这些都是大佬们定的策略. 人家客户不给,说每个人写代码的习惯不一样,看代码也要很多时间.坦白地说也不无道理,但是没有代码我们又怎么去推进事情呢?我方领导放大招,要求我们拿客户固件来测测复现问题,再定位内存泄露。真的有点太别扭了,但又能怎么样呢,生活还得继续。

   客户把有问题的固件发给我们,我们复测,确实很容易出问题,十来分钟就挂逼了. 我们监测了内存变化,确实十来分钟就把二十多M的可用内存干到只能4M之内,再慢慢减少,最后系统死掉。问题是复现了,怎么进一步定位呢?

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/edsam49原创,转载请注明出处,谢谢!
/*****************************************************************************************************/

    笔者想到了先用procrank来定位一下哪个进程是不是有内存泄露;procrank 命令可以获得当前系统中各进程的内存占用,从 /proc/pid/maps 中读取信息来进行统计,包PSS,USS,VSS,RSS。我们一般观察 Uss 来反映一个进程的内存使用情况,Uss 的大小代表了只属于本进程正在使用的内存大小,在此进程被杀掉之后,这些内存会被完整的回收。了解了这些细节后,我们就开始干吧!

    好在客户应用起来之前,我们还有机会做一些其他操作,比如我们跑一个脚本来跑procrank监测内存,10秒钟我们执行一次,来观察。下图是开始之初阶段的,明显看出剩余内存还有近20M,cached 3604K; 

跑到快死的时候情况如下:

从这两张图我们分析,app进程占用的uss并没有多大变化,因此可以判断应用程序是没有泄露的。那么问题来了,内存去哪了?

   我们发现cached变成了21688K,明显增大了十几M,跟可用内存丢失的数据大小是基本吻合的。只是cached增加了,那就是文件系统之上的操作了,比如有新文件写到了内存哪里?那么系统也不小,同时段操作的文件也那么多,怎么进行下一步分析呢?

     这个时候我就想到了用lsof来分析。lsof命令不仅可以查看进程打开的文件、目录,还可以查看进程监听的端口等socket相关的信息。那么还是跑起来看吧!

 跑出来的东西文件不少,接近200个了;

李鬼就在里面了,要去排查甑别了。先排查我们SDK也有的,基本确认没有问题的,剩下的也少了。猛的一回头,可疑分子来了,

看见有一个pcm后缀的文件,因此从命令行去看这个路径下的这个文件,发现这个文件蹭蹭的往上在增加。真的实锤了!

证据都到这份上了,还能怎么说。客户拍着胸脯100%没问题的人在群里也低调了。

幸运的是这个问题找到了,不然得多怨啊!老板的理念,客户的问题也是我们的问题,多数时候这话也没错,不配合的情况下咋解决问题,需要点运气和智慧,这种环境下做成这样,你会不会也觉得憋屈?有做事稍微讲理一点的公司缺人否,不缺人的能否来给我们指导一下怎么讲理一点管理。

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

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

相关文章

CSS笔记(黑马程序员pink老师前端)圆角边框

圆角边框 border-radius:length; 效果显示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Documen…

【Linux】网络编程网络基础(C++)

目录 一、计算机网络背景 二、认识 "协议" 三、网络协议初识 【3.1】协议分层 【3.2】OSI七层模型 【3.3】TCP/IP五层(或四层)模型 四、网络传输基本流程 【4.1】网络传输流程图 【4.2】数据包封装和分用 五、网络中的地址管理 一、计算机网络背景 【独立…

【周末闲谈】如何利用AIGC为我们创造有利价值?

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️周末闲谈】 系列目录 ✨第一周 二进制VS三进制 ✨第二周 文心一言&#xff0c;模仿还是超越&#xff1f; ✨第二周 畅想AR 文章目录 系列目录前言AIGCAI写作AI绘画AI视频生成AI语音合成 前言 在此之…

用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections

今天用Navicat进行数据备份的时候&#xff0c;发现由于数据库连接数目过多导致连接锁定&#xff0c;这种情况在多人协同开发的场景中很常见。当然我这里也因为多个应用使用了数据库连接&#xff0c;所以出现了Too Many Connections。 可能是超过最大连接数了。 1、进入Navicat…

AUTOSARCAN-Tp协议

目录 一.单帧、首帧、连续帧、流控帧 单帧传输 SF单帧&#xff1a; 多帧传输 FF&#xff08;首帧&#xff09;&#xff1a; CF&#xff08;连续帧&#xff09;&#xff1a; FC&#xff08;流控帧&#xff09;&#xff1a; 一.单帧、首帧、连续帧、流控帧 CAN诊断由发送端…

MAC ITEM 解决cd: string not in pwd的问题

今天使用cd 粘贴复制的路径的时候,报了这么一个错. cd: string not in pwd eistert192 Library % cd Application Support cd: string not in pwd: Application eistert192 Library % 让人一脸懵逼. 对比一下,发现中文路径里的空格截断了路径 导致后面的路径就没有办法被包含…

视频汇聚/视频云存储/视频监控管理平台EasyCVR启动时打印starting server:listen tcp,该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成&#xff0c;…

模糊测试面面观 | 模糊测试是如何发现异常情况的?

协议模糊测试是一种用于评估通信协议、文件格式和API实现系统安全性和稳定性的关键技术。在模糊测试过程中&#xff0c;监视器扮演着关键角色&#xff0c;它们能够捕获异常情况、错误响应、资源利用等&#xff0c;为测试人员提供有价值的信息&#xff0c;有助于发现潜在漏洞和问…

530. 二叉搜索树的最小绝对差

给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 1&#xff1a; 输入&#xff1a;root [4,2,6,1,3] 输出&#xff1a;1示例 2&#xff1a; 输入&#xff1a;root [1,…

利用python进行视频下载并界面播放快速下载素材

工具&#xff1a;python designer&#xff08;python自带&#xff09;:UI界面设计工具 VLC&#xff1a;视频播放工具 需要的库如下&#xff1a; import os,platform os.environ[PYTHON_VLC_MODULE_PATH] "./vlc-3.0.14" import vlc from 脚本 import Player from …

使用IntelliJ IDEA本地启动调试Flink流计算工程的2个异常解决

记录&#xff1a;471 场景&#xff1a;使用IntelliJ IDEA本地启动调试Flink流计算时&#xff0c;报错一&#xff1a;加载DataStream报错java.lang.ClassNotFoundException。报错二&#xff1a;No ExecutorFactory found to execute the application。 版本&#xff1a;JDK 1.…

python 定时任务 传参 及 之前创建 Python包遇到的问题

一 Python 调度器传参 1.1 按位置传参 注意调 args 设置好之后&#xff0c;使用 scheduler.start() 启动调度器。 # 设置调度器 scheduler BlockingScheduler() # 采用阻塞的方式 # 分拆上传数据模块&#xff0c;上传算法使用的数据 scheduler.add_job(funcup_load_da…