Linux 磁盘满了?用 df 和 du 一步步定位

Cold 发布于 2018-07-08 25 次阅读 291 字 预计阅读时间: 1 分钟 Linux服务器


服务器报警磁盘使用率 100%,网站写日志失败,MySQL 也起不来。记录一下定位过程。

第一步:df 看哪个分区满了

df -h
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/vda1        40G   40G     0 100% /

根分区满了。注意 /dev/vda1,别去看 tmpfs 那些。

第二步:du 逐层找大目录

du -h --max-depth=1 / | sort -hr | head -20

从根开始,一层层往下:

du -h --max-depth=1 /var | sort -hr | head
du -h --max-depth=1 /var/log | sort -hr | head

最后发现 /var/log/mysql/error.log 有 20 多个 G。原因是 MySQL 报错一直刷,日志没轮转。

第三步:处理

# 清空日志(别直接 rm,进程还在写会占着 inode)
> /var/log/mysql/error.log

# 或者用 truncate
truncate -s 0 /var/log/mysql/error.log

如果 df 和 du 结果对不上

常见原因是有进程删了文件但没释放句柄:

lsof | grep deleted
# 找到对应进程,重启或 kill 掉,空间才会释放

预防

  • 配 logrotate,按天/大小轮转,保留 7~30 天
  • 监控磁盘使用率,80% 就报警
  • 日志目录单独分区,别和系统盘混用
  • 临时文件目录定期清理
和喜欢的一切在一起~
最后更新于 2018-07-08