解决内存不足杀手难题
2022 年 6 月 18 日
阅读时长:4 分钟

我们最近推出了 IBM Instana Crash Detector,它可自动检测并报告所有运行 Linux 内核 4.8 及更高版本的 Linux 电脑上的异常进程终止。IBM Instana 平台利用 Linux 内核的扩展伯克利数据包过滤器 (eBPF) 功能挂钩内核本身,并开始监听进程终止。任何异常终止都会向主机代理发出信号,主机代理会根据其监控的进程进行筛选,以避免无关进程的干扰,然后将信息发送到 IBM Instana 后端。事实证明,这一功能改变了客户处理故障事件的方式。

借助 Crash Detector,IBM Instana 软件为影响客户应用程序性能的众多问题提供了关键数据。现在,我们通过在崩溃检测器中添加内存不足杀手(OOM 杀手)事件来增强这一功能,由于它与容器化应用程序息息相关,因此是一项非常有价值的新增功能。

什么是内存不足杀手?

云计算让人觉得,只要有足够的预算,就能拥有无限的算力。不过,这种算力是分片的。主机(物理的和虚拟的都一样)、容器和函数—它们都对你能分配多少内存有限制。

在 Linux 中,内存不足 (OOM) 杀手是一个负责防止其他进程集体耗尽主机内存的进程。当一个进程试图分配超过可用内存的内存时,根据进程分配的内存超出允许范围的程度等因素,坏度得分最高的进程将收到一个 OOM 信号。这句话的基本意思是"你太过分了。退出或让你的一些子进程退出,否则就熄灯"。

请注意,触发 OOM 的进程可能不是接收 OOM 信号的进程。一个最近并未增加内存使用量的应用程序,可能会因为同一主机上有太多其他应用程序启动而突然发出 OOM 信号。

OOM 信号的机制听起来很苛刻,但它实际上是防止主机内存耗尽的一种非常有效的机制,尤其是在应用程序大小不正确或并行运行的应用程序过多的情况下(即主机大小与工作负载不匹配)。

对于 Kubernetes、Cloud Foundry 和 Nomad 等容器化平台来说,内存的使用—无论是在合理调整应用程序大小方面,还是在主机上同时运行多少应用程序方面—都更加重要。一般来说,你不会详细计划在任何一个节点上运行哪些应用程序。在许多设置中,容器将根据协调器的某些逻辑进行分配。对于 Linux 上几乎所有容器技术的基础—容器和控制组 (cgroups) 来说,强制执行最大内存消耗量至关重要。这些进程还使用 OOM 杀手系统,以确保在同一个组(即一个容器)中运行的进程分配的内存不会超过允许分配的内存。当容器中的进程试图分配超过允许的内存时,一些进程会被终止,通常会连带容器一起终止。

规模化后,一切都变得更加困难,包括尺寸的确定。在环境中运行的容器越多,就越难了解其中一些容器何时、如何以及为何宕机。OOM 杀手会给您的应用程序造成不健康的情况,即某些东西总是在某个地方崩溃,然后又被重新启动,给您的最终用户造成持续大量的错误,从而影响您的服务级别目标 (SLO),而且很难排除故障。

监控让 OOM 杀手漏网的地方

要找出任何单个流程被 OOM 杀手淘汰的原因,在很大程度上取决于你所使用的技术。有些软件包会将其记录在自己的日志中。或者,你可能最终会在每台主机上运行类似下面的命令:

     #CentOS
     grep -i "out of memory" /var/log/messages
     #Debian / Ubuntu
     grep -i "out of memory" /var/log/kern.log

看起来很简单,但这绝对不是你想在生产机群中执行的任务,因为你不知道为什么 MySQL 在凌晨 3 点又死机了。尤其是在凭直觉的情况下,因为似乎没有其他东西可以解释为什么数据库进程不再存在。

换句话说,"OOM 杀手"是一个对可靠性具有不可否认的重要性和功效的系统,但却无法提供足够的可观测性。但 IBM Instana 平台可以帮您修复这个问题。

IBM Instana 软件如何利用 eBPF 检测 OOM 杀手流程

在 eBPF 的基础上,IBM Instana 软件现在配备了一个开箱即用的 OOM 杀手检测器。当 IBM Instana 软件监控您的流程时,它会实时接收 OOM 信号。不仅要说明发生了这种情况,还要说明是如何解决的(即哪个进程被杀死了)。

与大多数 IBM Instana 功能类似,您只需安装 IBM Instana 主机代理,然后看着 OOM 杀手执行其严峻的任务即可。它还会显示被杀死的进程在事件发生时分配了多少内存,这样你就能理解为什么 OOM 杀手将其标记为"坏"。

使用 OOM 杀手可以解决的问题

如果没有适当的工具,要确定一个进程是如何以及为什么被终止的,或者一个进程为什么被 OOM 杀手杀死,可能需要花费数小时甚至数天的时间。有了 IBM Instana Crash Detector,用户现在可以立即找到每个异常进程终止和每个 OOM 杀手成功进程的根本原因。

需要了解容器死亡的原因吗?没有问题!有了 IBM Instana Crash Detector OOM 杀手,你就会知道,也许你的 Java 虚拟机 (JVM) 在运行一个非常重要的批处理作业时,分配的资源超过了允许的范围。或者,您需要确定超文本预处理器 (PHP) 请求失败或数据库消失的原因。同样,有了 IBM Instana Crash Detector OOM 杀手,您就可以立即找到这些问题的根本原因。

利用 OOM 杀手,节省排除应用程序性能问题的时间

要节省自己和 DevOps 团队排除 OOM 杀手事件的时间,只需立即在 Linux 操作系统上安装 IBM Instana 代理即可。如果您还没有 IBM Instana 实例,您可以通过免费试用版了解具有 OOM 杀手检测功能的 IBM Instana Crash Detector 是如何工作的。

作者
IBM Instana Team IBM Instana