在使用 Linux 的实际生产实践中,其上运行的程序有可能会发生被 OOM Kill
的情况。某些场景下,我们会想把它监控起来。
Prometheus
生态中的 node_exporter
在 v0.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。