CentOS 删除文件或清理空间很慢的排查与优化
一、先判断是“删除慢”还是“空间释放慢”
- 使用 df -h 查看整体分区使用率,使用 du -sh / 或 ncdu / 定位占用最大的目录,确认是否真的在“回收/清理”。
- 若已删除但 df 不下降,常见原因是被删除文件仍被进程占用(表现为 lsof | grep deleted 能看到已删除文件仍被写入),此时空间不会释放,看起来就像“回收很慢”。
- 若删除动作本身卡顿,多与挂载选项(如 noatime/nodiratime 缺失)、磁盘 I/O 饱和、文件系统碎片或 inode 耗尽 有关。
- 若你使用的是图形界面或某些工具,可能把文件移到“回收站”(如 ~/.local/share/Trash),清空回收站才会真正释放空间,这一步在大目录上会显得慢。
二、空间未释放的典型场景与快速处理
- 现象:已 rm 但 df 不变,且 lsof | grep deleted 能看到被进程占用的已删除文件。
- 处理步骤:
- 查找占用进程:
lsof -n /data | grep deleted
- 优先“在线清空”日志,避免停服务:
echo “” > /var/log/xxx.log 或 :> /var/log/xxx.log
- 如必须重启,再考虑重启对应服务/进程;极端情况下再 kill。清空后再次 df -h 检查。
- 原理要点:删除文件只是解除目录项链接(unlink),若进程仍持有文件描述符,数据块不会回收,直到进程关闭或文件被截断。
三、删除动作本身很慢的优化
- 挂载选项优化:在 /etc/fstab 为数据盘增加 noatime,nodiratime(必要时 discard 用于 SSD),减少元数据写入;示例:
/dev/vdb1 /data ext4 defaults,noatime,nodiratime 0 0
修改后重新挂载或重启。
- 避免删除超大目录时的性能陷阱:
- 优先使用 find … -delete 而非 rm -rf(减少 shell 展开与参数列表过长问题)。
- 对包含海量小文件的目录,分批删除(按子目录/时间/大小切片)。
- 大文件删除的“可观测性”:用 ionice -c 3 rm -rf 目录 降低 I/O 优先级,避免影响业务。
- 检查磁盘健康与 I/O:用 iostat -x 1 观察 await、svctm、util,若 util≈100% 说明磁盘饱和,需从业务削峰或扩容。
- 检查 inode 是否耗尽:df -i;若 inode 满,删除大量小文件才能缓解。
- 使用“回收站”机制平滑删除:安装 trash-cli,用 trash-put 替代 rm,配合定时清理策略,避免一次性大删除。
- 文件系统层面:若是 XFS,可考虑 xfs_fsr 做在线碎片整理;ext4 一般不推荐在线整理,必要时离线迁移重建。
四、回收站清理慢的实用做法
- 桌面环境或命令行回收站位置:
- 常见为 ~/.local/share/Trash/files 与 ~/.local/share/Trash/info。
- 直接清空:rm -rf ~/.local/share/Trash/files/* 与 ~/.local/share/Trash/info/*。
- 使用 trash-cli 管理并定期清理:
- 安装:yum install -y trash-cli
- 清空:trash-empty(可加 –days 7 仅清 7 天前)。
- 定时任务(每天清理 7 天前):
0 0 * * * /usr/bin/trash-empty --days 7
- 自建回收站脚本(示例):
TRASH=$HOME/.trash; mkdir -p $TRASH
alias rmtrash=‘mv -i “$@” $TRASH’
cleartrash(){ read -p "清空回收站? (y/n) "; [[ $REPLY == y ]] && /bin/rm -rf $TRASH/*; }
将 alias 加入 ~/.bashrc 后 source 生效。
五、一键排查清单(可直接执行)
- 查看空间与占用:
df -h; du -sh /* 2>/dev/null | sort -hr | head -20
- 检查已删除但被占用的文件:
lsof -n / | awk ‘$5 ~ /REG/ && $6 ~ /deleted/ {print $0}’
- 在线清空大日志(谨慎,确认业务允许):
:> /var/log/your_app.log
- 观察 I/O:
iostat -x 1 10
- 检查 inode:
df -i
- 若使用回收站:
du -sh ~/.local/share/Trash/files
/usr/bin/trash-empty --days 7
如需,我可以根据你的实际挂载点、业务类型与磁盘类型,给出更精确的 fstab 参数、删除策略与定时清理脚本。