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

news/2024/5/18 23:23:53 标签: 开发语言, prometheus, 数据库

OOM,out of memory,就是内存用完了耗尽了的意思。会触发kernel调用OOM killer杀进程来解除这种状况。

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

虚拟内存OOM发生在用户空间,用户空间分配的就是虚拟内存,不能分配物理内存,用户空间虚拟内存OOM表现为malloc、mmap等内存分配接口返回失败,错误码为ENOMEM。

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

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

1、采用 node_export + grafna +  prometheus + alertmanager  监控

1.1、node_export 监控数据采集 --collector.vmstat

/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、grafna 中写PromQL 制定 OOM 可视化

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

1.3、 prometheus 设定 rules oom 告警阈值

 /opt/prometheus/rules/node_rules.yml 文件添加 oom 告警阈值

 ##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 配置告警推送规则

alertmanager.yml 中配置,具体配置略

2、systemd服务自愈

systemd服务异常自动重启很好用,OOM就是通过kill -9来杀进程,没有

RestartPreventExitStatus 限定的情况下 服务异常中断会自愈重启。

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

systemd的[Service]段落里支持一个参数,叫做RestartPreventExitStatus

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

该参数的值支持exit code和信号名2种,可写多个,以空格分隔,例如

  RestartPreventExitStatus=143 137 SIGTERM SIGKILL

[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表示不限次数重启

 

附上效果图:


http://www.niftyadmin.cn/n/415938.html

相关文章

C# Task Parallel Library (TPL) 访问线程池

//在C#中,可以使用Task Parallel Library (TPL)来访问线程池。 //TPL是一个用于并行编程的框架,它提供了一种简单的方式来创建并行任务, //并自动利用线程池来执行这些任务。 //下面是一个使用TPL访问线程池的示例: //csharp u…

Vue 组件化: 计算属性、内容分发、自定义事件

目录 1. 计算属性 1.1 计算属性的特点 2. 内容分发 2.1 使用插槽的示例 3. 自定义事件 1. 计算属性 什么是计算属性 ? 计算属性的重点突出在属性两字, 首先它是个属性, 其次这个属性有计算的能力, 这里的计算就是个函数; 简单来说, 它就是一个能够将计算结果缓存起来的属…

Git仓库相关操作

目录 Git作用 集中式 分布式 Git操作Git区域概念 Git命令 远程仓库 新建项目 新建仓库 克隆项目 推送项目 拉取项目 Git作用 作用:版本控制多人协作 集中式 典型代表:SVN 特点:所有的版本库都存在中央服务器,本地备份…

31 # 模块的概念

模块化规范 commonjs 规范:node 中的模块化规范就是 commonjs 规范(node 自己实现的),CommonJS 模块输出的是一个值的拷贝esmodule 规范(import export):ES6 模块输出的是值的引用umd 规范&…

微伴助手如何增加客户积分?如何自动给客户添加企业标签?

微伴助手是一款企业微信第三方应用,已经为电商、教育、金融、保险、医疗等机构提供技术支持,适用于引流获客、客户意向跟进、销售转化、社群运营等全方位营销场景,旨在帮助企业构建高转化率的私域流量池。 微伴助手基于企业微信开放的接口&a…

币圈下半年重点之一:以太坊坎昆升级,将带来哪些实质性利好?

近期BRC-20大火,主打价值存储的比特币竟然生态比以太坊还热,但要论生态,以太坊才是真正的王者,因为其正在悄悄酝酿下一个重大升级——坎昆(Dencun)升级。 最新消息,以太坊开发者已经就Dencun升级…

虹科多功能电流电压采集方案

01电流电压采集基础概念和应用 电流采集、电压采集、电能充电量测试和功率测试在不同领域都有着广泛的应用 ▲汽车电子:电池管理系统BMS、发动机控制系统、车身电子系统 ▲航空航天:飞行控制系统,航空电源管理系统、航空电子设备 ▲消费电…

7年经验之谈 —— 如何进行渗透测试以提高软件安全性?

对于各种规模的企业和组织来说,软件安全是一个至关重要的问题。随着网络攻击越来越复杂,软件中的漏洞越来越多,确保你的软件安全比以往任何时候都更重要。提高软件安全性的一个有效方法是渗透测试(penetration testing&#xff09…