利用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.mzph.cn/news/73934.shtml

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

相关文章

软件测试/测试开发丨ChatGPT:带你进入智能对话的新时代

简介 人工智能时代来临 我们正处于AI的iPhone时刻。——黄仁勋(英伟达CEO) ChatGPT 好得有点可怕了,我们距离危险的强人工智能不远了。——马斯克(Tesla/SpaceX/Twitter CEO) 以上的内容说明我们现在正处于一个技术大…

C# Solidworks二次开发:创建草图文本和创建草图中心线API详解

今天要介绍的是关于如何创建草图文本的API以及创建草图中心线的API,同时把一些连带的API也会和大家介绍一下,依然是满满的干货。 (1)创建草图文本API,InsertSketchText() 这个API的输入参数如下图所示: 一…

RC-u4 相对论大师(bfs求解指定路径)

PTA | 程序设计类实验辅助教学平台 题解&#xff1a; bfs可以求解从根节点到叶子节点的指定路径&#xff0c;这里的vis[]不是为了防止访问到父节点&#xff0c;更多的是为了缩小路径长度&#xff0c;mpp和mp的映射也很巧妙&#xff0c;开始我用的还是map<pair<string,s…

在ros下使用iai_kinect2

source ~/catkin_ws/devel/setup.bash 1、roscore 2、roslaunch kinect2_bridge kinect2_bridge.launch 注意设置launch文件 3、rosrun kinect2_viewer kinect2_viewer 这时候就可以看见rgbd的图像 如何标定&#xff1f;如何建立地图&#xff1f;

Android文件关联

用户需求:Android在系统文件夹找到一个文件想发送自己开发的app进行处理该怎么办? 这时候可以采用两个Activity,一个Activity用作Launcher,一个用于处理发送的文件;具体Activity intent-filter该怎么写了?可以参考下面的代码: <intent-filter><action androi…

eNSP-抓包实验

拓扑结构图&#xff1a; 实验需求&#xff1a; 1. 按照图中的设备名称&#xff0c;配置各设备名称 2. 按照图中的IP地址规划&#xff0c;配置IP地址 3. 使用Wireshark工具进行抓ping包&#xff0c;并分析报文 4. 理解TCP三次握手的建立机制 实验步骤&#xff1a; 1、配置P…

学习MATLAB

今日&#xff0c;在大学慕课上找了一门关于MATLAB学习的网课&#xff0c;MATLAB对于我们这种自动化的学生应该是很重要的&#xff0c;之前也是在大三的寒假做自控的课程设计时候用到过&#xff0c;画一些奈奎斯特图&#xff0c;根轨迹图以及伯德图&#xff0c;但那之后也就没怎…

ROS2下使用TurtleBot3-->SLAM导航(仿真)RVIZ加载不出机器人模型

一、问题描述 在使用台式机进行仿真时&#xff0c;大部分例程很顺利&#xff0c;但在SLAM导航时&#xff0c;在RVIZ中却一直加载不出机器人模型&#xff0c;点击Navigation2 Goal选择目标点进行导航时&#xff0c;无响应。 启动后在RVIZ2和终端看到一个错误 按照官网的指令试…

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

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

ms17-010(永恒之蓝)漏洞复现

目录 前言 一、了解渗透测试流程 二、使用nmap工具对win7进行扫描 2.1 2.2 2.3 2.4 2.5 三、尝试ms17-010漏洞利用 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 四、结果展示 4.1 4.2 4.3 4.4 4.5 总结 前言 ms17-010&#xff08;永恒之蓝&am…

H5游戏开发H5休闲小游戏定制H5软件定制

H5游戏是一种运行在网页浏览器中的HTML5技术开发的游戏。H5休闲小游戏通常具有简单的玩法&#xff0c;易于上手&#xff0c;适合快速的娱乐。以下是开发H5休闲小游戏的一般步骤&#xff1a; 1. 制定游戏开发概念&#xff1a; 确定H5游戏开发的主题和玩法。休闲小游戏通常应该…

插入排序,选择排序,交换排序,归并排序和非比较排序(C语言版)

前言 所谓排序&#xff0c;就是将一组数据按照递增或者递减的方式进行排列&#xff0c;让这组数据变得有序起来。排序在生活中运用的是十分广泛的&#xff0c;各行各业都用到了排序&#xff0c;比如我们在网购的时候就是按照某种排序的方式来选择东西的。所以去了解排序的实现也…

初始化一个Gin框架的Go-Web项目

使用到的第三方库 gin Gin 框架viper 配置文件管理cors 跨域资源请求配置gorm ORM 库zap 日志记录 main 包 Go 语言程序的入口点 main.go 文件 使用 flag 读取配置文件路径参数&#xff0c;默认当前目录下使用 viper 读取 config.ini 配置文件初始化初始数据初始化随机数种子初…

Shell编程中Shift的用法

Shell编程中Shift的用法 位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1&#xff0c;原来的$5现在变成$2等等&#xff0c;原来的$1,$2, 3 , 3, 3,-丢弃&#xff0c;$ 0 不移动。不带参数的shift命令相当于shift 1。 非常有用的 Unix 命令:shift。我们知道&a…

【云原生】Kubeadmin部署Kubernetes集群

目录 ​编辑 一、环境准备 1.2调整内核参数 二、所有节点部署docker 三、所有节点安装kubeadm&#xff0c;kubelet和kubectl 3.1定义kubernetes源 3.2开机自启kubelet 四、部署K8S集群 4.1查看初始化需要的镜像 4.2在 master 节点上传 v1.20.11.zip 压缩包至 /opt 目录…

【Redis】Redis如何保证和MySQL数据库的数据一致性(带你一文了解)

目录 方法一&#xff1a;采用事务 方法二&#xff1a;订阅Mysql的Binlog文件(可借助Canal来进行) 方法三&#xff1a;基于消息队列的同步方案 方法一&#xff1a;采用事务 MySQL 支持事务&#xff0c;在需要保证一致性的操作中使用事务。通过将 Redis 和 MySQL 操作放在同一个…

np.concatenate

np.concatenate函数是numpy库中用来连接两个或多个数组的函数。这里有一个简单的例子演示np.concatenate的用法: ```python import numpy as np # 创建两个一维数组 array1 = np.array([1, 2, 3]) array2 = np.array([4, 5, 6]) # 使用np.concatenate进行连接 result = np.…

【多线程】线程安全 问题

线程安全 问题 一. 线程不安全的典型例子二. 线程安全的概念三. 线程不安全的原因1. 线程调度的抢占式执行2. 修改共享数据3. 原子性4. 内存可见性5. 指令重排序 一. 线程不安全的典型例子 class ThreadDemo {static class Counter {public int count 0;void increase() {cou…

蓝桥杯官网练习题(兰顿蚂蚁)

题目描述 兰顿蚂蚁&#xff0c;是于 1986 年&#xff0c;由克里斯兰顿提出来的&#xff0c;属于细胞自动机的一种。 平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只"蚂蚁"。 蚂蚁的头部朝向为&#xff1a;上下左右其中一方。 蚂蚁的移动规则十分…

Matlab之DICOM(数字图像和通信医学)格式图像数据读取函数dicomread

一、DICOM是什么&#xff1f; DICOM是数字图像和通信医学格式的图像数据&#xff0c;在MATLAB中&#xff0c;可以使用dicomread函数读取DICOM格式的图像数据。 二、dicomread函数 使用方法如下&#xff1a; imageData dicomread(filename);其中&#xff0c;filename表示DI…