ITPub博客

首页 > Linux操作系统 > Linux操作系统 > OOM 如何监控可视化、告警推送、服务自愈

OOM 如何监控可视化、告警推送、服务自愈

原创 Linux操作系统 作者:张冲andy 时间:2023-06-09 15:11:41 0 删除 编辑

O O M , o u t   o f   m e m o r y , 就 是 内 存 用 完 了 耗 尽 了 的 意 思 。 会 触 发 k e r n e l 调 用 O O M   k i l l e r 杀 进 程 来 解 除 这 种 状 况 。

O O M 分 为 虚 拟 内 存 O O M 和 物 理 内 存 O O M , 两 者 是 不 一 样 的 。

虚 拟 内 存 O O M 发 生 在 用 户 空 间 , 用 户 空 间 分 配 的 就 是 虚 拟 内 存 , 不 能 分 配 物 理 内 存 , 用 户 空 间 虚 拟 内 存 O O M 表 现 为 m a l l o c 、 m m a p 等 内 存 分 配 接 口 返 回 失 败 , 错 误 码 为 E N O M E M 。

程 序 在 运 行 的 时 候 触 发 缺 页 异 常 从 而 需 要 分 配 物 理 内 存 , k e r n e l   自 身 在 运 行 的 时 候 也 需 要 分 配 物 理 内 存 , 如 果 此 时 物 理 内 存 不 足 了 , 就 会 发 生 物 理 内 存 O O M 。

O O M 是 非 常 严 重 的 问 题 , 那 我 们 如 何 监 控 、 告 警 、 甚 至 自 愈 呢 ?

1 、 采 用   n o d e _ e x p o r t   +   g r a f n a   +     p r o m e t h e u s   +   a l e r t m a n a g e r     监 控

1 . 1 、 n o d e _ e x p o r t   监 控 数 据 采 集   - - c o l l e c t o r . v m s t a t

/opt/exporter/bin/node_exporter_51233 --web.listen-address=0.0.0.0:51233 --collector.cpu.info --collector.arp --collector.cpu --collector.diskstats --collector.filesystem --collector.loadavg --collector.meminfo --collector.mountstats --collector.nfs --collector.stat --collector.tcpstat --collector.vmstat


1 . 2 、 g r a f n a   中 写 P r o m Q L   制 定   O O M   可 视 化

-- oom 频率increase(node_vmstat_oom_kill{host=~"$host"}[1m])
-- oom 总次数node_vmstat_oom_kill > 0


1 . 3 、   p r o m e t h e u s   设 定   r u l es oom 告警阈值

  / o p t / p r o m e t h e u s / r u l e s / n o d e _ r u l e s . y m l   文 件 添 加   o o m   告 警 阈 值

 ##alert for host oom
  - alert: IOV-HostOomKillDetected
    expr: increase(node_vmstat_oom_kill[1m]) > 0
    for: 0m
    labels:
      level: 3
    annotations:
      cur_value: '{{ $value }}'
      description: "OOM kill detected"


1.4、alertmanager 配置告警推送规则

a l e r t m a n a g e r . y m l   中 配 置 , 具 体 配 置 略

2 、 s y s t e m d 服 务 自 愈

s y s t e m d 服 务 异 常 自 动 重 启 很 好 用 , O O M 就 是 通 过 k i l l   - 9 来 杀 进 程 , 没 有

R e s t a r t P r e v e n t E x i t S t a t u s   限 定 的 情 况 下   服 务 异 常 中 断 会 自 愈 重 启 。

但 有 的 时 候 希 望 某 些 服 务 只 在 特 定 情 况 下 进 行 重 启 ,

s y s t e m d 的 [ S e r v i c e ] 段 落 里 支 持 一 个 参 数 , 叫 做 R e s t a r t P r e v e n t E x i t S t a t u s

该 参 数 从 字 面 上 看 , 意 思 是 当 符 合 某 些 退 出 状 态 时 不 要 进 行 重 启 。

该 参 数 的 值 支 持 e x i t   c o d e 和 信 号 名 2 种 , 可 写 多 个 , 以 空 格 分 隔 , 例 如

    R e s t a r t P r e v e n t E x i t S t a t u s = 1 4 3   1 3 7   S I G T E R M   S I G K I L L

  [Unit]
  Description=mytest
  [Service]
  Type=simple
  ExecStart=/root/mytest.sh
  Restart=always
  RestartSec=5
  StartLimitInterval=0
  [Install]
  WantedBy=multi-user.target
  
重点参数详解
Restart=always: 只要不是通过systemctl stop来停止服务,任何情况下都必须要重启服务,默认值为no
RestartSec=5: 重启间隔,比如某次异常后,等待5(s)再进行启动,默认值0.1(s)
StartLimitInterval: 无限次重启,默认是10秒内如果重启超过5次则不再重启,设置为0表示不限次数重启


附上效果图:

 

 

 


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31383567/viewspace-2957822/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
支持就关注我个人公众号:DBA烂笔头 。专注数据库领域,熟悉oracle、mysql、redis、mongodb,clickhouse等相关技术

注册时间:2016-08-11

  • 博文量
    626
  • 访问量
    286304