避免 linux 内存不足的应用程序拆卸

Edd*_*ker 38 linux low-memory

我发现有时我的 Linux 机器内存不足,它开始拆除随机进程来处理它。

我很好奇管理员如何避免这种情况?是增加内存量的唯一真正解决方案(单独增加交换会有所帮助吗?),还是有更好的方法来设置带有软件的盒子来避免这种情况?(即配额,或一些这样的?)。

vor*_*aq7 56

默认情况下,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 
Run Code Online (Sandbox Code Playgroud)

  • 受伤的不是Linux,而是分配内存的程序员,从不使用它。Java VM 在这方面是臭名昭著的。我,作为管理运行 Java 应用程序的服务器的管理员,如果没有过度使用,一秒钟都无法生存。 (15认同)
  • Java程序员不会分配未使用的内存,Java中没有malloc。我认为您将此与 -Xms 之类的 JVM 设置混淆了。在任何情况下,通过添加交换空间来增加虚拟内存大小是比过度使用更安全的解决方案。 (13认同)
  • jlliagre,我说的是 Java VM(虚拟机),而不是 Java 程序,尽管从管理员的角度来看它是一样的 :) (10认同)
  • 也许这里值得一提的是,将上述内容添加到 `/etc/sysctl.conf` 可能只会在下次重新启动时生效;如果您想*现在*进行更改,您应该使用具有root权限的`sysctl`命令,例如`sudo sysctl vm.overcommit_memory=2` (9认同)
  • 请注意,此解决方案不会阻止您的系统耗尽内存或终止进程。它只会让你恢复到传统的 Unix 行为,如果一个进程吃掉了你所有的内存,下一个尝试 malloc 的进程将不会得到任何内存(并且很可能会崩溃)。如果您不幸下一个进程是 init(或其他重要的进程),OOM Killer 通常会避免这种情况。 (7认同)
  • 虽然这些设置在理论上有效,但在实践中事​​情并没有那么简单。许多应用程序依赖于能够过度分配内存。除非您对系统上运行的内容有极其严格的控制,否则它可能会导致各种奇怪的问题,包括 pehrs 描述的问题。 (3认同)
  • 确实脑部受损;OOM 杀手只是鼓励不关心效率(囤积内存)或错误检查(检查失败的 malloc)的草率编程。 (3认同)
  • 肯定是Linux脑子坏了。OOM 杀手的设计是不可修复的,它给服务器带来了最严重的不稳定。不幸的是,程序已经开始依赖这种行为。这意味着修复它非常困难,Linux 必须永远这样做。 (3认同)