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

概述

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

  • 本周遇到了一个日志丢失的问题,经过分析,觉得挺有意思的。向大家分享一下我的分析及解决思路。应该在很多项目中都会有该问题。
  • 领导和我私下讨论过多次,当前的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状态的方式风险较大,建议能够改善优化。

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

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

相关文章

01-制作人和迈克尔杰克逊-《人月神话》中译本纠错及联想

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 2001年,我们翻译《人月神话》的时候,由于水平有限,译文中存在不少错误。 这些年,随着阅历的增长,在重读的时候偶尔也会有“…

msvcp120.dll缺失的解决方法与作用介绍

大家好!我是小编。今天,我想和大家分享一下关于“找不到msvcp120.dll无法继续执行代码的5个解决方法”的话题。 首先,让我们来了解一下msvcp120.dll的作用。msvcp120.dll是Microsoft Visual C Redistributable Package的一部分,它…

JMM并发三大特性

并发和并行 目标都是最大化CPU的使用率 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。 并发(concurrency):指在同一时刻只能有一条指令执行,…

媲美有线操作,支持4KHz响应和无线充电的游戏鼠标,雷柏VT3S上手

对于无线鼠标来说,操作延迟和精度对游戏操作影响很大,常见的游戏鼠标至少都有1KHz的回报率,而雷柏今年已经出了很多支持4KHz回报的鼠标了,像是我现在用的这款VT3S游戏鼠标,就搭载了旗舰级的原相3395引擎,支…

SpringBean的配置详解

Bean的基础配置 例如&#xff1a;配置UserDaoImpl由Spring容器负责管理 <beanid"userDao"class"com.xfy.dao.Impl.UserDaoImpl"></bean> 此时存储到Spring容器中的Bean的beanName是userDao&#xff0c;值是UserDaoImpl&#xff0c;可以根据bea…

pytorch中gather函数的理解

pytorch函数gather理解 torch.gather(input, dim, index, outNone) → Tensor Parameters: input (Tensor) – 源张量dim (int) – 索引的轴index (LongTensor) – 聚合元素的下标(index需要是torch.longTensor类型)out (Tensor, optional) – 目标张量 公式含义 这个函数的…

股票自选(四)

4-自选 自选表功能&#xff0c;均需要使用 Token 令牌进行操作&#xff0c;目的是为了将数据隔离。 添加自选表的作用是进行推送&#xff0c; 将 自选表中的近十天的涨跌幅情况通过邮箱的方式推送给对应的用户。 一. 添加到自选表 接口描述: 接口地址:/StockApi/stockSele…

转录组学习第四弹-数据质控

数据质控 将SRR转为fastq之后&#xff0c;我们需要对fastq进行质量检查&#xff0c;排除质量不好的数据 1.质量检查&#xff0c;生成报告文件 ls *fastq.gz|while read id;do fastqc $id;done并行处理 ls *fastq.gz|xargs fastqc -t 102.生成 html 报告文件和对应的 zip 压缩…

阿里巴巴对裁员谣言报警

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 前两天王自如言论事件&#xff0c;格力选择了报警&#xff0c;称高管遭到姊妹集体侮辱诽谤。 而这两天&#xff0c;阿里巴巴也报警了&#xff0c;原因是网传阿里巴巴要裁员25000人。 咱不公关了…

见证历史!合资车企「最后一搏」

从上海车展&#xff0c;到广州车展&#xff0c;最大的变化莫过于传统合资品牌在新能源及智能电动市场的持续发力。或许&#xff0c;2024年将是最后一搏的拐点。 在本届广州车展上&#xff0c;广汽丰田发布了全新新能源品牌铂智&#xff0c;铂智品牌旗下首款产品铂智4X正式亮相。…

数据结构(c语言版) 树的遍历

