【案例分析】入职第一天,如何让同事对我刮目相看

在这里插入图片描述

背景

在办理入职的第一天,遇到测试同事无奈且慌张的报出一个问题:拷机过程中,stTsp进程重启了。可能因为大家都比较忙,也可能因为面试过程中,我说自己比较喜欢解决问题。领导就让我帮忙一起看看。

呃,此时我的内心…🤦🏻🤦🏻🤦🏻

毕竟刚进入团队,心想show一下power 似乎也可以。最终在两天内,解决了这个遗留问题。本文主要向大家分享我如何在快速定位问题,以及解决问题的思路,若对您有帮助,还请点赞收藏🫶🏻。

了解问题背景及复现流程

在分析问题前,一定要了解问题的现象,以及背景。于是我和测试人员经过详细沟通,该问题大致可以为这样描述。

  1. 在拷机的过程中,容易在夜间12点crash。
  2. 这个问题在年前就出现过,研发人员修改了一个版本后,依然存在。

通过与测试人员的沟通,根据经验,我大致有以下的排查思路。

  1. 容易在12点触发现象。通过该描述,我会怀疑是否存在类似这样的任务:每天凌晨做特定的操作,而该相关操作,导致进程crash。
  • 判断方式:打开linux的coredump选项,若是进程代码导致crash,则会生成core文件。
  1. 拷机过程。一般拷机过程,都是伴随着运行时间的增加,因为运行时间增加,而导致进程异常的情况,第一个想到的就是内存泄漏了。
  • 判断方式:通过系统日志查看,是否触发OOM机制,导致系统kill进程。

于是通过dmesg命令,查看系统日志。经过分析的确是因为OOM机制导致的,如下图:

因此方向确定:进程内存泄漏,触发系统的OOM机制,将其kill

验证流程

验证内存泄漏的最好方式,当然是用valgrind工具。关于valgrind工具的使用方式,可参考我的博客valgrind跨平台调试及其问题分析。经过使用valgrind 调试,的确存在内存泄漏的情况,但是并没有随着时间的增加而逐步增加,这就让我很奇怪。

并且随着与研发同事沟通,了解到了另一个背景:设备中有一个守护进程processMgr,它的功能如下:

  1. 软看门狗。周期性等待应用程序喂狗,若超时,则认为进程阻塞,kill -9杀死进程。
  2. 守护进程。周期性查看列表进程是否存在,若不存在,则重启拉起。
  3. 资源监控。周期性查看进程使用内存容量,若超过预期值,则kill -9杀死进程。

注:其中周期为3秒

这就基本推翻了我之前的猜想:随着时间的增加,导致stTsp进程的内存泄漏越来越多,最终触发系统OOM机制。因为进程stTsp的内存资源上限是8MB,最终触发OOM时,系统提示stTsp的内存占用,已经高达72MB。

于是方向就改为:短时间内,执行了需要大内存的操作,比如申请了超大的内存

继而之,咨询了相关同事,了解到一个周期删除数据表的功能,其需求流程大致如下:

  1. 将CAN通道上的数据,按照YY-MM—DD的规则,建立数据库表格,并保存表中。即将一天的can数据保存到数据库表中。
  2. 周期(一小时)判断数据库中的表,是否超过7个,若超过7个,则删除较早的表格。实现can数据保存7天的需求。

通过该功能描述,也就说明了为什么总是在凌晨12点多触发,并且也基本确认是删除数据库表的相关操作导致的内存急剧增加

于是走读删除数据表的代码逻辑,大致流程如下:

  1. 删除过期的表
  2. 回收数据库空间

简单分析了代码,怀疑是回收数据库动作,导致内存急剧的增加。之后通过走读sqlite3开源库,发现其对VACUUM的命令注释如下:

