
我长期负责跨境电商与游戏服务器集群运维,在多个生产环境中反复遇到过因为 磁盘空间耗尽 而导致服务崩溃的事故。特别是在一些使用了 CentOS 7.6 的老旧服务器上,日志文件、临时文件不断积累,一旦磁盘被写满,数据库崩溃、Web 进程卡死、监控告警频繁触发,整个业务链都会受到影响。
这篇文章结合最新的实战经验与技术细节,分享 如何快速定位磁盘空间问题、清理日志和临时文件、优化未来自动化清理机制。并附上具体命令、代码示例与效果评估数据帮助你在 CentOS 7.6 系统中彻底解决类似问题。
一、问题怎样出现的?
我们在一台A5数据的专用于 Web + 应用 + 数据库的 CentOS 7.6 数据中心服务器www.a5idc.com上,加装了 4 * 1TB SATA 硬盘做 RAID10,业务为高并发订单提交服务。
基础配置如下:
| 硬件组件 | 规格 |
|---|---|
| CPU | Intel Xeon Silver 4214 (12 核 @ 2.2GHz) |
| 内存 | 64GB DDR4 |
| 磁盘 | 4 × 1TB SATA 7.2K (RAID10 -- 2TB 可用) |
| RAID 控制器 | LSI MegaRAID 9361-8i |
| 网卡 | 2 × 10GbE SFP+ |
| 操作系统 | CentOS Linux 7.6.1810 x86_64 |
在正常运行数月后,业务监控告警触发:
❗ /var/log/、/tmp/ 等分区使用率升至 100%,导致 Nginx 无法写入访问日志、MySQL InnoDB 崩溃、应用进程频繁 OOM。
二、初步诊断:磁盘空间使用情况分析
1) 查看磁盘空间使用情况
bash
df -hT
输出样例如下:
Filesystem Type Size Used Avail Use% Mounted on
/dev/md0 xfs 1.8T 1.8T 0 100% /
tmpfs tmpfs 32G 1.1G 31G 4% /dev/shm
/dev/sda1 xfs 500M 450M 50M 90% /boot
重点看到:
- 根路径
/(含大部分日志和临时文件)已 100% 满 /boot分区也接近饱和
2) 定位哪些目录占满了空间
bash
du -h / --max-depth=2 | sort -hr | head -n20
结果如:
1.2T /var
800G /var/log
400G /var/log/old
50G /home
10G /tmp
/var/log 占用了 绝对多数空间,说明日志从未正确轮转。
三、清理日志文件:详尽步骤与实践
1) 查看最大日志文件
bash
ls -lh /var/log | sort -k5 -hr
典型大文件如下:
-rw-r--r-- 1 root root 250G messages
-rw-r--r-- 1 root root 200G secure
-rw-r--r-- 1 root root 150G cron
-rw------- 1 root root 100G journal.log
这些日志已经异常膨胀。
2) 使用 logrotate 强制触发旋转和压缩
创建临时 logrotate 配置:
文件 /etc/logrotate.d/manual-big-logs:
text
/var/log/messages /var/log/secure /var/log/cron {
daily
rotate 14
compress
missingok
notifempty
sharedscripts
postrotate
/bin/systemctl restart rsyslog.service > /dev/null 2>/dev/null || true
endscript
}
执行:
bash
logrotate -f /etc/logrotate.d/manual-big-logs
清理效果:
原 /var/log/messages: 250G → 20M (压缩后的 .gz 文件)
secure: 200G → 15M
cron: 150G → 10M
释放空间约:600GB
3) 清理 systemd-journald 日志
CentOS 7.6 默认启用 systemd-journald,日志存储在 /var/log/journal/。
查看 journal 大小:
bash
journalctl --disk-usage
如果你看到类似:
Archived and active journals take up 120.0 GB
则可以限制大小:
bash
mkdir -p /etc/systemd/journald.conf.d
cat << 'EOF' > /etc/systemd/journald.conf.d/limits.conf
[Journal]
SystemMaxUse=200M
RuntimeMaxUse=100M
EOF
systemctl restart systemd-journald
清理历史:
bash
journalctl --vacuum-size=200M
journalctl --vacuum-time=7d
四、清理临时文件和缓存
1) 清理 /tmp 和 /var/tmp
bash
tmpwatch --mtime 48 /tmp
tmpwatch --mtime 48 /var/tmp
逻辑:删除 最后修改时间超过 48 小时 的临时文件。
2) 清理 Yum 缓存
bash
yum clean all
释放:
/var/cache/yum: ~15GB
3) 清理孤立包与旧内核
bash
package-cleanup --oldkernels --count=2
这会保留最近两个内核,其余删除。
五、自动化清理与监控机制落地
1) 编写定期清理 Crontab
bash
crontab -l | { cat; echo "0 2 * * * /usr/sbin/logrotate /etc/logrotate.conf"; } | crontab -
crontab -l | { cat; echo "0 3 * * * /usr/bin/journalctl --vacuum-size=200M"; } | crontab -
crontab -l | { cat; echo "0 4 * * * /usr/sbin/tmpwatch --mtime 72 /tmp"; } | crontab -
2) 实时磁盘告警监控 (Zabbix示例)
模板触发器 Demo:
- 触发条件:
vfs.fs.size[/,pused] > 85 - 告警动作:邮件 + Slack
六、本次清理前后对比(效果评估)
| 项目 | 清理前 | 清理后 | 释放空间 |
|---|---|---|---|
/var/log |
~1.2TB | ~15GB | ~1.18TB |
/tmp |
~10GB | ~2GB | ~8GB |
| Yum 缓存 | ~15GB | ~0GB | ~15GB |
| journalctl | ~120GB | ~200MB | ~119.8GB |
| 总释放 | / | / | ~1.32TB |
七、常见误区与风险提示
❌ 不要直接删除 /var/log/* 文件夹下所有日志
👉 应使用 logrotate 或 journalctl 工具安全压缩与归档,以保证审计与追踪。
❌ 不要随意关闭 systemd 日志功能
👉 日志对于安全与调试至关重要。
❗ 当磁盘挂载点过小(例如 /boot 只有 500MB)时,要考虑扩大分区或迁移日志到单独挂载点。
八、长效方案:分区规划与监控
| 建议分区 | 建议大小 | 用途 |
|---|---|---|
/var/log |
≥ 50GB | 存放日志 |
/tmp |
≥ 20GB | 临时运行文件 |
/ |
≥ 100GB | 根系统与程序 |
/var/cache |
≥ 30GB | YUM、npm、pip 缓存 |
适当使用 LVM 动态扩容 或 XFS 扩容 可以大幅提高弹性。
九、结语
通过这次 CentOS 7.6 磁盘空间不足的故障现场排查与清理实践,我们不仅快速恢复了服务稳定性,还建立了可重复的 自动清理与告警机制。
在数据中心服务器运维中,做好 日常空间监控、日志轮转配置、临时文件清理 是避免严重故障的关键。
如果你有一台 CentOS 系统频繁出现磁盘空间告警,按照本文步骤操作,通常 能在 60 分钟内恢复可用空间并建立长期稳定机制。