1. 为什么需要关注文件夹占用空间?
在Linux服务器运维工作中,磁盘空间管理是一项基础但至关重要的任务。想象一下这样的场景:凌晨3点,监控系统突然报警显示磁盘使用率超过90%,而你的应用正在批量处理重要数据。此时快速定位"罪魁祸首"文件夹的能力,直接决定了能否避免服务中断。
du(disk usage)命令是Linux系统自带的磁盘分析利器,与df命令不同,它专注于显示目录和文件的磁盘使用情况。通过多年的运维实践,我发现掌握du的高级用法可以解决以下典型问题:
- 突发性磁盘空间告警时快速定位大文件目录
- 定期清理日志前评估各日志目录的空间占比
- 迁移数据前统计文件夹实际大小以便规划存储
- 排查某些应用异常占用磁盘空间的根源
提示:在SSH远程连接服务器时,建议使用
screen或tmux运行长时间执行的du命令,防止网络中断导致前功尽弃。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础命令解析与常用参数
2.1 最简使用模式
最基本的命令形式是在目标目录执行:
bash复制du /path/to/directory
这会递归显示该目录下所有子目录的大小(默认以KB为单位)。但实际输出可能让人困惑——你会看到一长串数字,每行对应一个子目录,但缺乏可读性。
2.2 关键参数详解
经过多次踩坑,我总结出这些必知参数组合:
bash复制du -h --max-depth=1 /path
-h:人类可读格式(自动转换为KB/MB/GB)--max-depth=1:只显示指定目录的直系子目录统计
这个组合的输出类似:
code复制12K ./logs
1.2G ./uploads
24M ./config
1.4G .
2.3 进阶参数组合
对于生产环境排查,我常用这个"黄金组合":
bash复制du -sh * | sort -rh | head -10
-s:只显示总计大小-h:人类可读格式sort -rh:按人类可读的数字逆序排序head -10:显示前10大目录
这个命令能立即展示当前目录下占用空间最大的10个子项,在应急排查时特别高效。
3. 生产环境中的实战技巧
3.1 排除特定目录的扫描
在扫描包含大量小文件的目录(如/var)时,可以排除无关目录提升速度:
bash复制du -h --exclude="*.log" --max-depth=2 /var
我曾用这个方法将原本需要30分钟的扫描缩短到2分钟。注意:
- 通配符要加引号防止shell扩展
- 多个排除项可以用
--exclude多次指定
3.2 跨文件系统统计
默认情况下du会统计挂载点下的所有文件系统。如果只想统计当前文件系统:
bash复制du -x /mountpoint
这个技巧在分析Docker容器的volume时特别有用,避免统计到宿主机的其他挂载点。
3.3 与find命令配合使用
当需要找出特定类型的大文件时,可以结合find:
bash复制find /path -type f -size +100M -exec du -h {} + | sort -rh
这个命令会找出所有大于100MB的文件并显示它们的大小,按从大到小排序。
4. 性能优化与注意事项
4.1 处理海量小文件的技巧
在扫描包含数百万小文件的目录(如邮件服务器)时,常规du可能极慢。此时可以:
- 使用
-b参数以字节为单位统计(减少单位转换开销) - 通过
ionice降低IO优先级:
bash复制ionice -c 3 du -b /path
4.2 权限问题的解决方案
当遇到"Permission denied"错误时,可以:
- 使用
sudo提升权限(注意安全风险) - 通过
2>/dev/null忽略错误(不推荐) - 最佳实践是先用
find过滤可读目录:
bash复制find /path -type d -readable -exec du -sh {} +
4.3 输出结果的可视化
对于需要汇报的场景,可以将结果导入可视化工具:
bash复制du -h --max-depth=1 /path | tee /tmp/du.log | sort -rh
然后用ncdu工具生成交互式报告:
bash复制ncdu /path
5. 替代工具与进阶方案
5.1 ncdu - 交互式磁盘分析器
安装:
bash复制apt install ncdu # Debian/Ubuntu
yum install ncdu # RHEL/CentOS
使用:
bash复制ncdu /path
优势:
- 交互式界面支持导航和删除操作
- 扫描结果可导出/导入
- 显示进度条和预计剩余时间
5.2 dust - 更直观的可视化工具
Rust编写的现代替代品,安装:
bash复制cargo install du-dust
使用:
bash复制dust /path
特点:
- 树状图直观展示空间占用比例
- 彩色输出更易区分不同层级
5.3 自动化监控方案
对于关键目录,可以设置定期监控脚本:
bash复制#!/bin/bash
LOG_FILE="/var/log/disk_usage.log"
THRESHOLD="10G"
size=$(du -sh /target | cut -f1)
if [ "$(echo "$size > $THRESHOLD" | bc)" -eq 1 ]; then
echo "$(date) - 警告:/target 使用量 $size 超过阈值 $THRESHOLD" >> $LOG_FILE
# 添加自动清理或告警逻辑
fi
加入cronjob实现定期检查:
bash复制0 * * * * /path/to/monitor_script.sh
6. 常见问题排查实录
6.1 案例:du显示大小与df不一致
现象:du -sh /合计10G,但df -h显示根分区已用50G。
原因分析:
- 已删除但仍被进程占用的文件(lsof检查)
- 磁盘配额或压缩文件系统的影响
- 挂载点覆盖导致重复统计
解决方案:
bash复制lsof +L1 # 查看被删除但未释放的文件
6.2 案例:du卡住无响应
可能原因:
- 遇到损坏的符号链接循环
- NFS挂载点无响应
- 文件系统错误
应急处理:
bash复制timeout 60 du -sh /path # 强制超时
根治方案:
bash复制fsck /dev/sdX # 检查文件系统
6.3 案例:特殊文件的影响
当目录包含:
- 稀疏文件(sparse file)
- 压缩文件
- 快照或克隆文件
时,du的统计可能不符合预期。此时需要:
bash复制du --apparent-size # 显示逻辑大小而非磁盘占用
7. 最佳实践总结
经过多年运维实践,我总结出这些经验法则:
-
日常检查使用
du -h --max-depth=1足够 -
应急排查优先使用
du -sh * | sort -rh | head -
长期监控建议用
ncdu保存历史记录 -
对TB级目录扫描时:
- 使用
-x避免跨文件系统 - 通过
ionice降低IO优先级 - 考虑在业务低峰期执行
- 使用
-
关键生产环境应设置自动化监控脚本,提前预警磁盘空间问题
最后分享一个真实案例:某次MySQL突然崩溃,原因是/var/log下的审计日志暴涨占满磁盘。通过du -sh /var/* | sort -rh,我们30秒就定位到问题文件,比直接查看df快了10倍。这个经历让我深刻体会到熟练使用du的价值——它不仅是基础命令,更是运维人员的"瑞士军刀"。
