一、问题背景
巡检服务器磁盘空间时,发现某台服务器根分区 / 使用率偏高。
执行查看:
df -h
输出如下:
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/vg_newroot-lv_newroot 90G 70G 21G 78% /
/dev/sda1 1014M 198M 817M 20% /boot
//10.1.1.195/DataCenter/backup 20T 15T 5.1T 75% /home
这里需要注意:/home 是单独挂载的网络存储,不占用根分区空间。
所以本次排查重点是根分区 / 本身。
二、定位根分区大目录
为了避免跨文件系统统计,需要使用 du -x 参数,只统计当前根分区。
du -xhd1 / 2>/dev/null | sort -h
输出如下:
32K /tmp
25M /opt
38M /etc
80M /topsec
2.9G /usr
3.0G /var
5.1G /root
59G /data
70G /
可以看到,根分区占用的大头并不是 /var/log,而是:
/data 59G
继续向下排查:
du -xhd1 /data 2>/dev/null | sort -h
输出:
837M /data/vehicle-report
58G /data/apache_hdfs_broker
59G /data
继续查看:
du -xhd1 /data/apache_hdfs_broker 2>/dev/null | sort -h
输出:
8.0K /data/apache_hdfs_broker/bin
12K /data/apache_hdfs_broker/conf
620K /data/apache_hdfs_broker/licenses
590M /data/apache_hdfs_broker/lib
58G /data/apache_hdfs_broker/log
58G /data/apache_hdfs_broker
问题已经很清楚:
/data/apache_hdfs_broker/log
日志目录占用了约 58G。
三、查看日志文件详情
执行:
ls -lh /data/apache_hdfs_broker/log
发现日志目录下存在大量历史日志,例如:
apache_hdfs_broker.log.2025-09-06
apache_hdfs_broker.log.2025-10-01
apache_hdfs_broker.log.2026-01-01
apache_hdfs_broker.log.2026-05-19
同时发现一个异常大的输出日志:
apache_hdfs_broker.out 32G
该文件属于 Broker 服务的标准输出日志,不是业务数据文件,可以清空内容,但不建议直接删除。
四、处理方式
1. 清空超大的 .out 文件
不要使用 rm 删除正在被进程写入的日志文件,避免文件句柄未释放导致空间不释放。
推荐使用:
: > /data/apache_hdfs_broker/log/apache_hdfs_broker.out
或者:
truncate -s 0 /data/apache_hdfs_broker/log/apache_hdfs_broker.out
这两种方式都是保留文件本身,只清空文件内容。
2. 删除历史归档日志
历史日志文件格式为:
apache_hdfs_broker.log.2026-05-18
apache_hdfs_broker.log.2026-05-19
如果需要删除超过 1 天的历史日志,可以执行:
find /data/apache_hdfs_broker/log -maxdepth 1 -type f \
-name "apache_hdfs_broker.log.20*" \
-mmin +1440 \
-delete
其中:
-mmin +1440
表示修改时间超过 1440 分钟,也就是超过 24 小时。
本次清理完成后,空间明显释放。
五、清理后验证
再次查看根分区:
df -h /
结果:
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/vg_newroot-lv_newroot 90G 13G 78G 15% /
查看 Broker 日志目录:
du -sh /data/apache_hdfs_broker/log
结果:
241M /data/apache_hdfs_broker/log
清理效果非常明显:
根分区使用率:78% -> 15%
Broker 日志目录:58G -> 241M
六、增加定时清理策略
为了避免后续再次出现根分区被日志打满的问题,增加 crontab 定时清理。
查看当前定时任务:
crontab -l
新增如下策略:
# 清理 /data/apache_hdfs_broker/log
0 6 * * * find /data/apache_hdfs_broker/log -maxdepth 1 -type f -name "apache_hdfs_broker.log.20*" -mmin +10080 -delete
10 6 * * * find /data/apache_hdfs_broker/log -maxdepth 1 -type f -name "apache_hdfs_broker.out" -size +3G -exec sh -c ': > "$1"' _ {} \;
说明:
第一条:
0 6 * * * find /data/apache_hdfs_broker/log -maxdepth 1 -type f -name "apache_hdfs_broker.log.20*" -mmin +10080 -delete
表示每天 06:00 删除超过 7 天的历史归档日志。
10080 分钟 = 7 天
第二条:
10 6 * * * find /data/apache_hdfs_broker/log -maxdepth 1 -type f -name "apache_hdfs_broker.out" -size +3G -exec sh -c ': > "$1"' _ {} \;
表示每天 06:10 检查 apache_hdfs_broker.out 文件,如果超过 3G,则自动清空内容。
注意,这里不是删除文件,而是清空文件内容,更适合正在运行的服务日志文件。
七、总结
本次根分区空间占用高的根因是:
/data/apache_hdfs_broker/log 目录下历史日志长期堆积,
同时 apache_hdfs_broker.out 标准输出日志异常膨胀至 32G。
处理思路如下:
1. 使用 df -h 确认根分区使用率;
2. 使用 du -xhd1 / 定位根分区大目录;
3. 逐层定位到 /data/apache_hdfs_broker/log;
4. 清空 apache_hdfs_broker.out 大日志文件;
5. 删除历史归档日志;
6. 增加 crontab 定时清理策略;
7. 复查根分区空间恢复正常。
最终效果:
根分区使用率从 78% 降至 15%,
日志目录从 58G 降至 241M,
问题处理完成。
这类问题的核心不是上来就删文件,而是先搞清楚:
哪个目录大、哪些文件能删、哪些文件只能清空、哪些文件绝对不能碰。
生产环境里,删得快不算本事,删得准才是真功夫。