问题出现得很突然,日志倒是留得挺全。一台 CentOS 7 被直接断电后重启,卡在挂载 /data 这一步二十分钟,dmesg 里反复出现 EXT4-fs recovery completed 之前的 orphan cleanup 行,业务一直在等。

刚开始盯着「挂载带 noload 时跳过日志重放,孤儿的清理被推到第一次真正写入」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。上次写入的 inode 没来得及释放,恢复时内核要逐个清理孤儿链表。也可能是业务进程写了大量小文件且没 fsync,断电后孤儿 inode 数量翻倍。

不容易想到的是,盘本身 IO 差,逐个 inode 的随机读写把清理时间拉长。

先确认是不是卡在孤儿清理

dmesg -T | grep -i 'orphan\|recovery' | tail -20

不挂载,单独做文件系统检查

e2fsck -fy /dev/vdb1

随后检查完成后按正常方式挂载并计时

time mount /dev/vdb1 /data

给业务加 fsync 节奏,减少断电孤儿

grep -E 'commit|data=' /etc/fstab

怎么算真的好了,看的是同一批现象。dmesg 中 orphan cleanup 的行在挂载后不再出现,mount 耗时回到秒级,/data 下文件数量与断电前一致且业务写入正常。

孤儿清理时间长说明上次写入很重,不是盘坏了;但同一块盘频繁出现就该怀疑应用写放大的问题,光重启解决不了。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189