基础设施-进程管理-dnf-makecache导致OOM宕机
问题现象
- 时间:2026-07-04 07:16 左右服务器完全宕机
- 症状:SSH 端口 22 连接超时(TCP 握手成功但 SSH 协商无响应)
- 服务全部不可用:Nginx、FastAPI 后端均无响应
- 复现条件:2GB 内存 ECS 服务器,dnf-makecache.timer 到点自动触发
核心问题
- 根因:
dnf-makecache.service每次运行消耗 700-772MB 内存,在 2GB 服务器上反复触发 OOM Killer - 时间线:
- 07-04 00:37 — 第 1 次 OOM Kill(dnf 进程)
- 07-04 01:37 — 第 2 次 OOM Kill
- 07-04 02:36 — 第 3 次 OOM Kill
- 07-04 04:04 — 第 4 次 OOM Kill
- 07-04 07:16 — 第 5 次 OOM Kill,此次引发 kernel panic,系统彻底崩溃
- 关键日志:
journalctl --boot=-1 | grep oom可看到连续 OOM 记录,dmesg | grep -i "out of memory"可确认被 kill 的进程名
解决方法
- ECS 控制台强制重启(服务器已无法通过 SSH 恢复)
- 登录后停用定时器:
systemctl disable --now dnf-makecache.timer - 确认禁用成功:
systemctl status dnf-makecache.timer # 应显示:Loaded: loaded (...; disabled; ...)、Active: inactive (dead) - 审计其余定时器(确认无其他高风险项):
systemctl list-timers --all
下次防错措施
- 快速定位:服务器 SSH 不通时,先查 ECS 监控看 CPU/内存曲线。若内存曾长时间>90%,大概率是 OOM
# 恢复后立即检查上一条启动的 OOM 日志 journalctl --boot=-1 | grep -i 'oom\|out of memory\|killed process' - 预防脚本:在服务器上监控可用内存,低于阈值时告警
# 添加 crontab 监控,内存低于 200MB 时记录日志 */5 * * * * [ $(awk '/MemAvailable/{print int($2/1024)}' /proc/meminfo) -lt 200 ] && echo "$(date) MEM LOW" >> /var/log/mem-watch.log - 长期建议:小内存服务器(≤2GB)上彻底移除 dnf-makecache,或升级到 4GB+。dnf-makecache 本身是 dnf 的缓存刷新定时器,对服务器日常运行无实际价值