排查Linux服务器磁盘占用,核心步骤就三步:先用df -h看哪个分区满了,再用`du -sh ./定位大目录,最后用find和lsof`锁定具体文件。 很多人一看到磁盘告警就想删文件,但盲目删除容易误伤,按顺序排查才靠谱。
linux服务器磁盘空间占用查看,从分区到文件一步步来
Linux服务器磁盘用满,网站会卡,日志写不进去,数据库直接报错,这时候你需要先弄清楚:到底是哪个分区满了,哪个目录在疯狂占空间,最终哪个文件该清理。
第一步:df -h确认分区使用率
df -h是看文件系统整体使用情况的,执行后你会看到类似这样的输出:
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 38G 1.2G 97% /
Use%那一列是关键信息:
- 超过80%,就需要关注趋势
- 超过90%,基本已经处于危险状态
- 超过97%,写日志都可能失败
这里有个容易踩的坑:df看的是分区,不是具体文件,比如/data是独立分区,根分区满了就和/data无关;反过来,如果满了,但/data还有很多空间,你只需要排查根分区下的目录,重点看/var、/tmp、/usr这些高频目录。
挂载点决定排查范围
执行df -h后,注意Mounted on列,如果某个目录单独挂在独立磁盘上,比如/data有1T空间,那你不需要去/data里找占用,反之,如果所有目录都挂在上,排查范围就是整个根目录,这一步能避免你在无关目录里白费力气。
linux服务器哪个文件占用空间大?用du命令逐级定位
df给了方向,现在要动手找文件,这里用到最常用的

du命令。
du -sh :找出目录下的大块头
在需要排查的目录下执行:
cd /var
du -sh ./ --exclude='.' | sort -hr
du -sh会汇总每个子目录的大小,sort -hr按人类可读的大小从大到小排序,输出结果里你会一眼看到哪个目录最占空间,
3G ./log
800M ./cache
760M ./lib
然后继续cd /var/log,再用同样的命令往下钻,直到找到具体文件,这个过程就是“剥洋葱”,一层层下去,最终定位到占用大户。
du和find配合,快速锁定大文件
有时候你只想找某个目录下超过1G的文件,直接用find更高效:
find /var -type f -size +1G -exec ls -lh {} ;
这条命令会列出/var下所有超过1G的文件,并显示大小和路径,如果文件特别多,可以加-mtime按时间过滤,比如只看最近7天修改过的:
find /var -type f -size +500M -mtime -7 -exec ls -lh {} ;
这样查出来的文件,多半是日志、备份包或者临时文件,清理前先用du确认是否有进程正在使用,避免误删。
linux服务器删除文件后空间没释放怎么办?lsof找残留进程
这个场景特别常见:你用du找到了一个大文件,比如/var/log/syslog,然后执行rm -rf删掉了,但df -h一看,空间还是没变,怎么回事?
文件被进程占用,删除后依然占据磁盘
Linux里删除文件,实际上是解除目录项链接,如果这个文件正被某个进程打开,内核会保留它的inode,直到进程关闭文件句柄,所以你删了文件,但磁盘空间还一直被占着,直到相关进程重启。
用lsof

命令找出正在占用已删除文件的进程:
lsof | grep deleted
输出的最后一列会显示“(deleted)”标记。
java 2314 root 1w REG 253,0 1048576 788961 /tmp/xxx.log (deleted)
这时你有两个选择:
- 重启对应的进程,让系统释放句柄
kill那个进程,但注意确认进程归属和业务影响
如果进程不能重启,比如数据库,可以尝试用> /proc/2314/fd/1清空句柄内容,也能腾出空间。直接kill生产环境进程要谨慎,先看清楚进程是什么。
linux服务器清理磁盘空间实操:日志、缓存、core文件
找到文件后,清理也有讲究,很多人直接rm,其实分场景处理更安全。
日志文件:用logrotate或truncate
日志文件是磁盘占用的头号嫌疑犯,尤其是/var/log/下面的messages、syslog、nginx/access.log,长期不轮转会涨到好几个G,推荐使用系统自带的logrotate工具,按天或按大小切割日志,保留最近几份,旧日志自动压缩清理。
如果日志还在写入,比如nohup.out,不能直接删,先用truncate命令清空:
truncate -s 0 /root/nohup.out
这样能立刻释放空间,而且不打断正在写入的进程。
缓存和临时文件:yum、pip、/tmp
yum缓存:执行yum clean all,清理/var/cache/yum下的rpm包pip缓存:执行pip cache purge,清掉下载的安装包/tmp目录:系统临时文件集中地,但别误删正在使用的进程句柄,重启后自动释放
对于容器环境,还要检查docker system df,悬空镜像和构建缓存常常占用几十G空间。

core dump文件:排查后删除
程序崩溃时可能生成core dump核心转储文件,动不动就几百M甚至几个G,在/data目录或者进程启动目录下,找到core.格式的文件,确认没有调试价值直接删除,为避免未来再次生成,可以设置ulimit -c 0限制core文件大小。
关于linux服务器文件占用排查的常见问题
问题1:为什么df和du显示的空间大小不一致?
因为df统计的是整个文件系统已用块,du统计的是所有文件实际占用的数据量,被删除但未被释放的文件、文件系统保留块、元数据不一致都会导致两者有差异,只要出现df很大但du很小,基本就是有文件被删但句柄没释放,用lsof | grep deleted排查。
问题2:linux服务器哪个文件占用空间大,用命令怎么查?
在不确定根分区还是数据盘满了的情况下,先df -h确认挂载点,然后进入对应目录执行du -sh ./ | sort -hr逐级排查,再配合find /目录 -type f -size +1G -exec ls -lh {} ;直接列出超1G的大文件,两步组合覆盖绝大多数场景。
问题3:rm大文件后磁盘空间没释放,除了lsof还有别的方法吗?
可以执行du -sh /proc//fd 2>/dev/null | sort -hr查看每个进程文件描述符的数据量,找到占用最多的进程ID,确认进程是否正常,如果业务允许,重启进程即可释放空间;如果无法重启,用> /proc/PID/fd/文件描述符编号方式清空内容。
Linux服务器磁盘占用排查,df定位分区,du定位目录,find定位文件,lsof处理死文件”这个顺序,再大的磁盘也能找到根源。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/882828.html

