meta — meta的讨论、问答与经验分享

meta 快照校验跑一半被 OOM 杀掉,我改成按目录分片

meta 快照校验脚本在 3.2 万条记录上跑全量时被 OOM 杀掉,这个场景我遇到过两次:一次在 4 核 8G 的备用机上,一次在容器里内存限制 2G。现象很一致——前 1 万多条正常,之后 RSS 一路涨,最后被 kill。数据量不大,问题出在脚本把所有结果先攒在内存里再统一比。

周 周牧

meta 目录同步到备用机,我漏了 inode 这一层

两台机器之间同步 meta 目录,我之前的做法是 rsync -a 一把梭,看起来文件数、大小、mtime 都对得上,就默认两边一致了。直到上次做回滚演练才发现,备用机上有一批文件内容是对的,但校验脚本跑出来的结果和主库不一样。版本是 meta 0.9.x,目录里大概 1.2 万个文件、三层子目录,主备都是 ext4,量不算大,问题反而更容易被忽略。

苏 苏念

meta 目录改完名,我用 inotify 才发现软链没跟着动

目录结构:meta 仓库在 /data/meta,线上服务读取的是 /srv/meta,中间是一层软链。版本是 meta 0.9.4,机器是 Ubuntu 20.04,目录里约 6.8 万个文件,单文件大多在 2KB 到 40KB 之间。现象是:在 /data/meta 里改文件名之后,服务端读到的还是旧名字,重启进程才恢复。

苏 苏念

meta 配置文件里的时间戳,我按秒对齐才发现错位

meta 的配置文件里有个字段是上次同步时间,格式是 ISO 字符串带毫秒。我们线上有 6 个节点,配置由一份 meta 文件分发下去,大约 4.2 万行,单文件 380KB 左右。某天开始,两个节点报「快照过期」,另外四个正常。手动 diff 六个节点的 meta 文件,内容一模一样。

苏 苏念

meta 快照回滚前,我先用 du 摸了一遍目录

上周在测试环境回滚一次 meta 快照,版本是 2024.3 的内网构建,数据量不大,目录 6.8GB、约 1.9 万个文件,主体是 JSON 描述文件和一堆按天切分的校验日志。现象是:回滚脚本跑了 4 分钟没结束,磁盘 IO 一直打满,最后 rsync 报了个空间不足退出,但 df 看还有 12GB。

苏 苏念

用 meta 校验脚本只跑增量,我先在 1.8 万条上把 40 分钟压到 90 秒

meta 校验脚本一开始是给全量写的:读清单、逐条比对、最后汇总。数据量到 1.8 万条记录时,单次跑完要 40 分钟上下,CI 里基本没人愿意等它,结果就是大家绕开校验直接合。我后来做的不是优化单条速度,而是只跑增量——把「这次变了哪些」交给 git,校验脚本只接变更清单。

苏 苏念

用 meta 校验脚本跑全量,我在 3.2 万条上撞了内存墙

环境是 Debian 12,Python 3.11,meta 校验脚本平时只跑增量的几百条,一直没出过事。上周做一次全量重跑,3.2 万条记录、单条平均 60KB,跑到第 1.8 万条左右进程被 OOM killer 干掉,dmesg 里能看到 oom-kill 记录,RSS 峰值到了 2.6GB,机器只有 4GB。现象很怪:单条解析很快,越往后越慢,最后直接没了。

周 周牧

用 rsync 同步 meta 目录,我漏掉了隐藏的校验文件

上周在测试机上跑一次 meta 配置同步,源目录 1.2GB、约 3.4 万个文件,其中大部分是历史快照。目标机是另一台内网机器,平时靠一条 rsync 命令推过去。现象很简单:同步完跑校验脚本,有 7 个 meta 文件报字段缺失,但源端读出来是全的。

苏 苏念

用 meta 索引离线校验,我把 2 万条记录的等待压到 1 分钟

meta 仓库里有一份索引文件,记录了 2.1 万条记录的路径、大小和修改时间戳,每行一条。本地是 macOS + zsh,索引文件 18MB 左右。现象是:每次改动 meta 目录后跑校验脚本,都要全量遍历一遍目录再逐行比对,耗时 6~8 分钟,中间没有输出,很难判断卡在哪。最烦的是磁盘上有几个挂载点偶尔掉线,脚本会卡在 stat 上不返回。

周 周牧

用 diff 比对 meta 配置时,我漏掉了注释行里的版本号

上个月排查一个线上问题,最后卡在 meta 配置的版本号上。环境是 Ubuntu 22.04,Python 3.11,meta 配置文件一共 6 个,单个文件 800 到 2000 行不等,注释行占比大概三成。现象是同一份 meta 在测试环境行为正常,到线上就报字段类型不匹配。

苏 苏念