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

概述

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

  • 本周遇到了一个日志丢失的问题,经过分析,觉得挺有意思的。向大家分享一下我的分析及解决思路。应该在很多项目中都会有该问题。
  • 领导和我私下讨论过多次,当前的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.mzph.cn/news/155349.shtml

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

相关文章

Spring框架学习 -- 核心思想

目录 (1) Spring是什么? (2) 什么是IOC容器? (3) 从传统开发认识spring (4) 这种传统开发的缺陷 (5)解决传统开发中的缺陷 (6) 对比总结规律 (7) 理解IOC 创作不易多多支持 (1) Spring是什么? 我们常说的Spring的全称是: Spring Framework(Spring框架), 它是一个开源…

北醒携全球首款256线车规量产激光雷达亮相广州国际车展

11月17日,北醒携全球首款256线车规量产激光雷达亮相广州国际车展。在车展期间,北醒还公布了与广州花都区人民政府达成投资合作,获滴滴自动驾驶投资以及与捷普联合打造的全球首条量产256线级别车规激光雷达的生产线即将贯通的等多条利好信息&a…

2023-11-20 LeetCode每日一题(最大子数组和)

2023-11-20每日一题 一、题目编号 53. 最大子数组和二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的…

C语言童年生活二三事(ZZULIOJ1091:童年生活二三事(多实例测试))

题目描述 Redraiment小时候走路喜欢蹦蹦跳跳,他最喜欢在楼梯上跳来跳去。 但年幼的他一次只能走上一阶或者一下子蹦上两阶。 现在一共有N阶台阶,请你计算一下Redraiment从第0阶到第N阶共有几种走法。 输入:输入包括多组数据。 每组数据包括一…

Python开源自动化工具Playwright安装及介绍

一个非常强大的自动化项目叫 playwright-python 它支持主流的浏览器,包含:Chrome、Firefox、Safari、Microsoft Edge 等,同时支持以无头模式、有头模式运行,并提供了同步、异步的 API,可以结合 Pytest 测试框架 使用&…

Kafka(四)消费者消费消息

文章目录 如何确保不重复消费消息?消费者业务逻辑重试消费者提交自定义反序列化类消费者参数配置及其说明重要的参数session.time.ms和heartbeat.interval.ms和group.instance.id增加消费者的吞吐量消费者消费的超时时间和poll()方法的关系 消费者消费逻辑启动消费者…

万宾科技智能井盖传感器,提升市政井盖健康

市政井盖就是城市里不可或缺的基础设施之一,关于它的监测工作可马虎不得。它承载着保护市民的交通安全以及城市正常运转的重要使命。虽然现在城市化的速度很快,但是传统的市政井盖管理方式变得有些力不从心了。井盖的覆盖范围很广,如果单单依…

Python 安装win32com失败

今天进行服务器迁移, 中间有用的python调用win32com组件让docx转换成pdf。不出意外的话出意外了,pip安装win32com的时候各种安装不上, 今天处理完问题之后,记录一下,与人方便与己方便。 在cmd上面,一开始…

【0235】修改私有内存(private memory)中的MyBEEntry时,st_changecount值前后变化

上一篇: 【0234】PgBackendStatus 记录当前postgres进程的活动状态 1. pg_stat_activity中xxx实时信息如何实现? 客户端(eg:psql)在连接上postmaster之后,postmaster守护进程会fork()一个后端进场(backend process),之后此客户端的所有操作、交互均有此对应的Backen…

智慧安防监控系统EasyCVR(v3.4)开放协议的介绍及使用

安防视频监控系统EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台可拓展性强、视频能力灵活,能…

2023最新软件测试20个基础面试题及答案

什么是软件测试? 答案:软件测试是指在预定的环境中运行程序,为了发现软件存在的错误、缺陷以及其他不符合要求的行为的过程。 软件测试的目的是什么? 答案:软件测试的主要目的是保证软件的质量,并尽可能大…

Kotlin 核心语法,为什么选择Kotlin ?

Kotlin 是一个基于 JVM 的新的编程语言,由 JetBrains 开发。与Java相比,Kotlin的语法更简洁、更具表达性,而且提供了更多的特性。 Kotlin是使用Java开发者的思维被创建的,Intellij作为它主要的开发IDE。对于 Android开发者&#…

Docker基础知识总结

文章目录 1.Docker介绍2.Docker版本3.为什么要使用Docker4.Docker基础组件4.1 镜像(Images)4.2 容器(Container)和仓库(Repository) 5.Docker安装6.Docker run7.Dockerfile8.Docker commit9.镜像发布到镜像…

肖sir__linux讲解vim命令(3.1)

vim 命令 一、 vi/vim 编辑器共分为三种模式: 格式 :vim 文件名 命令模式(Command mode),“ESC”或ctrlc键 输入模式(Insert mode) 底线命令模式(Last line mode) …

亚马逊运营一定要用动/静态住宅IP代理吗?

作为全球最大的电商平台之一,亚马逊已经成为许多商家的首选销售平台。而代理IP作为近几天互联网的热门工具,在跨境电商界也起着非常强大的作用。那么在亚马逊运营中,适合动态住宅代理还是静态住宅代理呢?下面我们一起来探索&#…

猫罐头牌子哪个好一点?精选5款口碑好的猫罐头推荐!

猫罐头牌子哪个好一点?选择猫罐头是十分重要的事情,千万不能将就。因为,好的猫罐头不仅可以营养丰富,水分充足,适口性好,还能易吸收。而一旦选择错误,不仅无法达到上述效果,还可能产…

代码随想录算法训练营第28天|93.复原IP地址 78.子集 90.子集II

JAVA代码编写 93 .复原IP地址 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 . 分隔。 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址&…

申银万国期货通过ZStack Cube信创超融合一体机打造金融信创平台

信创是数字中国建设的重要组成部分,也是数字经济发展的关键推动力量。作为云基础软件企业,云轴科技ZStack产品矩阵全面覆盖数据中心云基础设施,ZStack信创云首批通过可信云《一云多芯IaaS平台能力要求》先进级,是其中唯一兼容四种…

基于单片机仓库温湿度监测报警系统仿真设计

**单片机设计介绍,基于单片机仓库温湿度监测报警系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的仓库温湿度监测报警系统可以被设计成能够实时监测仓库内的温度和湿度,并根据预设…

ssm青少年航天知识科普网站-计算机毕设 附源码59487

青少年航天知识科普网站 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中&am…