首页/系统/Linux 内核与性能调优速查/定位大目录与大文件

定位大目录与大文件

du 按目录汇总排序找大目录(-x 限制同一文件系统),find 按大小筛大文件;两者配合快速定位空间去向。

定位空间去哪了

磁盘告警后的第一步是把用量拆开: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 快照能让容量增长归因变成对比而不是猜测:把带日期的输出存起来,告警时先看哪一层目录的增量最大。

易错点

  • du 与 df 差值常见来源:被删除仍被占用的文件、稀疏文件、文件系统保留块,先解释差值再动手清理
  • 扫全盘 find 有 IO 开销,业务高峰用 ionice 与 nice 降优先级,必要时限制在单目录范围内
  • 在 du 里不加 -x 会把挂载进来的其他文件系统一并统计,得出与实际占用不符的结论
  • 只删大文件不看增长来源,几小时后目录又涨回来,清理的同时要处理产生这些文件的策略

数据来源与参考

  • coreutils 文档 du(1)
  • findutils 文档 find(1)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