定位空间去哪了
磁盘告警后的第一步是把用量拆开:du 自顶向下按目录汇总大小并排序,找出哪个目录在涨;find 按文件大小、时间筛出具体的单个大文件。两者的差别在于视角:du 解决“是哪一层目录”,find 解决“是哪个文件”。-xdev/-x 用于限制在同一文件系统内统计,避免把挂载进来的其他文件系统算进去。
基本信息
| 目录汇总 | du -x -h -d1 | sort -h 取末尾若干行 |
|---|---|
| 大文件 | find -xdev -type f -size +1G |
| 限同文件系统 | -xdev(find)/ -x(du) |
| 注意 | du 求和与 df 显示常有差值 |
| 输出格式 | find 用 -printf 控制列,便于排序 |
典型使用场景
- 告警后定位哪一层目录在增长,决定是清理还是扩容
- 找单个巨型文件:日志、core dump、临时导出文件是常见嫌疑
- 清理依据:按修改时间筛出长期未访问的历史文件
- 排查 du 与 df 不一致:定位被删除但仍被进程占用的文件
- 容量变化归因:对比不同时间点的 du 快照,找出增长来源
常用命令
常用命令
sudo du -x -h -d1 /data 2>/dev/null | sort -h | tail -20 # 找大目录
sudo du -x -h -d2 /data/logs 2>/dev/null | sort -h | tail # 再下一层
sudo find /data -xdev -type f -size +1G -printf '%s %p\n' 2>/dev/null | sort -rn | head
sudo find /data -xdev -type f -mtime +90 -size +100M | head # 老的大文件
lsof +L1 2>/dev/null | head -10 # 已删除但仍占空间
sudo ionice -c3 nice -n19 du -x -h -d1 /data | sort -h | tail # 低优先级扫描du 与 df 差值来源
| 来源 | 说明 | 验证方式 |
|---|---|---|
| 已删除但被占用 | 进程仍持有文件句柄,空间没释放 | lsof +L1 或 /proc/<pid>/fd |
| 稀疏文件 | 逻辑大小远大于实际占用 | du 与 ls 对比 |
| 文件系统保留块 | ext4 默认保留约 5% | tune2fs -l 看 Reserved block count |
| 挂载点嵌套 | 统计口径被其他文件系统干扰 | 加 -xdev 重新统计 |
扫描大目录本身是重 IO 操作,业务高峰建议用 ionice -c3 与 nice 压低优先级,或者先只统计目录的 mtime 变化来缩小范围。
删除文件前确认没有进程持有句柄:删了空间不释放是常见困惑,此时需要让进程重开文件或重启服务。
每天留一份 du 快照能让容量增长归因变成对比而不是猜测:把带日期的输出存起来,告警时先看哪一层目录的增量最大。