跳转至

基础设施-进程管理-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 的进程名

解决方法

  1. ECS 控制台强制重启(服务器已无法通过 SSH 恢复)
  2. 登录后停用定时器
    systemctl disable --now dnf-makecache.timer
    
  3. 确认禁用成功
    systemctl status dnf-makecache.timer
    # 应显示:Loaded: loaded (...; disabled; ...)、Active: inactive (dead)
    
  4. 审计其余定时器(确认无其他高风险项):
    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 的缓存刷新定时器,对服务器日常运行无实际价值