CentOS 7.6 磁盘空间不足导致服务崩溃:如何有效清理日志文件和临时文件

我长期负责跨境电商与游戏服务器集群运维,在多个生产环境中反复遇到过因为 磁盘空间耗尽 而导致服务崩溃的事故。特别是在一些使用了 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 分钟内恢复可用空间并建立长期稳定机制

相关推荐
chlk12310 小时前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑10 小时前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件11 小时前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
碳基沙盒11 小时前
OpenClaw 多 Agent 配置实战指南
运维
xy1230611 小时前
OpenStack Train 部署实战(三)控制节点--keystone服务
centos·openstack
深紫色的三北六号20 小时前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash1 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI1 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行2 天前
Linux和window共享文件夹
linux
木心月转码ing2 天前
WSL+Cpp开发环境配置
linux