云服务器磁盘占用告警后先定位再清理:df/du 排查与安全清理的 6 步

举报
yd_293948692 发表于 2026/11/03 10:48:01 2026/11/03
【摘要】 云服务器磁盘告警后不要先扩容或盲目删除:按 df/du 逐级定位、区分日志与数据、处理已删除未释放文件,再验证占用率与业务状态,最后改好日志滚动策略。

一、背景与问题

云服务器收到磁盘占用告警时,最常见的错误反应是立刻扩容,或者直接删掉几个看起来很大的文件。扩容能暂时把告警压下去,却没有回答一个关键问题:空间到底被谁占了。如果是日志失控、备份残留或者已删除但仍被进程占用的文件,扩容只是把同样的问题推迟几天,账单却一直在涨。反过来,盲目删除也可能删掉业务正在写的文件,造成比磁盘满更严重的故障。

本文的目标不是教你扩容,而是给出一个先定位、再清理、最后验证的固定流程。按这个流程走一遍,你能说清楚占用来自哪里、清理后释放了多少、以及下一次告警前该盯什么指标。

二、前提条件

开始之前请先确认三件事。第一,你有服务器的登录权限,能执行查看命令,不需要一上来就拿到 root 写权限。第二,清理前已经确认这台服务器是否有快照、备份或云备份策略,重要数据先有退路再动手。第三,区分系统盘和数据盘,知道业务数据、日志、数据库分别挂在哪块盘上,避免在系统盘上清理数据盘的问题,或者反过来。

另外请记住一条底线:不确定的文件先不要删,先挪到临时目录观察,或者先压缩归档。删除是不可逆操作,定位才是可逆操作。

三、分步操作

第 1 步:先看整体占用和 inode

先用 df 看每块盘的占用率,再用 df -i 看 inode 使用率。磁盘满有两种满:一种是字节满了,另一种是小文件太多把 inode 占满了。后者即使总容量还有剩余,写入新文件也会失败。把这两个结果记下来,作为清理前后的对照基线。

df -h
df -i

第 2 步:从根目录向下逐级定位

用 du 按目录汇总,从根目录开始,一层一层往下钻,不要一开始就全盘扫描大文件。先看一级目录,再看占用最大的目录的下一级,通常两到三层就能锁定嫌疑目录。

du -sh /* 2>/dev/null | sort -rh | head -20
du -sh /var/* 2>/dev/null | sort -rh | head -20

第 3 步:区分日志、数据和临时文件

定位到嫌疑目录后,先判断文件类型。日志目录重点看滚动是否失效,例如日志没有按天切割、旧日志没有压缩和删除。数据目录重点看备份文件、导出文件和下载的安装包是否长期堆积。临时目录重点看应用缓存、解压残留和失败任务的中间文件。不同类型的文件,清理策略完全不同,不能用同一种删法处理。

第 4 步:处理已删除但仍被占用的文件

这是最容易被误判的一类。文件已经在目录里看不到了,但某个进程还持有它的句柄,空间并不会释放。df 显示满,du 却算不出大文件,往往就是这种情况。先用 lsof 找到已删除但仍打开的文件,确认是哪个进程,再决定是重启该进程、让它重新打开日志,还是等任务自然结束。直接删文件解决不了这类问题,重启相关服务才是释放空间的办法。

lsof | grep deleted

第 5 步:安全清理,而不是直接删除

确认可以清理的文件,按风险从低到高处理。已过期的压缩日志、明确的临时文件和下载残留可以先清理。正在被写入的当前日志不要直接删除,正确做法是清空内容而不是删除文件,或者通过日志服务重新切割。数据库和业务数据目录里的文件,没有确认用途之前一律不动。清理时先处理一批,立刻看一次 df,确认释放量和预期一致,再处理下一批。

第 6 步:处理日志滚动,避免下次重演

清理完只是治标。检查日志服务的配置:是否按大小或按天切割、保留多少天、是否压缩旧日志、是否限制 journal 日志的总量。把这些值写下来,改成和业务量匹配的保留策略。否则这次清理出来的空间,下一次日志高峰又会被吃掉。

journalctl --disk-usage
du -sh /var/log/* 2>/dev/null | sort -rh | head -20

四、验证方法

清理完成后做四项验证,缺一不可。第一,再跑一次 df -h 和 df -i,确认目标盘的占用率下降到了告警线以下,并记录清理前后的数值。第二,确认业务进程和数据库仍在正常运行,关键服务没有因为误删文件而报错。第三,写入一个小测试文件再删除,确认磁盘可以正常写入,而不是只看数字下降。第四,观察十分钟到半小时,看占用率是否又快速反弹。如果反弹很快,说明还有持续写入的大文件没有找到,需要回到第 2 步继续定位。

五、常见坑

第一个坑是只看 df 不看 inode,小文件把 inode 占满时,扩容完全没有用。第二个坑是删了正在写的文件就以为释放了空间,实际上进程还持有句柄,空间要等进程退出才释放。第三个坑是直接删除当前日志文件,导致应用继续往旧句柄写,新日志反而看不到。第四个坑是在系统目录里用通配删除,误删配置文件或依赖文件,修起来比磁盘满更费时间。第五个坑是清理完不改日志策略,问题在一个周期后原样复发。第六个坑是清理前没有快照或备份,删错之后无法恢复。

六、小结清单

  • 先跑 df -h 和 df -i,记下清理前基线,区分字节满和 inode 满。
  • 用 du 从根目录逐级定位,不要全盘盲目删除。
  • 区分日志、业务数据和临时文件,不同类型用不同清理策略。
  • 查 lsof 已删除文件,进程持有的空间要靠重启服务释放。
  • 不确定文件先挪走或压缩,确认无影响再删除。
  • 当前日志用清空或切割处理,不要直接删除正在写的文件。
  • 清理后验证占用率、业务状态、写入能力和反弹速度。
  • 改好日志滚动和保留策略,并把清理前后的数值留档。

按这份清单走完一次,下一次磁盘告警你就不再需要猜测,而是直接按流程定位和处理。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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