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/ ,如需转载,请注明出处,否则将追究法律责任。