/*
** The VACUUM command is used to clean up the database,
** collapse free space, etc.  It is modelled after the VACUUM command
** in PostgreSQL.  The VACUUM command works as follows:
**
**   (1)  Create a new transient database file
**   (2)  Copy all content from the database being vacuumed into
**        the new transient database file
**   (3)  Copy content from the transient database back into the
**        original database.
**
** The transient database requires temporary disk space approximately
** equal to the size of the original database.  The copy operation of
** step (3) requires additional temporary disk space approximately equal
** to the size of the original database for the rollback journal.
** Hence, temporary disk space that is approximately 2x the size of the
** original database is required.  Every page of the database is written
** approximately 3 times:  Once for step (2) and twice for step (3).
** Two writes per page are required in step (3) because the original
** database content must be written into the rollback journal prior to
** overwriting the database with the vacuumed content.
**
** Only 1x temporary space and only 1x writes would be required if
** the copy of step (3) were replaced by deleting the original database
** and renaming the transient database as the original.  But that will
** not work if other processes are attached to the original database.
** And a power loss in between deleting the original and renaming the
** transient would cause the database file to appear to be deleted
** following reboot.

由其注释可知,VACUMM命令会存在以下几点问题:

  1. 磁盘要求高。因为需要创建新的临时数据库,导致某时刻需要的最大磁盘空间是原始数据库的2倍。比如:要回收一个2GB的数据库,若要成功执行VACUMM命令,则至少需要剩余2GB的空余磁盘空间。
  2. 数据库拷贝过程,可能涉及大内存的申请,容易导致OOM。

最终经过讨论之后,我们决定不再执行回收数据的动作,似乎也是可以的。原因如下:

  1. 经过压测,一张表的CAN数据量大概是200MB,7天的表格也就是1.4BG。
  2. 当保存第8天的表格时,我们删除最早一天的表格,即使不做数据库回收命令。此时数据库会认为day1的表格已经被释放,其文件内容是可以被覆盖的。因此磁盘大小也不会一直增加。

通过测试验证,最终问题解决。

疑问:

其实到这里,问题似乎已经解决了。但是困扰了我一个问题:那就是数据库拷贝为什么会导致内存急剧增加呢?

按照我的理解,若是将数据库文件拷贝成另一个数据库,简单理解就是文件的拷贝,关于文件的拷贝,我们一般思路都是:

  1. 申请一块buff,一般为4KB
  2. 读取old 数据库,写入临时数据库

简单的逻辑为什么会引起内存的极度增加呢?于是怀着疑问,我走读了sqlite3RunVacuum接口内容。发现了一个特殊的步骤,那就是sqlite是通过select语句进行表的拷贝,如下:

因此,我怀疑内存的增加,应该就是select语句导致的。因为数据库的每一张表的内容很大。若select的查询集很大,那么就需要很大的内存用于保存查询结果,以及使用内存数据库等,最终导致stTsp的内存超过系统承受范围。

因此使用sqlite3数据库时,应该根据系统资源的容量,通过sqlite3_hard_heap_limit64接口设置数据库使用内存上限。

总结

通过本文的分享,希望能让大家遇到crash问题时,不至于手忙脚乱,任何问题都有套路可言,在于每个人去总结,以下便是我个人的经验:

  1. 确认是进程自己触发crash,还是系统触发。
  2. 若是程序自己触发,可以通过打开系统的coredump属性,待生成core文件时,进行gdb分析。关于gdb的使用,可以参考我的文章【小白进阶】Linux 调试大法——gdb。(打开程序的调试选项-gnot strip
  3. 若是系统触发,一般是因为触发了OOM机制。如果内存会随着时间逐步增加,一般就是存在内存泄漏了,最简便的方式就是使用valgrind工具,运行一段时间,查看内存泄漏点;若不是逐步增加,一般是因为某个操作导致的内存急剧增加。这个可以根据日志打印,逐步定位相关代码,进行修改。

希望本文能够对您有所收获,不要忘记点赞收藏哦哦👍🏻。

若我的内容对您有所帮助,还请关注我的公众号。不定期分享干活,剖析案例,也可以一起讨论分享。
我的宗旨:
踩完您工作中的所有坑并分享给您,让你的工作无bug,人生尽是坦途。

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

配置java8和java11以及输入version命令没反应问题

电脑重置重新安装java8和java11记录一下供自己观看 安装过程掠过我自己能看懂就行 需要记录一下 因为JDK11以后Oracle把JRE集成到了JDK中,在安装JDK11及更高版本的JDK时,默认是不会自动安装JRE的。在jdk11的安装目录下打开命令行窗口或者shift鼠标右键…

异步处理 (vue async和await)

出现这种情况可以是加载顺序的问题,加载没有完成就是显示数据了 试试 async和await async beforeOpen(done, type) {if (["edit", "view"].includes(type)) {await getDetail(this.form.id).then((res) > {this.form res.data.data;conso…

了解Spring:Java开发的利器

Spring是一款开源的轻量级Java开发框架,旨在提高开发人员的效率和系统的可维护性。本文将介绍Spring的基本概念、使用优势、设计模式以及与Spring MVC和Spring Boot的关联。 什么是Spring? Spring是一款开源的轻量级Java开发框架,它由多个模…

购买腾讯云服务器需要多少钱?价格表查询

腾讯云服务器多少钱一年?61元一年起。2024年最新腾讯云服务器优惠价格表,腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…

APP信息收集思路总结(反代理,反虚拟机,反证书校验思路整理)

前言 本文是我在学习过程中的总结,希望可以被指导提议指正。 APP概况 app跟一个网站很像。 网站分为前端后端。 app就好像网站的前端一样,app不需要浏览器,而前端需要浏览器。 他们都需要服务器,也就是说,进行we…

bevformer转模型经验(需要时序tranformer所有模型都可以参考)

先上bevformer的网络结构图 不难发现,他有两个输入。当前的环视图和历史bev。历史bev是通过历史环视图生成的。也就是说在生成bev特征提取模型这部分被使用了两次。在装模型时候,需要作以下工作: 1 bev特征提取模型单独提出来,转…

win多开微信

有时候需要在win下多开微信,但是微信又不支持这个功能。 正常情况下,当微信弹出登录对话框时,再次点击微信exe,此时不会再弹出一个新的微信对话框,估计微信是做了只弹一个窗的判断。但是,有时点击微信时&a…

哪本书最了解孩子?跟《米小圈上学记》一起做孩子的“引路人”!

孩子是发展中的人,需要家长的陪伴,孩子的身心发展是有规侓的,是处于发展过程中的人。我们要学会尊重孩子的发展,从兴趣出发,关注孩子的成长。但是,家长不可能无时无刻都能陪在孩子身边,他需要一…

es bulk批量操作简单实例

(1)定义 bulk允许在单个步骤中进行多次create、index、update或delete请求。 bulk与其他的请求体格式稍有不同,如下所示: { action: { metadata }}\n { request body }\n { action: { metadata }}\n { request body …

element-plus中el-table利用复选框删除当前行

思路:1.利用复选框的selection-change事件来监听复选框发生的变化,触发该事件 2.给删除添加点击事件,定义一个空数组,通过forEach()方法遍历tableData数据,使用filter()方法来过滤掉未选中行数,将过滤出来的…

java-基于springboot+vue实现的旅游信息管理系统功能介绍

开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog 项目关键技术 1、JSP技术 JSP(Java…

苍穹外卖笔记

苍穹外卖 DAY01nginx反向代理MD5加密yapi进行接口导入Swagger介绍 DAY02新增员工需求分析和设计写相关代码测试(1. 后端文档测试 2. 前后端联调代码完善 员工分页查询DAY01 02涉及到的知识 DAY01 nginx反向代理 MD5加密 拓展:spring security jwt 提供了更强大灵…

新能源汽车充电桩消防安全视频智能可视化监管建设方案

一、方案背景 据应急管理部门统计公布的数据显示,仅2023年第一季度,新能源汽车自燃率就上涨了32%,平均每天就有8辆新能源汽车发生火灾(含自燃)。在已查明起火原因中,58%源于电池问题,19%源于碰…

摘录笔记——2024年3月22日

目录 一、背景 1.1 新人的选择困局 1.2 高人才密度环境下普通员工的成长效率困局 1.3 业务发展和个人成长的二元对立困局 1.4 中年打工人低费效比引发的职场生涯终结困局 二、人的本质 2.1 人的本质的定义 2.2 由“人的本质”引出的几个关键过程 2.2.1 认知指引实践&a…

常用类一(包装类)

目录 基本数据类型的包装类 包装类基本知识 包装类的用途 自动装箱和拆箱 自动装箱: 自动拆箱: 包装类的缓存问题 基本数据类型的包装类 八种基本数据类型并不是对象,为了将基本类型数据和对象之间实现互 相转化,JDK 为每一…

【新手教程】mmselfsup训练教程及常见报错处理

mmselfsup教程 1.安装mmselfsup2.了解文件结构与配置3.训练常见报错1.报错:FileNotFoundError: [Errno 2] No such file or directory:data/imagenet/train/./train/n04311004/images/n04311004_194.JPEG2.报错:报错ImportError: /mmcv/_ext.cpython-38-…

面试官:小伙子知道synchronized的优化过程吗?我:嘚吧嘚吧嘚,面试官:出去!

写在开头 面试官:小伙子,多线程中锁用过吗? 我:那是自然! 面试官:那你知道synchronized的优化吗? 我:synchronized作为重锁,开销大,在早期不被推荐使用&…

蓝桥杯练习04学生成绩统计

学生成绩统计 介绍 随着大数据的发展,数据统计在很多应用中显得不可或缺,echarts作为一款基于JavaScript的数据可视化图表库,也成为了前端开发的必备技能,下面我们一起来用echarts开发一个学生数据统计的柱形图。 准备 开始答…

leetcode LCR121.寻找目标值-二维数组

目录 问题描述示例具体思路思路一思路二 代码实现 问题描述 m*n 的二维数组 plants 记录了园林景观的植物排布情况,具有以下特性: 每行中,每棵植物的右侧相邻植物不矮于该植物; 每列中,每棵植物的下侧相邻植物不矮于该…

狂卷java基础八股

equals和的区别 和equals都是进行一个数据的对比的。 但是如果是在进行的对象的对比的时候。 对比的就是对象的一个地址,但是equals是比较对方具体的值。 hashcode和equals 如何进行使用:靠反射。 java代理模式的实现: 静态代理&#xff1…