3D特效做首页的网站,建站公司还行吗,xml的文档打开乱码程序打开,建设房地产公司网站的费用概述
编写本文档的目的有两点。
本周遇到了一个日志丢失的问题#xff0c;经过分析#xff0c;觉得挺有意思的。向大家分享一下我的分析及解决思路。应该在很多项目中都会有该问题。领导和我私下讨论过多次#xff0c;当前的autodomain代码对文件读取的频率太高了,如何去避…概述
编写本文档的目的有两点。
本周遇到了一个日志丢失的问题经过分析觉得挺有意思的。向大家分享一下我的分析及解决思路。应该在很多项目中都会有该问题。领导和我私下讨论过多次当前的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会进行修改文件内容。因此我总结出以下方案。
方案一
UC启动时。将磁盘中的数据全量同步至内存中。read操作。从内存中读取直接反馈。write操作。先更新缓存再同步至磁盘。 这样我们避免在运行过程中文件内容进行修改。导致流程异常。并且拥有磁盘文件自我恢复的能力。
缺点
浪费内存。即使OTA处于空闲状态我们依旧需要将缓存文件中的全量信息保存到内存中。虽然可能不到100kb若不存在write操作。磁盘文件就不会恢复。
优化方案增加以下两条属性
为缓存信息增加时效性。当较长时间内没有进行访问的数据我们可以同步到磁盘中并从内存中删除。定期同步内存至磁盘。 以上仅是我当前提出的一种解决方案相信肯定还存在一些遗漏考虑不全面的地方需要大家提出来我们一起讨论。但是引入内存缓存的方式我觉得是趋势所向。
4. 总结
通过该bug的分析过程。得出的经验如下
平时发现的异常应该要及时去分析。 最初在调试长城其它问题时我就已经注意到部分启动日志没有打印的情况了。当时咨询过同事说是安卓系统的原因就没有深究了。现在想想若是当时就去研究提早发现问题并解决。也不至于在项目收尾阶段再暴露出来从而影响项目进度。所以人不能偷懒欠下的债最终会兜兜转转到自己身上的。哈哈~~~ 2. 依赖写文件记录OTA状态的方式风险较大建议能够改善优化。