⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 飞天小牛肉 「小牛肉」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

大家比较常见的情况应该是内存或者 CPU 的告警,磁盘相对来说不那么容易出问题,毕竟大部分应用都不需要和磁盘交互,磁盘告警的示例如下:

一般遇到磁盘爆满的告警,第一步要做的就是确认告警信息是否正确,登录服务器,通过 df -Hl 查看:

可以看到 /dev/vda1 占据了 43G 的内存,和告警信息一致,接着我们就是要找到导致磁盘空间满的具体目录或文件

如何定位占用大量磁盘空间的目录或文件?

一种基础的做法是,在根目录下执行du -hs命令,列出各个目录的大小。

为了进一步细化,可以进入具体的目录重复该操作。这种方法虽然简单,但不够高效。

更优的方法是使用du命令的-d参数(或--max-depth参数),设置目录扫描的深度。扫描深度越大,输出的结果会越多,此时可以通过grep过滤不必要的信息。

du -h -d 2 | grep [GT] | sort -nr  
du -h --max-depth=2 | grep [GT] | sort -nr

这种方式可以快速筛选出以G或T为单位的大目录,并按大小排序。

另一种更高效的方法是使用find命令:

find / -type f -size +1G -exec du -h {} \;

相较于du,find更加灵活和快速。通过这两种方式,可以迅速定位占用磁盘空间的文件或目录。

磁盘空间不一致的情况

然而,事情并不总是这么简单。有时你可能会发现,使用find或du查找到的文件占用空间与df命令显示的磁盘使用量相差甚远。比如上图我们使用du -hs查看根目录下所有文件的总和就只有10G左右,但 df显示磁盘占用了37G,没有隐藏目录的情况下,剩余的空间去了哪里?

这种现象通常是由被删除的文件占用空间但未释放资源导致的。虽然文件被删除了,但系统还没有真正释放其占用的空间。

此时,我们可以使用lsof命令来检查是否有未完全释放的文件:

lsof +L1

从上图结果中可以看到,有一个被删除但仍占用约28G空间的日志文件。这是比较常见的情况。解决方法是重启相关应用(如Tomcat),以释放这些被占用的空间。

磁盘空间被系统保留

有时候,你可能还会发现df命令显示的Used和Available空间之和小于Total大小,似乎有部分空间”消失”了。

这实际上是Linux文件系统的安全机制。默认情况下,系统会为root用户预留5%的磁盘空间,用于紧急情况。这样可以确保关键应用(如数据库)在磁盘满时仍有少量空间,避免崩溃。

如果需要释放这部分保留空间,可以使用tune2fs命令调整预留空间的比例:

tune2fs -m 1 /dev/vda1

上述命令执行后将只保留 1G 的安全空间:

文章目录
  1. 1. 如何定位占用大量磁盘空间的目录或文件?
  2. 2. 磁盘空间不一致的情况
  3. 3. 磁盘空间被系统保留