跳过正文
  1. 博客/

监控 Linux 上的 OOM

·77 字·1 分钟·
OOM

在使用 Linux 的实际生产实践中,其上运行的程序有可能会发生被 OOM Kill 的情况。某些场景下,我们会想把它监控起来。

Prometheus 生态中的 node_exporterv0.16.0 开始加强了对 vmstat 的 parse & collect,默认情况下新增了一个关键的 Metric:node_vmstat_oom_kill

它本质上是一个 Counter。并且这个 Metric 的是否存在其实依赖于 Linux Kernel 的版本: 只有版本在 4.13+ 的内核才会通过 /proc/vmstat 暴露这个 oom_kill 计数信息。

多数情况下这个 Metric 也够用。但,如果你不只是想要这样单纯的 OOM 计数,而是想采集具体的 OOM 信息,比如采集并结构化存储至 ELK 或者其他什么的系统,再扩展出告警,通知等功能,可以在 rsyslog 中使用 imkmsg 模块,精细化定义一套复杂的 input / parse / output 等逻辑实现。

如果习惯自己编程而不想接触 rsyslog 那一堆 DSL、配置语法等,也可以从 imkmsg 模块的信息源头处 /dev/kmsg 自行采集、解析、处理来进行。/dev/kmsg 输出的信息是高度结构化的,格式为 "level,sequnum,timestamp;<message text>\n",更多信息可以参考 Rsyslog 的 imkmsg 文档

为什么不是选择对 /proc/kmsg 进行解析,是因为 /proc/kmsg 是一次性缓冲的,读取过的数据无法再次读取,而 /dev/kmsg 支持多次重复读取。

当然,如果是习惯使用 golang 的读者,也可以直接使用这个开源的 parser:go-kmsg-parser