阿里云ECS的系统盘莫名其妙就满了,删了文件空间还不回来,到底是谁在偷偷占盘?

阿里云上云采购季 2核2G云服务器99元/年 续费同价

云服务器导航,点击直达:阿里云,腾讯云,京东云,百度云,UCloud

直接给结论:系统盘满,多半不是你存的东西太多,而是日志、缓存、容器镜像这类”自己会长大”的东西在悄悄吃盘;或者文件删了、进程还攥着句柄不放,空间自然不回来。别急着扩容,按 df 看总量、du 找目录、lsof 查已删除文件三步走,通常十分钟就能揪出来。扩容是最后一步,也是唯一要花钱的一步。

一、先分清”满”的四种样子

  1. 真占用:df 用了 90% 以上,du 也对得上,多半是日志、备份包、附件堆在系统盘。
  2. 已删除但没释放:df 快满了,du 加起来才一半。典型是 rm 了正在写入的大日志,进程句柄还在,内核不回收。
  3. inode 用完:df -h 有空间却报 “No space left on device”,常见于 session 和大量小缓存文件。
  4. 扩容没扩到位:控制台从 40G 调到 100G,df 还是 40G——分区和文件系统没跟着扩。

二、三步定位,顺序别乱

先看总量和 inode:df -h; df -i。再从根目录逐层往下钻(-x 不跨文件系统,免得扫到另挂的云盘):du -xh --max-depth=1 / | sort -rh | head -15。最后专找”删了没释放”的文件:lsof +L1 | sort -k7 -rn | head。如果 du 和 df 差了十几个 G,基本就是句柄问题,看哪个进程在攥着。

三、按来源清理,别乱删

  1. 系统日志:journalctl –vacuum-size=200M 只留最近 200M,再把 logrotate 的轮转次数和压缩打开,让日志自己滚。
  2. Docker:镜像和容器层默认堆在 /var/lib/docker,docker system prune 能清悬空镜像;更关键的是给 json-file 日志配 max-size 和 max-file,否则单个容器能写到几十 G。
  3. 站点日志:Nginx、面板的 access.log 涨得最快,按站点配好切割,别等它撑满。
  4. 句柄问题:别重复 rm。重启那个进程,或用 truncate -s 0 清空文件,空间立刻回来。

顺带一句:腾讯云 CVM 的云硬盘同样是”控制台扩容 + 分区扩容 + 文件系统扩容”三层,只做第一步也看不到新容量,两家逻辑一致。

注意:

  • 不要 rm -rf /var/log 下正在写的日志。文件被删了进程还在写,空间不释放,还得重启服务才恢复,白白多一次故障。
  • /var/lib/mysql、/var/lib/docker 这类目录不是垃圾堆,删之前先确认是缓存还是数据,删错了只能靠快照救。
  • 扩完云盘务必扩分区和文件系统,否则 df 一直显示旧容量,等于钱花了没效果。做扩容和清理之前,先打一个快照。

总结:系统盘满是个排查问题,不是采购问题。先看清楚是日志、缓存还是句柄在占地方,九成情况清理加日志轮转就能解决;只有业务数据真的涨上来了,才需要考虑扩容或者把数据搬到数据盘、对象存储上。

四种情况对照

现象 大概率原因 首选动作
df 满、du 对不上 删除后句柄未释放 lsof +L1 定位,重启进程或 truncate
df -i 用满 小文件过多(session、缓存) 清 session 目录,必要时换盘
扩容后容量没变 分区/文件系统未扩 growpart + resize2fs/xfs_growfs

上表为通用排查经验,具体命令与限制以阿里云官方文档为准;涉及扩容的费用以官方活动页实时价格为准。

阿里云ECS服务器产品文档:参考-阿里云服务器ECS文档
腾讯云轻量服务器产品文档:参考-轻量应用服务器 文档中心

发表评论