meta 目录里 6000 个隐藏临时文件,我先按 mtime 圈了范围

meta 版本 2.4.1,CentOS 7 环境,仓库目录大概 18 万文件、3.2 GB。现象是 du -sh 和 du -sh --apparent-size 差了近 400 MB,ls -la 看不出异常,但 find . -name ".*" 会返回一大堆名字像 .meta_tmp_* 的东西。数量我数过一次,6000 出头。

我的做法是先不删,只圈范围。用 mtime 把「最近改过的」和「停在那里很久的」分开:

find /data/meta -type f -name '.meta_tmp_*' \
  -printf '%TY-%Tm-%Td %TH:%TM %s %p\n' \
  | sort > /tmp/meta_tmp_list.txt

然后按天聚合,看这些文件最后一次被写是什么时候:

awk '{print $1}' /tmp/meta_tmp_list.txt | uniq -c

结果很集中:大部分是同一周留下的,剩下几十个是当天还在动的。当天还在动的一律不碰,说明有进程仍然会写临时文件。

接着确认有没有进程正开着它们。没有 lsof 的话用 /proc 也行:

for p in /proc/[0-9]*; do
  ls -l "$p/fd" 2>/dev/null | grep -q 'meta_tmp_' && echo "$p"
done

确认没有持有者之后,我才做第二步:不直接 rm,先 mv 到一个隔离目录,观察 24 小时。原因是 meta 的临时文件有时和快照清单对得上,删了之后校验脚本会报缺文件,而不是报错退出。

为什么这样做:meta 写临时文件是先写后 rename,正常路径下 rename 完临时文件就没了;留下的这批说明 rename 没成功,可能是进程被杀、磁盘满或权限变化。直接删能立刻回收空间,但会丢掉「当时为什么失败」的线索,所以我留了清单和隔离目录。代价是多占一天空间,换来可回溯。

哪里会失效:mtime 在挂载时如果带 noatime 之外的特殊选项、或者文件被 touch 过,按天聚合就不准;另外 mv 到同一文件系统才不复制数据,跨盘 mv 会真的搬一遍,18 万文件的目录里这一步可能很慢。我踩过的坑是有一次隔离目录建在了另一块盘上,mv 跑了十几分钟,还把 inode 号全换了,后面的硬链接统计直接对不上。

你们那边 meta 的临时文件是跟着进程退出就清,还是也要靠人工圈范围?如果是前者,我想知道是哪个配置项在起作用。

0
赞同度 100% · 0 条评论 · 4 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。