Cent OS:如何关闭或减少内存过量使用,这样做安全吗?

Cent OS:如何关闭或减少内存过量使用,这样做安全吗?

有时“我的”服务器会因为内存和交换空间耗尽而停止运行。(它一直响应 ping 但仅此而已,甚至没有 ssh)。

有人告诉我,linux 确实存在内存过量使用的问题,据我所知,这与银行对货币的处理方式相同:它向进程授予比实际可用更多的内存,假设大多数进程实际上不会使用它们要求的所有内存,至少不会同时使用。

请假设这实际上是我的系统偶尔挂起的原因,我们不要在这里讨论是否是这种情况(请参阅什么原因会导致服务器上的所有服务都停止运行,但仍能响应 ping?以及如何找出原因)。

所以,

  1. 如何在 CentOS 中禁用或大幅减少内存过量使用?我读到有两个设置称为 vm.overcommit_memory(值为 0、1 或 2)和 vm.overcommit_ratiom,但我不知道在哪里可以找到并更改它们(希望是某个配置文件),我应该尝试哪些值,以及是否需要重新启动服务器才能使更改生效。

  2. 它安全吗?我能预期到什么副作用?当我在谷歌上搜索 overcommit_memory 时,我发现了一些可怕的事情,比如人们说他们的服务器无法再启动了……

由于导致内存使用量突然增加的原因是 mysql,因为 php 发出的查询是在处理 http 请求时调用的,我预计只有一些 php 脚本无法完成,因此当服务器太忙时不时会出现一些 500 响应,这是我可以承担的风险(当然比让整个服务器变得无法访问并必须硬重启要好)。

或者我选择错误的设置真的会导致我的服务器无法重启吗?

答案1

可以通过以下方式禁用内存过量使用vm.overcommit_memory=2

0 是默认模式,内核通过计算与分配请求相比的可用内存来启发式地确定分配。将其设置为 1 可启用向导模式,内核始终通告它有足够的可用内存用于任何分配。设置为 2 意味着进程只能分配最多可配置的overcommit_ratioRAM 量 (),并且当超过该量时将开始收到分配失败或 OOM 消息。

这样做安全吗?不安全。我还没有看到任何适当的用例,禁用内存过量使用实际上有帮助,除非你 100% 确定工作负载和硬件容量。如果你感兴趣,请安装kernel-docs软件包并转到/Documentation/sysctl/vm.txt阅读更多内容,或阅读它在线的

如果您设置vm.overcommit_memory=2,它将过度使用配置的物理 RAM 的百分比vm.overcommit_ratio(默认为 50%)。

echo 0/1/2 > /proc/sys/vm/overcommit_memory 

重启后此文件将无法继续存在。为了持久保存,请将其放入/etc/sysctl.conf文件中:

vm.overcommit_memory=X

并运行sysctl -p。无需重启。

答案2

完全不合格的说法:禁用内存过量提交绝对比启用它“更安全”。

$customer 在几百台 Web 服务器上都设置了它,这对解决稳定性问题大有帮助。甚至有一个 Nagios 检查,如果它没有被禁用,就会发出警报。

另一方面,当人们只想过度使用一点内存并且永远不会真正使用它时,他们可能认为让他们的进程耗尽内存并不“安全”。 (例如 SAP 就是一个很好的例子)

所以,您又回来看看它是否能为您带来改善。既然您已经在研究它以解决相关问题 - 我认为它可能对您有帮助。

(我知道我会面临被某些脾气暴躁的人否决的风险)

答案3

我同意在某些情况下禁用过度使用比启用它更安全。如果服务器只运行少量大内存作业(比如我的情况中的电路模拟),预先拒绝应用程序的内存请求比等待 OOM 事件(肯定会很快发生)要安全得多。我们经常看到 OOM 杀手完成工作后服务器出现问题。

相关内容