细节决定成败——我的日志去哪了?

news2024/11/16 11:36:41

概述

编写本文档的目的有两点。

  • 本周遇到了一个日志丢失的问题,经过分析,觉得挺有意思的。向大家分享一下我的分析及解决思路。应该在很多项目中都会有该问题。
  • 领导和我私下讨论过多次,当前的autodomain代码对文件读取的频率太高了,如何去避免这种资源的消耗。本文档也会给出参考解决方案。

问题复现流程—我的日志去哪了?

问题现象

        周三,长城项目提出了一个bug:升级包下载时,断电重启设备,会导致车机处于断电重连界面卡死,无法恢复

        通过UE同事日志排查,界面卡住的原因是由于,重启后,UC反馈给UE 的状态机为downloading。所以车机界面会处于下载中,但UC没有通知下载进度(实际没有下载任务在进行,肯定不会抛进度给UE的),所有界面一直卡着,没有响应。

图一:UE同事的分析结果

        根据巧玲的分析,已经很到位了。问题在于:为什么重启之后,UC发过来的状态是下载中,而不是下载暂停

问题分析及解决

        我们的代码框架中,OTA服务主控程序UC的初始化流程有一个状态机处理接口。用于处理重启前状态机,其中的一个逻辑:若当前状态机是downloading,且当前任务是常规任务,则将状态机置为downloadpause。并且这个逻辑是必然会走的。为什么我们反馈给UE downloading的状态呢?

猜测一:UE请求的FSM状态的时序发生错乱

        UE向UC获取FSM状态的时机,在UC初始化之前。此时FSM的状态还是重启前的downloading,因此UE获取到的状态为downloading。时序图如下:

图二:UE请求状态机时序错乱

        这种情况是存在的(因此代码逻辑上还是存在缺陷的,需要修改)。但是真实原因并不是该原因。因为,根据时序分析,最终FSM的状态会变成downloadpause。但实际上FSM的状态机一直处于downloading。

猜测二:分区挂载时序问题

        在我一筹莫展时,我发现了一个奇怪的现象。那就是我们UC版本号打印去哪了?

图三:UC初始化流程,版本号打印

        理论上,UC的版本号是必然会进行打印的。但是我通过日志排查,很多重启流程中,并没有该log打印。原因是什么呢?经过长时间的思考,怀疑到了分区挂载时序问题。

图四:长城车机的分区挂载信息

        上图中,我们可以得出,UC的缓存文件以及日志都是在/dev/block/mmcblk0p23文件系统中。那么是否可能是因为分区挂载实际滞后于UC初始化流程导致的呢?

图五:分区挂载时序异常

        抱着这样的猜测,我在UC代码中添加了该判断:若mmcblk0p23分区未挂载成功,则睡眠10秒,尝试10次。

图六:等待分区加载成功代码逻辑

        经过同事验证,问题终于解决了。并且UC遗失的日志,都完整记录在日志文件中了。

3. 思考,再思考

        本次暴露出来的问题,已经成功解决掉了。但是若再进一步思考,会发现本次问题的根因不是分区加载时序问题,而是分区加载后导致我们的状态机文件被修改导致的

若用户恶意去修改我们的缓存文件或者其它原因,我们的缓存文件被修改了,一样会出现问题。

        如何从技术上解决这样的难题呢?我想到了互联网经常会用到的一个技术:内存数据库。知乎上有一篇文章写的很好,供参考:

缓存和数据库一致性问题,看这篇就够了 - 知乎 (zhihu.com)

        通过文章的阅读,了解到内存缓存的引入需要考虑并发分布锁延迟双删等技术。但是对于我们的业务真的需要吗?我们知道互联网涉及的的访问量及数据是巨大的。但是我们UC的业务很简单,并不涉及到并发(只有UC会进行修改文件内容)。因此我总结出以下方案。

方案一

  1. UC启动时。将磁盘中的数据全量同步至内存中。
  2. read操作。从内存中读取,直接反馈。
  3. write操作。先更新缓存,再同步至磁盘。

        这样我们避免在运行过程中,文件内容进行修改。导致流程异常。并且拥有磁盘文件自我恢复的能力

