【运维实战】ECS云硬盘空间爆满排查:句柄泄漏清理与Logrotate自动化轮转解法

举报
yd_271832976 发表于 2026/10/13 00:47:27 2026/10/13
【摘要】 针对弹性云服务器(ECS)挂载的云硬盘(EVS)突发空间使用率100%且常规删除无效的痛点,本文提供一套从底层文件句柄排查到日志自动化轮转的工程化解法。通过定位未释放的幽灵文件、在线无损截断及配置Logrotate策略,彻底根治磁盘打满引发的服务假死故障。

在日常云端运维中,经常遇到 ECS 监控告警提示云硬盘(EVS)空间占用达到 100%,但登录终端执行 rm -rf 删除超大日志文件后,df -h 显示磁盘空间依然没有释放。这是因为业务进程仍持有该文件的写入句柄(File Descriptor),导致磁盘块无法被系统内核回收。标准的工程化解法是:精准清理未释放句柄,并建立不中断业务的日志在线截断与轮转机制。

1. 排查被进程锁定的“幽灵文件”

当 df -h 与 du -sh 统计结果严重不符时,直接使用 lsof 检索处于 deleted 状态但仍被进程占用的文件句柄:


Bash

# 检索已被删除但句柄未释放的大文件,提取进程PID与文件描述符
lsof -nP +L1 | grep deleted


2. 在线无损清空大文件(免重启释放空间)

切忌在生产高峰期直接 kill -9 强杀核心业务进程,也不要直接 rm 正在写入的活动日志。正确的做法是通过重定向或 truncate 指令直接将文件字节数截断归零,瞬间释放 EVS 块存储空间:


Bash

# 直接将正在写入的超大日志文件截断为 0 字节,不破坏进程写入句柄
truncate -s 0 /var/log/app/service_error.log


3. 配置 Logrotate 自动化防爆盘底座

治本之策是将日志生命周期交由系统接管。在 /etc/logrotate.d/ 下创建自定义应用配置,核心在于启用 copytruncate 参数(先复制归档,再原地清空原文件),确保应用无需重新打开文件描述符即可无缝继续写入:


Plaintext

/var/log/app/*.log {
    daily
    rotate 7
    size 500M
    compress
    delaycompress
    missingok
    notifempty
    copytruncate
}


配置完成后,可执行以下命令手动触发一次强制轮转并验证语法规则是否正确:


Bash

logrotate -vf /etc/logrotate.d/app_log


通过 lsof 快速定界句柄泄漏,结合 truncate 在线无损清理与 Logrotate 定时截断归档,不仅化解了线上磁盘打满的燃眉之急,更避免因粗暴删除文件或重启服务导致的业务中断。这套轻量级的系统层自治方案,是保障云端高负载实例长期稳定运行的必备基石。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。