df 与 du 的分工
磁盘空间排查要成对使用这两个命令:df 站在文件系统视角,告诉你每个挂载点总量、已用、可用以及 inode 消耗情况;du 站在目录视角,逐层统计实际占用,用来自上而下找出是哪个目录在膨胀。只跑其中一个往往得出结论错误——比如 df 显示写满而 du 怎么都找不到大头,那通常是文件已删除但进程仍持有句柄。空间之外,inode 也是一种会被耗尽的资源,同样需要盯着。
基本信息
| df 常用写法 | df -h 按可读单位,df -i 看 inode,df -T 带文件系统类型 |
|---|---|
| du 常用写法 | du -sh 目录汇总,du -xh --max-depth=1 只看一层 |
| 排序技巧 | 结果管道接排序与取头部,快速锁定大块头 |
| 跨文件系统 | du 加 -x 不跨挂载点,避免把挂载进去的目录算进来 |
| 权限提示 | 非 root 下部分目录无法统计,可忽略报错但会低估占用 |
典型使用场景
- 告警响应:收到磁盘使用率告警后先确认是哪个挂载点
- 定位增长来源:从顶层目录逐层下钻,找出实际占用最大的目录
- 清理前评估:确认可清理目录的规模,避免清错对象
- 排查写入失败:应用报无法写入时先看是空间不足还是 inode 用尽
- 交付巡检:记录各挂载点与 inode 使用率作为基线
- 日志治理:确认日志目录占用,决定是否调整轮转策略
典型用法
典型用法
df -hT | grep -v tmpfs # 看各挂载点容量与类型
df -i / | tail -1 # 看根分区 inode 使用情况
du -xh --max-depth=1 /var 2>/dev/null | sort -rh | head # 找占用最大的子目录
du -sh /var/log /var/cache /home/* 2>/dev/null | sort -rh | head
du -xh --max-depth=1 /data 2>/dev/null | sort -rh | head -5
ls -lh /var/log/myapp/ | head # 再看具体文件大小df 输出逐列读法
| 列 | 含义 | 异常特征 |
|---|---|---|
| Filesystem | 设备或挂载源 | 结合挂载点确认对应哪块盘 |
| Size | 该文件系统总容量 | 与预期不符说明分区规划有偏差 |
| Used / Avail | 已用与可用 | 可用接近零时需要立即处理 |
| Use% | 使用率 | 长期高位应做容量规划 |
| Mounted on | 挂载点 | 定位到具体目录 |
| IUse%(df -i) | inode 使用率 | 接近满时有空间也写不了文件 |
df 显示写满但 du 找不到对应文件时,按「已删除但仍被进程占用」排查:进程持有句柄时空间不会释放,常见于日志文件被直接删除。找到持有进程后重启或让其重开文件即可回收空间。
内存文件系统不计入磁盘占用,但它会占用内存,容量异常时要在同一张表里一并核对。inode 用尽的表现和磁盘写满很像,两者都报写入失败,必须分别用容量与 inode 两个视角确认。