(上海聚创智行智能科技有限公司 上海 201208)
摘要:AS33项目是一款面向量产的国产汽车智能驾驶项目。日志系统的优劣直接关系到系统的可靠性和故障排查效率。本文从现状分析、存在问题、优化策略及实现过程等几方面深入分析了原有日志系统的不足之处,并提出优化策略及管理措施。例如,原日志系统存在易受eMMC寿命限制、日志空间分配不合理、系统异常时日志丢失等问题。针对这些问题,结合嵌入式系统日志管理特点,提出并实施了多项优化措施,提高了系统的稳定性和可靠性。
关键词:汽车项目 日志 管理及优化
1 项目概述
AS33 项目是⼀款⾯向量产的国产汽车智能驾驶项目。本人作为项目软件开发团队的⼀员,负责车辆系统中日志系统的设计与实现,以及日志管理策略的制定和实施。日志系统是量产汽车智能驾驶项目中不可或缺的重要组成部分,其主要功能是记录应用程序、系统或服务在运行过程中产生的各种事件信息。这些日志信息对对后续的故障排查、性能优化有极其重要的作用。
在项目开发过程中,发现原有的日志系统存在⼀些缺陷,例如:
1)易受 eMMC 寿命限制。
2)日志空间分配不合理。
3)时间混乱导致日志命名冲突。
4)系统异常时日志丢失等问题。
这些问题严重影响了系统运⾏的可靠性和稳定性,给故障排查和性能分析带来了困难。为了解决这些问题,本人经过深⼊研究嵌⼊式系统日志管理的特点和难点,结合项目实际需求,对日志系统进⾏了符合需求的优化,并提出改进措施和管理方案。
2 存在的问题
2.1 项目分析
AS33 项目的日志系统最初的设计目标是记录系统运⾏的关键信息,以便于开发⼈员进⾏调试和故障排查。随着项目规模的扩⼤和功能的增加,原有的日志系统逐渐暴露出⼀些不⾜,如:
1)日志存储空间有限:AS33项目采⽤eMMC 作为主要存储介质,其存储空间相对有限。
2)日志与其他数据共⽤空间:原有的日志系统未考虑日志使⽤独⽴空间。
3)没有实时时钟:板端未包含 RTC 时钟。
4)日志写⼊机制不完善:在系统异常情况下,例如断电或应⽤崩溃,日志数据可能⽆法及时写⼊存储器,导致日志丢失。
2.2 存在问题
2.2.1 eMMC写死问题
由于eMMC闪存颗粒的寿命有限,频繁的写⼊操作会导致eMMC存储芯⽚过早损坏,造成系统⽆法正常⼯作。
颗粒类型 | 写⼊次数 | 说明 |
SLC | 10,000+ | ⼀个单元通过 2 种电压存储 1 bit 数据 |
MLC | 1,000+ | ⼀个单元通过 4 种电压存储 2 bit 数据 |
TLC | 1,000+ | ⼀个单元通过 8 种电压存储 3 bit 数据 |
QLC | 100+ | ⼀个单元通过 16 种电压存储 4 bit 数据 |
PLC | 10+ | ⼀个单元通过 32 种电压存储 5 bit 数据 |
1)闪存颗粒寿命:不同的闪存颗粒有不同的写⼊寿命,当写⼊次数达到寿命后,磁盘将⽆法写⼊数据。
2)负载均衡:
⑴ eMMC 通常有独⽴的控制器,负责管理全空间的存储。
⑵ 逻辑分区不影响 eMMC 控制器做负载均衡。
⑶ 当部分空间出现写死问题时,基本上 eMMC 已到寿命周期。
2.2.2日志空间分配及管理问题
1)日志空间分配问题
日志和其他应⽤程序共⽤有限的eMMC存储空间,不合理的日志空间分配策略会导致日志⽂件过⼤,占⽤过多的存储空间,影响其他应⽤程序的正常运⾏。同样的,其他模块的数据会写⼊过多,同样会导致日志⽂件⽆法正常写⼊。
2)日志空间管理混乱
各应⽤使⽤独⽴的日志模块进⾏管理,如alog、glog、⾃研日志库、日志和其他模块共⽤分区(如OTA)。
2.2.3 时间混乱导致的日志命名问题
由于板端未包含RTC时钟,系统重启后时间信息会丢失,导致日志⽂件命名混乱,难以区分不同时间段的日志信息,给故障排查带来困难。
2.2.4 日志写⼊丢失问题
在系统异常情况下,例如断电或应⽤程序崩溃,日志数据可能⽆法及时写⼊eMMC存储器,导致重要的日志信息丢失。
1)eMMC组成:
闪存 | 控制器 |
存储 |
2)eMMC写⼊流程:
3 日志系统的优化及管理
为了解决上述问题,本⼈针对AS33项目的日志系统进⾏了优化,并提出相关改进方案。
3.1 eMMC写死问题的预防
3.1.1 量⼊⽽出
1)评估 eMMC 可⽤写⼊量:根据 eMMC 芯⽚⼿册和车辆的预期寿命,计算出 eMMC 的最⼤可写⼊数据量。
2)分析日志写⼊量:通过⻓稳测试和实车测试,收集和分析不同场景下的日志写⼊量,例如启动阶段、运⾏阶段和异常阶段等。
3)制定日志容量分配策略:根据eMMC可⽤写⼊量和日志写⼊量,制定合理的日志容量分配策略,确保日志系统在车辆⽣命周期内正常运⾏。
3.1.2 日志容量分配
1)根据车辆寿命反推最⼤可写⼊空间:根据车辆的预期使⽤寿命和报废年限,计算出eMMC 存储芯⽚在整个⽣命周期内允许的最⼤写⼊数据量。
2)分析预设场景中的日志写⼊量:根据车辆的典型使⽤场景,例如城市道路、⾼速公路和停车场等,模拟和分析不同场景下的日志写⼊量。
3)限制和优化日志格式:根据日志容量分配策略,限制日志⽂件的最⼤容量,并优化日志格式,例如使⽤缩略词、减少冗余信息等,以减少日志写⼊量。
3.1.3 引⼊日志量系数
1)考虑eMMC实际写⼊量:由于eMMC存储芯⽚的写⼊机制(如损耗均衡、垃圾回收等),实际写⼊的数据量通常⼤于日志⽂件的逻辑⼤⼩,因此在实际工作中应考虑eMMC实际写⼊量。
2)引⼊日志量系数:为了预防实际eMMC的写⼊量出现外溢,在前期估算阶段引⼊⼀个日志量系数,⽤于表⽰日志写⼊量与eMMC实际写⼊量之间的⽐例关系。
3) 调整日志容量分配策略:根据日志量系数,调整日志容量分配策略,确保 eMMC 存储芯⽚的实际写⼊量在安全范围内。
3.2日志空间使⽤的优化措施
3.2.1 建⽴统⼀日志管理系统
1)集中存储日志⽂件:为所有应⽤程序指定统⼀的日志存储目录,⽅便进⾏空间管理和监控。
2)限制日志⽂件数量:设置每个应⽤程序允许创建的日志⽂件数量上限,防⽌因日志⽂件过多⽽耗尽存储空间。
3)监控日志空间使⽤情况:定期检查日志目录的磁盘空间占⽤情况,及时清理过期或⽆⽤的日志⽂件。
3.2.2日志压缩
1)定时压缩日志⽂件:使⽤压缩⼯具,例如 tar 或 gzip,定期压缩日志⽂件,以减少存储空间占⽤。
2)采⽤⾼效的压缩算法:选择压缩率⾼、速度快的压缩算法,例如 LZ 4 或 Zstandard,以平衡压缩效率和性能。
3)压缩过程中监控资源使⽤:在日志压缩过程中,监控 CPU 和内存等系统资源的使⽤情况,避免影响其他应⽤程序的正常运⾏。
3.2.3日志轮转
1)设置日志⽂件上限:当日志⽂件达到预设的上限值时,⾃动创建新的日志⽂件,并将旧的日志⽂件进⾏备份或删除。
2)基于时间进⾏日志轮转:根据时间间隔,例如每天或每周,⾃动创建新的日志⽂件,并将旧的日志⽂件进⾏备份或删除。
3)保留指定数量的日志⽂件:设置需要保留的日志⽂件数量,例如保留最近⼀周的日志⽂件, 以便于进⾏历史数据分析。
3.3 ⽆实时时间情况下的日志⽣成问题的解决⽅案
3.3.1 根据启动次数⽣成日志
1)记录系统启动次数:在系统启动时,读取并记录系统的启动次数,并将其作为日志⽂件名的组成部分。
2)包含启动时间信息:在日志⽂件名中包含系统启动的时间信息,例如年、⽉、日、时、分、 秒等,以便于区分不同时间的启动日志,提⾼故障排查效率。
3)记录系统关闭原因:在系统关闭时,记录系统的关闭原因,例如正常关机、异常断电或软件崩溃等,并将该信息写⼊启动日志⽂件。
3.3.2 为日志⽂件添加序号
1)保证日志⽂件名的唯⼀性:为每个日志⽂件添加⼀个唯⼀的序号,确保即使在短时间内多次重启系统,也不会出现日志⽂件名重复的问题。
2)使⽤递增的序号:使⽤递增的序号来标识日志⽂件的创建时间顺序,⽅便进⾏日志⽂件的排序 和查找。
3)组合启动次数、日志⽚和⽣成时间:将启动次数、日志⽚序号和日志⽂件⽣成时间组合起 来,作为日志⽂件的⽂件名,例如 "00001-log 001-202406101642. log"。
3.4. 预防日志写⼊丢失
3.4.1 写⼊磁盘⽅案
1)调⽤sync 同步数据
⑴ 调⽤sync 同步数据:在应⽤程序调⽤日志接⼝写⼊数据后,调⽤ sync() 系统调⽤将数据同步到磁盘,确保数据持久化存储。
⑵ 延迟同步:由于sync()调⽤会降低系统性能,可以采⽤延迟同步的⽅式,例如每隔⼀段时间或写⼊⼀定量的数据后,再调⽤sync()同步数据。
2)使⽤Fsync 同步⽂件
⑴ 调⽤fsync 同步⽂件:对于重要的日志⽂件,可以在每次写⼊数据后,调⽤fsync()系统调⽤将⽂件数据同步到磁盘,以确保⽂件数据的完整性。
⑵ 修改日志模块:如果现有的日志模块不⽀持 fsync() 调⽤,可以对其进⾏修改,添加相应的接⼝或配置选项,以⽀持⽂件数据同步。
3.4.2 备选⽅案
1)重要信息单独写⽂件:对于⾮常重要的信息,可以将其写⼊⼀个单独的⽂件,并进⾏额外的备份和保护,以防⽌数据丢失。
2)将日志打印到串⼝输出:在调试阶段,可以将日志信息打印到串⼝输出,以便于实时查看和分析系统运⾏状态。
3)硬件缓存刷新机制:⼀些存储设备具有硬件缓存刷新机制,可以确保数据在掉电时也能安全写⼊存储介质。具体功能可咨询硬件⼚商或查阅相关⽂档,了解如何启⽤和配置该机制。
4)针对重要日志进⾏“插队”操作:对于重要的日志信息,可以将其写⼊⼀个单独的日志⽂件或缓存队列,并优先进⾏同步操作,以确保重要信息不会丢失。
4 结语
在 AS33 项目中,遇到了各种与日志相关的问题,例如 eMMC 写死、日志空间不⾜、时间混乱和日志丢失等。为了解决这些问题,本⼈提出了⼀系列的改进⽅案及管理措施,如:
1)预防 eMMC 写死:通过估算日志写⼊量、优化日志格式、限制日志级别和引⼊日志量系数等⽅法,最⼤限度地延⻓ eMMC 的使⽤寿命。
2)优化日志空间分配:采⽤统⼀的日志管理机制、日志压缩、日志轮转和定期
备份等策略,提⾼日志空间利⽤率,延⻓日志保存时间。
3)解决时间混乱问题:通过记录启动次数、添加日志⽂件前缀和序号等⽅式,确保日志⽂件名的唯⼀性和时间顺序。
4)防日志丢失:采⽤sync()、fsync()等系统调⽤同步数据,以及使⽤单独⽂件存储重要信息等⽅案,提⾼日志数据可靠性。
通过以上措施,有效地解决了 AS33 项目中的日志问题,提⾼了系统的稳定性、可靠性和可维护性,减少了开发⼈员的重复劳动,提⾼了⼯作效率,保证了项目的顺利进⾏。同时,为后期项目的高效开展提供了成功的范例。