避免 Linux 内存不足导致应用程序崩溃

避免 Linux 内存不足导致应用程序崩溃

我发现有时我的 Linux 机器会耗尽内存,然后它就会开始拆除随机进程来解决这个问题。

我很好奇管理员会怎么做来避免这种情况?唯一真正的解决方案是增加内存量吗(仅增加交换量有帮助吗?),还是有更好的方法使用软件来设置机箱以避免这种情况?(即配额,或类似的东西?)。

答案1

默认情况下,Linux 的内存管理概念有些不合理:它允许您分配比系统内存更多的内存,然后在进程遇到问题时随机终止进程。(被终止进程的实际语义比这更复杂 - 谷歌搜索“Linux OOM Killer”可找到大量详细信息和论据,了解它是好事还是坏事)。


为了恢复内存管理的合理性:

  1. 禁用 OOM Killer(放入vm.oom-kill = 0/etc/sysctl.conf)
  2. 禁用内存过量使用(放入vm.overcommit_memory = 2/etc/sysctl.conf)
    请注意,这是一个三位数值:0 =“估计我们是否有足够的 RAM”,1 =“总是说是”,2 =“如果我们没有内存就说否”)

这些设置将使 Linux 以传统方式运行(如果一个进程请求的内存多于可用的内存,malloc() 将失败,而请求内存的进程需要应对该失败)。

重新启动计算机以使其重新加载/etc/sysctl.conf,或使用proc文件系统立即启用,而无需重新启动:

echo 2 > /proc/sys/vm/overcommit_memory 

答案2

答案3

对于服务器来说,简短的回答就是购买并安装更多 RAM。

一个经常经历足够多的服务器对象对象模型(内存不足)错误,那么除了 Linux 内核中的 VM(虚拟内存)管理器的过度提交 sysctl 选项之外,这不是一件好事。

如果当前值较低,并且使用涉及许多任务,每个任务都需要大量内存,而不是一个或几个进程,每个进程都请求大量可用的总虚拟内存(RAM + 交换),那么增加交换量(已被内核的内存管理器分页到磁盘的虚拟内存)将会有所帮助。

对于许多应用程序来说,分配两倍以上的 RAM 作为交换空间会降低性能。在一些大型计算模拟中,如果速度减慢是可以忍受的,这可能是可以接受的。

对于适量(例如 4-16 GB)的 RAM(无论是否为 ECC),价格相当实惠,我不得不承认,我自己已经很久没有遇到过这个问题了。

查看内存消耗的基本方法包括使用freetop(按内存使用量排序),这是两种最常见的快速评估内存使用模式的方法。因此,请确保您至少了解这些命令输出中每个字段的含义。

由于没有应用程序(例如数据库、网络服务服务器、实时视频处理)和服务器使用情况(少数高级用户、100-1000 个用户/客户端连接)的具体信息,我无法想到任何有关处理 OOM 问题的一般建议。

答案4

增加物理内存的数量可能并不是在所有情况下都有效的解决办法。

检查这一点的一种方法是使用“atop”命令。特别是这两行。

这是我们的服务器正常运行时的情况:

MEM | tot   23.7G | free   10.0G | cache   3.9G | buff  185.4M | slab  207.8M |
SWP | tot    5.7G | free    5.7G |              | vmcom  28.1G | vmlim  27.0G |

当它运行不佳时(在我们将 overcommit_memory 从 50 调整到 90 之前,我们会看到 vmcom 运行超过 50G 的行为,oom-killer 每隔几秒钟就会炸毁进程,并且由于 NFSd 子进程不断地被炸毁和重新创建,负载不断剧烈波动。

我们最近重复了一些案例,其中多用户 Linux 终端服务器大量过度承诺虚拟内存分配,但实际上消耗的请求页面很少。

虽然不建议完全按照这种方式操作,但我们将 overcommit-memory 从默认的 50 调整到了 90,这缓解了一些问题。我们最终不得不将所有用户转移到另一台终端服务器并重新启动才能看到全部好处。

相关内容