作业要求 以如下图为例&#xff0c;完成树的遍历&#xff1a; 1、利用孩子兄弟表示法的存储结构 2、利用先根序列创建树 3、先根遍历树 4、后根遍历树 思考 预期的结果应该为&#xff1a; 1、先根创建树时需要输入的数据为&#xff1a; A B E 0 F 0 0 C 0 D G 0 0 0 0 2、…

Android codec2 视频框架之输出端的内存管理

文章目录 前言setSurfacestart从哪个pool中申请buffer解码后框架的处理流程renderOutbuffer 输出显示 前言 输出buffer整体的管理流程主要可以分为三个部分&#xff1a; MediaCodc 和 应用之间的交互 包括设置Surface、解码输出回调到MediaCodec。将输出buffer render或者rele…

使用JMX监控ZooKeeper和Kafka

JVM 默认会通过 JMX 的方式暴露基础指标,很多中间件也会通过 JMX 的方式暴露业务指标,比如 Kafka、Zookeeper、ActiveMQ、Cassandra、Spark、Tomcat、Flink 等等。掌握了 JMX 监控方式,就掌握了一批程序的监控方式。本节介绍 JMX-Exporter 的使用,利用 JMX-Exporter 把 JMX…

win11,无法修改文件的只读属性,解决办法

在尝试更改文件或文件夹的权限时&#xff0c;您可能经常会遇到错误 - 无法枚举容器中的对象访问被拒绝。 虽然作为管理员&#xff0c;您可以更改访问权限&#xff0c;但有时即使是管理员也可能会遇到相同的错误消息。 这是一个常见错误&#xff0c;通常由不同论坛上的用户提出…

【云原生-Kurbernetes篇】HPA 与 Rancher管理工具

文章目录 一、Pod的自动伸缩1.1 HPA1.1.1 简介1.1.2 HPA的实现原理1.1.3 相关命令 1.2 VPA1.2.1 简介1.2.2 VPA的组件1.2.3 VPA工作原理 1.3 metrics-server简介 二、 HPA的部署与测试2.1 部署metrics-serverStep1 编写metrics-server的配置清单文件Step2 部署Step3 测试kubect…

Python数据结构基础教学,从零基础小白到实战大佬!

文章目录 前言 Python有那几种数据结构&#xff1f;1)列表&#xff08;list)1.1 什么是列表&#xff1f;1.2列表的增删改查 2&#xff09;字典&#xff08;Dictionary)2.1 什么是字典&#xff1f;2.2 字典的增删改查 3&#xff09;元组&#xff08;Tuple)4)集合&#xff08;Set…

STM32通用定时器产生PWM信号

STM32通用定时器产生PWM信号 PWM信号stm32定时器PWM生成模式PWM配置基本步骤PWM周期计算CubeMX配置代码展现 本期内容我将展示使用STM32通用定时器产生PWM信号&#xff0c;这里以定时器3通道3为例 PWM信号 如果还不懂的话&#xff0c;可以看看 &#xff1a; “蓝桥杯单片机学习…

SSM框架(一):Spring 容器

文章目录 一、Spring Framework系统框架二、IoC控制反转 与 DI依赖注入 简单入门三、Bean3.1 Bean的配置3.2 实例化Bean的四种方式3.3 Bean的生命周期 四、依赖注入4.1 setter注入4.2 构造器注入4.3 注入方式选择4.4 依赖自动装配4.5 集合注入4.6 案例&#xff1a;配置数据库4.…

Android加固为何重要?很多人不学

为什么要加固&#xff1f; APP加固是对APP代码逻辑的一种保护。原理是将应用文件进行某种形式的转换&#xff0c;包括不限于隐藏&#xff0c;混淆&#xff0c;加密等操作&#xff0c;进一步保护软件的利益不受损坏。总结主要有以下三方面预期效果&#xff1a; 1.防篡改&#x…

JSP在线商城系统eclipse定制开发mysql数据库BS模式java编程B2C

一、源码特点 java 在线商城系统是一套完善的web设计系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使用…