问题出现得很突然,日志倒是留得挺全。一台 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 下文件数量与断电前一致且业务写入正常。
孤儿清理时间长说明上次写入很重,不是盘坏了;但同一块盘频繁出现就该怀疑应用写放大的问题,光重启解决不了。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
