云服务器磁盘满了怎么办——找出元凶、清理、扩容

服务器磁盘满了是个很常见的问题,而且通常发现的时候已经出问题了——日志写不进去、数据库挂了、网站报500。先别慌,按步骤来。

确认磁盘使用情况

df -h

看哪个挂载点满了,通常是根目录/或者/var。确认目标目录后,进一步查是哪个文件夹占用最多:

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

这条命令输出根目录下各文件夹的大小,从大到小排序。找到占用最多的,进去继续往下查:

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

一层一层往下挖,通常几步就能找到元凶。

最常见的几个占用大户

日志文件

Nginx、Apache、MySQL、系统日志都会持续写入。检查/var/log/目录,几十GB的日志文件很常见。

ls -lh /var/log/*.log /var/log/nginx/ /var/log/mysql/

不需要的旧日志直接删,正在使用的日志文件不要直接rm——先truncate:

truncate -s 0 /var/log/nginx/access.log

MySQL的binlog

MySQL开启了binlog的话,日积月累会占很多空间。在MySQL里执行:

SHOW BINARY LOGS;
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);

删除7天前的binlog。如果不需要主从复制,可以在my.cnf里关掉binlog。

Docker镜像和容器

用了Docker的话,悬空镜像、停止的容器、未使用的volume都会积累:

docker system prune -a

这条命令会清理所有未使用的镜像、容器、网络和缓存,谨慎执行,确认没有需要保留的再运行。

核心转储文件(core dump)

find / -name "core.*" -size +100M 2>/dev/null

进程崩溃时会生成core dump,有时候体积很大,可以安全删除。

临时文件和缓存

du -sh /tmp /var/tmp
apt clean  # Ubuntu/Debian清理包缓存
yum clean all  # CentOS

清理完还不够用:扩容

如果清理完还是不够,就需要扩容。在云控制台(腾讯云/阿里云)扩容步骤:

  1. 在控制台选择云盘,点击扩容,选择新的容量大小
  2. 扩容完成后登录服务器,执行分区扩展
# 查看磁盘和分区
lsblk

# 如果是ext4文件系统,直接扩展(支持在线扩容)
resize2fs /dev/vda1

# 如果是xfs文件系统
xfs_growfs /

大多数云服务商支持系统盘在线扩容,不需要停机。数据盘扩容后要手动执行文件系统扩展才能生效。

防患于未然

磁盘满了之后补救很被动,建议设置监控告警:在云控制台配置磁盘使用率超过80%时告警,留出足够时间提前处理,而不是等到100%出了问题再来救火。