超高性能的物理机
从训练到推理,全栈GPU护航您的AI之旅
安全可靠且超五星的服务器托管服务
海量资源,提供多种线路可选
安全稳定、可弹性扩展的高性能云服务器
火数云3.2Ghz频率高性能独立服务器
快速、稳定、可靠的全球加速服务
运维人的命也是命,别再让磁盘报警在凌晨3点吵醒你了。
凌晨2:47,你被一连串的报警短信炸醒。登录服务器,执行df -h,看到/分区使用率100%。再执行touch test,系统冷冷地回了一句:No space left on device。
df -h
/
touch test
No space left on device
你懵了。明明上周刚清理过日志,业务流量也没有暴涨,这凭空消失的磁盘空间到底去哪了?
别急。这不是玄学,这是一场与Linux文件系统的博弈。今天,我将带你用3分钟定位真凶,并奉上一套永久预防方案,让磁盘爆满从此成为历史。
df -h告诉你满了,但它不告诉你文件在哪里。
很多新手会直接执行du -sh *去根目录下挨个查,这在数据量大的服务器上可能会卡死,甚至导致负载飙升。
du -sh *
正确的排查流程应该是这样的:
快速定位大目录(只统计1级目录):
du -h --max-depth=1 / | sort -hr | head -10
这条命令只会统计根目录下第一级文件夹的大小,并排序展示最大的前10个。通常,罪魁祸首就在/var、/home或者/tmp里。
/var
/home
/tmp
循线追踪:比如发现/var很大,继续深入:
du -h --max-depth=1 /var | sort -hr
有时候,du查出来的总大小,跟df显示的已用大小对不上。如果差了几十G,恭喜你,遇到了文件已删除但进程未释放的情况。
du
df
经典场景:你删除了一个巨大的日志文件(比如/var/log/nginx/access.log),但Nginx进程还在运行,它依然持有这个文件的句柄。空间实际上并未释放。
/var/log/nginx/access.log
破局命令:
lsof | grep deleted | awk '{print $7}' | sort -hr | head -10
或者使用更现代的:
lsof +L1 | awk '{print $7, $1, $NF}' | sort -hr
看到输出里那些(deleted)的文件了吗? 找到它们对应的进程ID(PID),重启该服务,磁盘空间就会瞬间释放。不需要重启服务器!
(deleted)
如果磁盘空间没对上,或者du查出来确实满了,但没看到特别大的单个文件。那很可能是小文件太多,占满了inode。
执行:
df -i
如果IUsed接近100%,说明你的inode耗尽了。这种情况多发生在缓存目录、邮件队列或Session存储目录。
IUsed
100%
统计哪个目录的小文件最多:
for i in /*; do echo $i; find $i -type f | wc -l; done | grep -v "^0$"
找出那个文件数量百万级的目录,然后设置定时任务清理过期缓存文件。
根据我处理过的上千次磁盘告警,以下几个地方是最容易忽略的重灾区:
Docker/Containerd(容器杀手):
位置:/var/lib/docker/overlay2 或 /var/lib/containerd
/var/lib/docker/overlay2
/var/lib/containerd
真凶:僵尸容器、未清理的镜像、容器内产生的core dump。
解药:
docker system prune -a -f # 清理所有未使用的镜像和容器(注意!确认没有持久化数据)
Journald日志(系统日志杀手):
位置:/var/log/journal
/var/log/journal
真凶:Systemd疯狂记录debug级别的日志,且没有轮转限制。
解药:修改/etc/systemd/journald.conf,设置 SystemMaxUse=5G,然后 systemctl restart systemd-journald。
/etc/systemd/journald.conf
SystemMaxUse=5G
systemctl restart systemd-journald
Core Dump(崩溃杀手):
位置:/cores 或程序运行目录
/cores
真凶:程序崩溃生成的core文件,一个可能几个G。
解药:限制core文件大小或关闭生成:ulimit -c 0。
ulimit -c 0
找到问题只是第一步,我们要的是永远不被吵醒。
检查/etc/logrotate.conf,确保关键日志配置了compress(压缩)和maxsize(按大小切割)。不要只按天轮转,如果某天流量暴增,按天轮转会直接撑爆磁盘。建议增加maxsize 500M。
/etc/logrotate.conf
compress
maxsize
maxsize 500M
不要等到磁盘满(100%)才报警。设置3级告警:
Warning(80%):发邮件,进入待处理清单。
Critical(90%):发短信/电话,立即登录查看。
Emergency(95%):自动执行清理脚本(比如删除7天前的tmp文件)。
写一个脚本/usr/local/bin/disk_clean.sh,设置crontab每小时执行一次:
/usr/local/bin/disk_clean.sh
#!/bin/bash # 清理超过7天的日志 find /var/log/ -name "*.log" -mtime +7 -exec truncate -s 0 {} \; # 清理超过3天的tmp文件 find /tmp -type f -atime +3 -delete # 重启释放句柄的进程(谨慎使用) systemctl reload nginx
服务器磁盘爆满,本质上是熵增的过程。只要业务在跑,日志就在增长,文件就在产生。
记住今天的三板斧:
lsof | grep deleted 查幽灵文件。
lsof | grep deleted
du -h --max-depth=1 查显形大文件。
du -h --max-depth=1
df -i 查小文件海啸。
行动号召:现在,立刻登录你的服务器,执行一遍上述命令。看看有没有隐藏的炸弹?如果这篇文章帮你省下了半夜起床的焦虑,点赞、在看、转发给还在受苦的运维兄弟吧!
前言:那个让人崩溃的深夜
凌晨2:47,你被一连串的报警短信炸醒。
登录服务器,执行
df -h,看到/分区使用率100%。再执行
touch test,系统冷冷地回了一句:No space left on device。你懵了。明明上周刚清理过日志,业务流量也没有暴涨,这凭空消失的磁盘空间到底去哪了?
别急。这不是玄学,这是一场与Linux文件系统的博弈。今天,我将带你用3分钟定位真凶,并奉上一套永久预防方案,让磁盘爆满从此成为历史。
第一步:不要被
df -h骗了(排查逻辑)df -h告诉你满了,但它不告诉你文件在哪里。很多新手会直接执行
du -sh *去根目录下挨个查,这在数据量大的服务器上可能会卡死,甚至导致负载飙升。正确的排查流程应该是这样的:
快速定位大目录(只统计1级目录):
这条命令只会统计根目录下第一级文件夹的大小,并排序展示最大的前10个。通常,罪魁祸首就在
/var、/home或者/tmp里。循线追踪:
比如发现
/var很大,继续深入:第二步:找到那些“看不见”的巨人(真实案例)
有时候,
du查出来的总大小,跟df显示的已用大小对不上。如果差了几十G,恭喜你,遇到了文件已删除但进程未释放的情况。经典场景:
你删除了一个巨大的日志文件(比如
/var/log/nginx/access.log),但Nginx进程还在运行,它依然持有这个文件的句柄。空间实际上并未释放。破局命令:
或者使用更现代的:
看到输出里那些
(deleted)的文件了吗? 找到它们对应的进程ID(PID),重启该服务,磁盘空间就会瞬间释放。不需要重启服务器!第三步:深度扫描“小文件海啸”
如果磁盘空间没对上,或者
du查出来确实满了,但没看到特别大的单个文件。那很可能是小文件太多,占满了inode。执行:
如果
IUsed接近100%,说明你的inode耗尽了。这种情况多发生在缓存目录、邮件队列或Session存储目录。统计哪个目录的小文件最多:
找出那个文件数量百万级的目录,然后设置定时任务清理过期缓存文件。
第四步:常见的“隐形杀手”盘点
根据我处理过的上千次磁盘告警,以下几个地方是最容易忽略的重灾区:
Docker/Containerd(容器杀手):
位置:
/var/lib/docker/overlay2或/var/lib/containerd真凶:僵尸容器、未清理的镜像、容器内产生的core dump。
解药:
Journald日志(系统日志杀手):
位置:
/var/log/journal真凶:Systemd疯狂记录debug级别的日志,且没有轮转限制。
解药:修改
/etc/systemd/journald.conf,设置SystemMaxUse=5G,然后systemctl restart systemd-journald。Core Dump(崩溃杀手):
位置:
/cores或程序运行目录真凶:程序崩溃生成的core文件,一个可能几个G。
解药:限制core文件大小或关闭生成:
ulimit -c 0。终极方案:先止血,再治本(预防与监控)
找到问题只是第一步,我们要的是永远不被吵醒。
1. 日志轮转(Logrotate)配置优化
检查
/etc/logrotate.conf,确保关键日志配置了compress(压缩)和maxsize(按大小切割)。不要只按天轮转,如果某天流量暴增,按天轮转会直接撑爆磁盘。建议增加
maxsize 500M。2. 监控告警分级
不要等到磁盘满(100%)才报警。设置3级告警:
Warning(80%):发邮件,进入待处理清单。
Critical(90%):发短信/电话,立即登录查看。
Emergency(95%):自动执行清理脚本(比如删除7天前的tmp文件)。
3. 自动化清理脚本(懒人必备)
写一个脚本
/usr/local/bin/disk_clean.sh,设置crontab每小时执行一次:结语
服务器磁盘爆满,本质上是熵增的过程。只要业务在跑,日志就在增长,文件就在产生。
记住今天的三板斧:
lsof | grep deleted查幽灵文件。du -h --max-depth=1查显形大文件。df -i查小文件海啸。行动号召:
现在,立刻登录你的服务器,执行一遍上述命令。看看有没有隐藏的炸弹?如果这篇文章帮你省下了半夜起床的焦虑,点赞、在看、转发给还在受苦的运维兄弟吧!