问题描述:

今天看到磁盘告警了,登录上服务器查看df -h,看到磁盘占用了80%多,然后就是使用du -sh对根下每个目录进行统计大小,却发现所有目录加起来也不过50G,但是使用df的时候总共占了快200G

问题比较奇怪,通过deepseek搜了一些答案,但通过答案并没有解决,但是也获得一些提示,大概率是因为某个文件删除了但是空间没有释放,然后通过业务侧排查,发现该节点上有个服务的日志打得非常频繁,故猜测可能是此服务的问题,然后在业务低峰期重启了该服务,问题顺利解决,磁盘变为20%占用,但其中的深层次原因目前还不知道是什么

下面是deepseek推荐的一些解决方法(是否可以使用需结合生产环境实际情况):


1. 已删除但未释放的文件(最常见原因)

  • 现象:文件被删除后,若仍有进程正在使用它,该文件占用的磁盘空间不会立即释放。

  • 检查方法

    sudo lsof +L1 | grep deleted  # 查看被删除但仍被进程占用的文件
    
  • 解决方案

    • 重启持有文件的进程(或直接终止进程)。
    • 系统重启后空间会自动释放。

2. 文件系统元数据和保留空间

  • 文件系统开销df 统计的已用空间包括:

    • 元数据(inode 表、日志等)。
    • 保留块(root 用户预留的空间,默认为总容量的 5%)。
  • 查看保留空间(ext4 文件系统示例):

    sudo tune2fs -l /dev/sdXX | grep "Reserved block count"
    

3. 挂载点覆盖

  • 现象:根目录 (/) 下的子目录(如 /home/var)可能是独立挂载的分区。

  • 影响

    • df -h / 显示根分区的总使用量(150G)。
    • du -sh / 不统计其他挂载点下的文件(如 /home 的数据不计入 50G)。
  • 检查方法

    df -hT  # 查看所有挂载点及对应的分区
    mount | grep "^/"  # 查看根目录下的挂载点
    

4. 隐藏文件或权限限制

  • du 可能遗漏

    • 无权限访问的文件(需用 sudo du -sh /)。
    • 挂载点下的隐藏文件(如 /proc/sys 等虚拟文件系统)。
  • 验证命令

    sudo du -sh --exclude=/proc --exclude=/sys /  # 排除虚拟文件系统
    

5. 稀疏文件(Sparse Files)

  • 现象:文件实际占用磁盘空间小于逻辑大小(如虚拟机磁盘文件)。

  • 影响du 报告实际占用空间,df 反映文件系统级别的使用量。

  • 检查稀疏文件

    sudo find / -type f -printf "%S\t%p\n" | grep -v "^1.000000"  # 查找稀疏文件
    

6. 文件系统错误或日志

  • 日志文件:如 ext4 的 journal 日志可能占用空间。

  • 文件系统损坏:罕见情况下需检查文件系统:

    sudo fsck -f /dev/sdXX  # 卸载分区后执行
    

排查步骤总结

  1. 检查挂载点:确认 du 是否漏计其他分区的数据。
  2. 查找未释放文件sudo lsof +L1 | grep deleted
  3. 使用 sudo 运行 du:确保统计所有文件。
  4. 排除虚拟目录sudo du -sh --exclude=/proc --exclude=/sys /
  5. 分析保留空间tune2fs -l /dev/sdXX

💡 提示:若差异由未释放文件引起,重启系统是最直接的解决方法。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