缺点:

  • 浪费内存。即使OTA处于空闲状态,我们依旧需要将缓存文件中的全量信息保存到内存中。(虽然可能不到100kb)
  • 若不存在write操作。磁盘文件就不会恢复。

优化方案,增加以下两条属性

  • 为缓存信息增加时效性。当较长时间内没有进行访问的数据,我们可以同步到磁盘中,并从内存中删除。
  • 定期同步内存至磁盘。

        以上仅是我当前提出的一种解决方案,相信肯定还存在一些遗漏,考虑不全面的地方,需要大家提出来,我们一起讨论。但是引入内存缓存的方式,我觉得是趋势所向。

4. 总结

通过该bug的分析过程。得出的经验如下:

  1. 平时发现的异常,应该要及时去分析。

     最初在调试长城其它问题时,我就已经注意到部分启动日志没有打印的情况了。当时咨询过同事,说是安卓系统的原因,就没有深究了。现在想想,若是当时就去研究,提早发现问题,并解决。也不至于在项目收尾阶段再暴露出来,从而影响项目进度。所以,人不能偷懒,欠下的债最终会兜兜转转到自己身上的。哈哈~~~

       2. 依赖写文件记录OTA状态的方式风险较大,建议能够改善优化。

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

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

相关文章

Binlog 太大导致无法解析怎么办?

由于业务写入了一条大事务,导致 MySQL 的 binlog 膨胀。在解析大的 binlog 时,经常会遇到这个问题,导致无法解析,没有其他工具的情况下,很难分析问题。 作者:孙绪宗,新浪微博 DBA 团队工程师&am…

【Python】可再生能源发电与电动汽车的协同调度策略研究

1 主要内容 之前发布了《可再生能源发电与电动汽车的协同调度策略研究》matlab版本程序,本次发布的为Python版本,采用gurobi作为求解器,有需要的可以下载对照学习研究。 首先详细介绍了优化调度模型的求解方案,分别采用二次规划…

透视maven打包编译正常,intellj idea编译失败问题的本质

前言 maven多模块类型的项目,在Java的中大型应用中非常常见, 在 module 很多的情况,经常会出现各种各样的编辑依赖错误问题,今天记录一种比较常见的 case : A 子模块依赖 B 子模块,在 Terminal 上终端上 …

LLM之Prompt(二):清华提出Prompt 对齐优化技术BPO

论文题目:《Black-Box Prompt Optimization: Aligning Large Language Models without Model Training》 论文链接:https://arxiv.org/abs/2311.04155 github地址:https://github.com/thu-coai/BPO BPO背景介绍 最近,大型语言模…

Tomcat 9.0.54源码环境搭建

一. 问什么要学习tomcat tomcat是目前非常流行的web容器,其性能和稳定性也是非常出色的,学习其框架设计和底层的实现,不管是使用、性能调优,还是应用框架设计方面,肯定会有很大的帮助 二. 运行源码 1.下载源…

8.2 Windows驱动开发:内核解锁与强删文件

在某些时候我们的系统中会出现一些无法被正常删除的文件,如果想要强制删除则需要在驱动层面对其进行解锁后才可删掉,而所谓的解锁其实就是释放掉文件描述符(句柄表)占用,文件解锁的核心原理是通过调用ObSetHandleAttri…

【前端】vue中合并表格行

做平台功能时&#xff0c;遇到一个需求是需要将表格某列有相同值时进行合并展示&#xff0c;比如 1、通过在Element中得知需要在表格中增加span-method方法 <el-table:data"tableData":span-method"cellMerge"borderstyle"width: 100%; margin-to…

LeetCode算法心得——打家劫舍(记忆化搜索)

大家好&#xff0c;我是晴天学长&#xff0c;准备开始深入动态规划啦&#xff0c;先从记忆化搜索开始&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃…

如何选择适合的开源框架来构建微服务架构?

随着科技的飞速发展&#xff0c;云计算和大规模应用的需求日益显著&#xff0c;这促使微服务架构在软件开发领域中占据了主流地位。微服务架构的广泛应用为开发人员提供了灵活性、可伸缩性和高可用性&#xff0c;从而推动了快速的应用程序开发。然而&#xff0c;在构建微服务架…

React函数组件渲染两次

