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 分钟内恢复可用空间并建立长期稳定机制。

相关推荐
微软技术分享10 分钟前
NexShell 1.0|大模型驱动的智能 SSH 运维终端,永久免费,赋能 Linux 服务器管理
运维·服务器·ssh
坤坤子吖19 分钟前
Linux 线程概念与控制——线程创建、退出与等待
linux·开发语言·c++·笔记·学习
Chenyu_31040 分钟前
NUMA 基础:从 CPU、内存到 Node 的整体理解
linux·服务器·网络·缓存
小白的码BUG之路9 小时前
linux -- ssh两台机器相连
运维·服务器·ssh
缓慢更新10 小时前
表单引擎的存储建模:宽表与文档库的取舍
运维·服务器·网络·数据库·低代码·oracle·适配器模式
续写烂尾11 小时前
贴片 SD NAND、eMMC、TF 卡规格怎么定?硬件工程师选型清单
运维·服务器·网络
不昀11 小时前
网口Link Up后仍然掉线,怎样区分物理链路和数据通路问题?
linux·以太网
迪康妍妍11 小时前
终端管控实操:封堵网盘与IM外发通道的落地思路
运维·网络·安全·架构·安全性测试
sxgzzn11 小时前
如何选择合适的开关柜在线监测工具?
运维·重构·无人机·开关柜局放在线监测·光伏运维管理系统
Lhan.zzZ11 小时前
Qt WebEngineView 在 Linux 上无法加载网页:从“看不见 HTML“到“禁用沙箱“
linux·c++·qt