文章内容

2023/12/4 23:59:33,作 者: 黄兵

Linux 的 OOM 进程杀手

什么是 OOM 杀手?

“OOM Killer”或“Out of Memory Killer”是 Linux 内核在系统内存严重不足时使用的进程。出现这种情况的原因是服务器上的进程正在消耗大量内存,并且系统需要更多的内存用于自己的进程并分配给其他进程。当进程启动时,它会向内核请求一块内存。该初始请求通常是一个大请求,该进程不会立即或实际上不会使用全部请求。内核意识到进程请求冗余内存的趋势,因此过度分配系统内存。这意味着,例如,当系统具有 8GB RAM 时,内核可能会为进程分配 8.5GB。通过确保分配给进程的内存得到积极使用,可以最大限度地利用系统内存。

通常,这种情况不会造成问题。但是,如果有足够多的进程开始使用其请求的所有内存块,则将没有足够的物理内存来支持它们。这意味着正在运行的进程需要比物理可用内存更多的内存。这种情况很危急,必须立即解决。

Linux内核采用的解决方案是调用OOM Killer来检查所有正在运行的进程并杀死其中一个或多个进程,以释放系统内存并保持系统运行。

它如何选择要杀死的进程?

OOM Killer 的工作原理是检查所有正在运行的进程并为其分配不良分数。得分最高的进程就是被杀死的进程。OOM Killer 根据许多标准分配不良分数。其原理如下:

  • 该进程及其所有子进程正在使用大量内存。

  • 杀死最少数量的进程(最好是一个),以便释放足够的内存来解决问题。

  • 根、内核和重要的系统进程的得分要低得多。

那么为什么Apache/MySQL总是被kill掉呢?

上面列出的标准意味着,当选择一个进程来杀死 OOM Killer 时,它会选择一个使用大量内存、拥有大量子进程且不是系统进程的进程。Apache、MySQL、Nginx、Clamd (ClamAV) 或邮件服务器等应用程序都是不错的选择。然而,由于这种情况通常发生在繁忙的 Web 服务器上,Apache 或 MySQL 将是内存中最大的非系统进程,因此会被杀死。

必须记住,虽然Web Server 或DB Server 对您来说非常重要,但是当内核调用OOM Killer 时情况就很危急了。如果没有通过终止进程来释放内存,服务器很快就会崩溃。此时此刻继续正常运作是不可能的。

常见的原因

Apache / Nginx / MySQL 被 OOM Process Killer 杀死的常见原因之一是当网站接收大量流量时,这可能是来自新促销、媒体关注或类似的真实流量,也可能是爬行网站的机器人,或者在某些情况下它可能是僵尸网络,试图暴力攻击您的网站。查看 Apache / Nginx 日志是了解情况是否如此的好地方。

如何查找 OOM Process Killer 最近是否被调用?

查找 OOM Killer 是否被调用以及网站离线或类似原因的最简单方法是检查系统日志。每当 OOM Killer 被调用时,它都会向系统日志写入大量信息,包括哪个进程被杀死以及原因。您可以运行以下命令;

dmesg | egrep -i “killed process”

此外,以下内容可用于查看操作系统分发特定日志;

#CentOS
grep -i "out of memory" /var/log/messages

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

输出看起来像这样,

host kernel: Out of Memory: Killed process 2592 (mysql).

在本例中,被杀死的进程是 mysql,其 PID(进程标识号)为 2592。

如何避免 OOM 进程杀手

仅当系统内存严重不足时,才会调用 OOM Killer。因此,避免这种情况的解决方案是减少服务器的内存需求或增加可用内存。

升级服务器

这是最快、最简单的选项,因为它不需要重新配置服务器。

减少内存使用

应该采取的第一步是减少内存使用,以停止任何不需要的进程运行。例如,如果服务器不共享并且仅偶尔使用 FTP,则可以在上传之前启动此过程并在上传之后终止。

文章来源:

Linux's OOM Process Killer

分享到:

发表评论

评论列表