渲染两次是因为react默认开启了严格模式 React.StrictMode标签作用&#xff1a; 1、识别不安全的生命周期 2、关于使用过时字符串 ref API 的警告 3、关于使用废弃的 findDOMNode 方法的警告 4、检测意外的副作用 5、检测过时的 context API 注释掉React.StrictMode即为关闭严…

2024测试工程师必学系列之Jmeter(36):jmeter对图片验证码的处理

jmeter对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 通过jmeter对图片验证码…

【蓝桥杯省赛真题44】Scratch像素画板 蓝桥杯少儿编程scratch图形化编程 蓝桥杯省赛真题讲解

scratch像素画板 第十四届青少年蓝桥杯scratch编程省赛真题 一、题目要求 编程实现 1.点击绿旗,角色、背景如图所示(三种颜色调色盘、清除图标及方格角色请自行创建,点击绿旗后立刻呈现下图效果); 2.用鼠标点击红色调色盘,红色调色盘变为选中状态(如下图所示),此时鼠…

实战 | SQL注入漏洞

在页面参数增加 and -1-1&#xff0c;页面回显正常 这里如果 and 11 会被拦截 然后尝试-1-2 页面报错&#xff0c;此处存在数字型sql注入漏洞 接下来就是查字段数 order by 1 页面依旧报错 如果大家在渗透的时候遇到这种情况 要考虑是不是某些参数被拦截等 换一种思路&#xf…

SQL常见函数整理 —— lead()向下偏移

1. 用法 是在窗口函数中使用的函数&#xff0c;它用于获取当前行的下一行&#xff08;后一行&#xff09;的某个列的值。具体来说&#xff0c;LEAD() 函数可用于查找任何给定行的下一行&#xff08;后一行&#xff09;的值&#xff0c;同时也可控制行数偏移量&#xff08;offse…

ChainLight zkSync Era漏洞揭秘

1. 引言 ChainLight研究人员于2023年9月15日&#xff0c;发现了zkSync Era主网的ZK电路的一个soundness bug&#xff0c;并于2023年9月17日&#xff0c;向Matter Labs团队报告了该问题。Matter Labs团队修复了该问题&#xff0c;并奖励了ChainLight团队5万USDC——为首个zkSync…

用Auth Analyzer插件批量测试接口越权,安全测试快人一步!

随着信息化技术的不断发展&#xff0c;软件安全成了软件行业的重大挑战&#xff0c;因此安全测试也成为了测试人员必备的技能之一。 沐沐在安全测试过程中较为常见的就是接口越权漏洞&#xff0c;在尝试过多种工具进行越权漏洞测试后&#xff0c;最终找到了个人认为最便捷最有…

ModBus TCP/RTU 报文解析

Modbus Tcp https://gitee.com/szwzhsz/Modbus-TCP-client-server-DotNetty.?_fromgitee_search 固定协议格式 事务标识(2byte)&#xff1a;00 00&#xff0c;可变(递增) 协议标识(2byte)&#xff1a;00 00&#xff0c;固定 长度(2byte)&#xff1a;00 06&#xff0c;可变 单…

【GUI】-- 10 贪吃蛇小游戏之静态面板绘制

GUI编程 04 贪吃蛇小游戏 4.1 第一步&#xff1a;先绘制一个静态的面板 首先&#xff0c;需要新建两个类&#xff0c;一个StartGame类作为游戏的主启动类&#xff1b;一个GamePanel类作为游戏的面板类。此外&#xff0c;再新建一个Data类作为数据中心(存放了小蛇各部分图像的…

目标文件(ELF格式)

1.linux中有三类目标文件 **&#xff08;1&#xff09;可重定位目标文件&#xff08;.o或者.a&#xff09;&#xff1a;**包含二进制代码和数据&#xff0c;其形式可以和其他目标文件进行合并&#xff0c;创建一个可执行目标文件。&#xff08;.a文件是由很多个.o文件的集合&a…

解决uncompyle6反编译报错KeyError

报错内容&#xff1a;KeyError&#xff1a;3.11.0 &#xff08;这个是我自己的Python版本号&#xff09; 主要原因就是你的Python版本没在它库文件支持的版本里&#xff0c;我们需要进行手动添加即可。 首先找到文件&#xff1a;magics.py 我的是在这个路径下&#xff1a;D:\…