【运维实战】ECS云硬盘空间爆满排查:句柄泄漏清理与Logrotate自动化轮转解法
在日常云端运维中,经常遇到 ECS 监控告警提示云硬盘(EVS)空间占用达到 100%,但登录终端执行 rm -rf 删除超大日志文件后,df -h 显示磁盘空间依然没有释放。这是因为业务进程仍持有该文件的写入句柄(File Descriptor),导致磁盘块无法被系统内核回收。标准的工程化解法是:精准清理未释放句柄,并建立不中断业务的日志在线截断与轮转机制。
1. 排查被进程锁定的“幽灵文件”
当 df -h 与 du -sh 统计结果严重不符时,直接使用 lsof 检索处于 deleted 状态但仍被进程占用的文件句柄:
# 检索已被删除但句柄未释放的大文件,提取进程PID与文件描述符
lsof -nP +L1 | grep deleted
2. 在线无损清空大文件(免重启释放空间)
切忌在生产高峰期直接 kill -9 强杀核心业务进程,也不要直接 rm 正在写入的活动日志。正确的做法是通过重定向或 truncate 指令直接将文件字节数截断归零,瞬间释放 EVS 块存储空间:
# 直接将正在写入的超大日志文件截断为 0 字节,不破坏进程写入句柄
truncate -s 0 /var/log/app/service_error.log
3. 配置 Logrotate 自动化防爆盘底座
治本之策是将日志生命周期交由系统接管。在 /etc/logrotate.d/ 下创建自定义应用配置,核心在于启用 copytruncate 参数(先复制归档,再原地清空原文件),确保应用无需重新打开文件描述符即可无缝继续写入:
/var/log/app/*.log {
daily
rotate 7
size 500M
compress
delaycompress
missingok
notifempty
copytruncate
}
配置完成后,可执行以下命令手动触发一次强制轮转并验证语法规则是否正确:
logrotate -vf /etc/logrotate.d/app_log
通过 lsof 快速定界句柄泄漏,结合 truncate 在线无损清理与 Logrotate 定时截断归档,不仅化解了线上磁盘打满的燃眉之急,更避免因粗暴删除文件或重启服务导致的业务中断。这套轻量级的系统层自治方案,是保障云端高负载实例长期稳定运行的必备基石。
- 点赞
- 收藏
- 关注作者
评论(0)