EFC&CTO:缓存引发数据不一致问题排查与深度解析

简介: EFC客户端更新缓存架构后,首次适配NAS场景CTO测试即出现data mismatch。排查发现并非缓存版本号导致的旧数据读取问题,而是文件系统数据被破坏——正常字符被替换为空字符,且错误集中于同一4K页内。初步判断为缓存引入导致pagecache被异常写坏,脏页回刷污染了远端数据。空字符来源及具体触发操作待进一步分析。

一、起因
EFC(Elastic File Client)是 NAS 自研的分布式文件系统客户端,最近完成了对缓存架构的更新,现在支持多个客户端之间构成分布式缓存,底层支持 NAS、CPFS 和 OSS。由于开发时间较短,一直没有做 NAS 场景 CTO 测试的适配。
CTO:Close-to-Open,指当一个文件被关闭后,再次 open 时,文件系统必须保证之前所有通过 close 操作提交的数据已经持久化到文件系统,并且读取时能获取到最新的、一致的状态。CTO 测试的具体实现是对本地和远端文件系统的文件执行相同的操作,在某些操作后读取两端文件系统的内容,比较是否相同。
● 本地为 EXT4 文件系统,符合 POSIX 语义,远端文件系统跟本地文件系统对比,信任本地文件系统的表现。
● 读缓存的测试是分布式的,单客户端读取由分布式缓存提供服务。
最近忙里偷闲适配了一下,静静等待测试的通过,结果没想到发生了 data mismatch 的错误,因为关闭缓存直读 NAS 的 CTO 测试在每次发版前都会跑一遍。得,缓存的锅铁定没跑了,那咱就来看看这个问题。
二、错误类型判断
读数据错误?
EFC 读缓存在 NAS 场景下会使用 dv(data version)作为缓存的版本号,文件系统数据更新的时候会对 dv 自增。EFC 与文件系统通信的 RPC 会更新本地记录的 dv 信息,EFC 读缓存就会根据客户端手上的 dv 作为版本号从缓存读取数据。
由于这个机制的存在,所以 data mismatch 问题一眼认定为:使用了旧的 dv 读到了缓存里的旧数据。看来问题不大,喝口水压压惊。
CTO 测试会对本地文件和 NAS 上的文件执行相同的操作,并在执行某些操作后检查读到的文件是否一致。这样在读到缓存旧数据的情况下,本地文件(本地 /root 下)和远端文件系统的文件(NAS /mnt1 挂载下)内容是相同的。
由于 mnt1 还是通过 EFC 客户端进行挂载,读取数据还是走的缓存,依然存在读到旧数据的可能。因此,为了排除 EFC 缓存的影响,使用 NFS 协议挂载了 NAS 文件系统后(不通过 EFC 进行挂载),通过 diff 比较本地和 NAS 上的文件内容,结果两者竟然不一致。结果表明,文件系统数据被破坏掉了,也宣告着读到缓存中的旧数据的想法破产。
写数据错误!
调查过程陷入困局,决定看一下错误文件的内容有没有新的发现。由于原始文件存在大量的不可见字符,因此使用 hexdump 将文件转成 16 进制格式,每行显示 16 个字符。左侧为本地文件,右侧为 NAS 上文件,可以看到 NAS 上文件中的字符 f (0x66) 被替换成了空字符 NULL (0x00)。
但是 CTO 测试中并不会主动写入空字符,这些空字符是如何产生的呢?

计算错误字段的开始位置和结束位置:mismatch start = 0x94250 = 606800,mismatch end = 0x94ee0 + 2 = 610018,对一个 4K 页整除可以发现错误段正好位于一个 page 内。

这个 CTO 数据不一致问题几个小时的运行可以复现,每次结果的表现是一致的,均是正常字符被替换为空字符以及错误数据位于同一个 page 内(出现过数据错误开始位置正好 4K 对齐)。
这个时候开始把思路转向为:由于缓存的引入写坏了本地的 pagecache,当脏页需要刷到文件系统的时候把 pagecache 里的旧数据一并刷到了文件系统,造成了文件系统数据的不一致。
明确了问题后,现在的困扰来到了是什么操作写坏了 pagecache,以及空字符是如何产生的呢?

相关文章
|
12天前
|
数据采集 人工智能 安全
|
7天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
344 164
|
6天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
345 155
|
7天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
582 4
|
15天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
1019 7

热门文章

最新文章