当前位置: 首页 > news >正文

从一到无穷大 #6 盘满排查过程

文章目录

  • 引言
  • df/du 原理
  • 排查思路
    • 文件系统预留空间
    • 进程占用句柄
    • 挂载覆盖

引言

核心在于执行df和du的时候发现显示的存储量完全不同,我本地系统盘有99G空间,du显示占用了45G,但是df却显示使用了99G,排查的过程本文所示。

先记录几条大多数时候有用命令,看完文章就知道为什么有时候是不管用的了hhh

  1. du -h / --exclude="data1" 2>/dev/null | grep '[0-9\.]\+G' 可以检查出目前/路径下目录的大小
  2. du -Sh ~ --max-depth=2 | sort -hr | head -10 可以递归的检查文件的大小
  3. find . -xdev -type f -size +100M 查找100M以上的文件
  4. find ~ -maxdepth 10 -type f -exec du -h {} + | sort -rh | head -10 最大文件top10

df/du 原理

从man page可以得到如下关键句:

df: df displays the amount of disk space available on the file system containing each file name argument.
du: Summarize device usage of the set of FILEs, recursively for directories.

从原理上讲,df是从super block直接读取该文件系统的元信息,简单的翻阅源码和执行下strace df -h后不难发现df实际是执行了statfs,这个系统调用用于返回已经挂载的文件系统的元信息。
在这里插入图片描述

而du则完全不同,其原理是调用递归遍历目录,调用newfstatat系统调用获取文件信息,这允许 可以跨越多个文件系统统计大小,但是目录中文件很多时速度很慢。

[1][2]中描述df/du原理也很详细

排查思路

了解df/du原理后我们知道有三个情况可能这两种情况显示不同

文件系统预留空间

为了预防紧急情况,linux ext文件系统会预留部分硬盘空间,具体预留的数值可以通过tune2fs -l [dev_name] | grep "Reserved block count"查看,这里预留的空间会被df计算到已用空间中,从而导致df和du统计不一致。如果需要调整预留空间大小,我们可以使用tune2fs -m [size] [dev_name]来进行调整。

进程占用句柄

当一个文件被删除时,如果有别的进程正在使用它(占有句柄), 这个文件将不会被du统计到,但是这个文件被占用的磁盘空间却依然会被df统计到。这些文件,以及正在使用这些文件的进程可以通过lsof | grep deleted查到。当进程停止或者被kill时,这些空间将被释放。 暴力的执行kill -9 $(lsof |grep -i deleted | awk '{print $2}' | sort -u) 可以删除这些进程,

挂载覆盖

当将一个目录挂在到一个新的设备(硬盘)上时,如果这个目录里面已经有数据,那么这一部分数据不会被遍历到,自然也不会被du感知,在文件系统中也看不到这些数据,但是这些数据又是确实占用了磁盘空间,是能够被df所统计到的。这时候通过du/df统计原设备的空间使用情况,就会发现df统计到的比du要多。

因为我把数据盘挂载在了根目录中,解决的方案就是unmount后删除这部分目录,我在这部分释放了15G空间。

umount的时候可以会遇到busy的情况,

  1. 因为代码都在挂载的盘中,首先关闭vscode的所有终端
  2. 其次镜像存储都在挂载的盘中,关闭minikube:minikube stop; minikube delete
  3. 关闭 docker: systemctl stop docker
  4. 再检查与挂载设备关联的进程:lsof /data1

参考:

  1. http://sysunconfig.net/aixtips/df_du_diff_out.txt
  2. https://www.quora.com/What-is-the-difference-between-DU-and-DF-in-Linux
  3. umount卸载磁盘提示target is busy. (目标忙) 的问题解决方案
http://www.lryc.cn/news/63938.html

相关文章:

  • ChatGPT技术原理 第九章:数据集和训练技巧
  • NCR被攻击后服务中断!原是BlackCat勒索软件作祟
  • 带你认识什么是BMS(电池管理系统)
  • 安装Ubuntu22.04虚拟机的一些常见问题解决方法
  • 银河麒麟操作系统,安装Gitlab 基于docker
  • 基于Python实现个人手机定位分析
  • Unity Navgation系统杂记
  • [2021.11.9]lighteffect架构优化详细设计文档
  • 经典回归算法
  • Python两三行代码轻松批量添加~防韩还是很有必要的~
  • 开心消消乐
  • 有效日志管理在软件开发和运营中的作用
  • 【五一创作】【笔记】Git|如何将仓库中所有的 commit 合成一个?又名,如何清除所有 git 提交记录?(附 git rebase 机制的简要分析)
  • 如何写出高质量代码?
  • 外卖项目优化-01-redis缓存短信验证码、菜品数据、Spring Cache(注解开发缓存)、(注解开发)缓存套餐数据
  • Chapter1:控制系统数学模型(下)
  • 排序算法总结
  • java+jsp企业物流货运快递管理系统servlet
  • 【ROS仿真实战】获取机器人在gazebo位置真值的三种方法(三)
  • Winform从入门到精通(35)——FontDialog(史上最全)
  • AcWing 854. Floyd求最短路Floyd模板
  • Graph Theory(图论)
  • [Python]生成 txt 文件
  • GeoTools实战指南: 自定义矢量样式并生成截图
  • 深度学习超参数调整介绍
  • Bootloader
  • 安卓开发_广播机制_广播的最佳实践:实现强制下线功能
  • 国民技术N32G430开发笔记(10)- IAP升级 Application 的制作
  • [计算机图形学]材质与外观(前瞻预习/复习回顾)
  • Java 的简要介绍及开发环境的搭建(超级详细)