“我的”服务器有时会因为内存和交换空间都用完而停止运行。(它一直响应 ping 但仅此而已,甚至没有 ssh)。
有人告诉我 linux 会内存过度使用,据我所知,这与银行对金钱的处理方式相同:它授予进程比实际可用内存更多的内存,假设大多数进程实际上不会使用他们要求的所有内存,在至少不是同时。
请假设这实际上是我的系统偶尔挂起的原因,我们在这里不讨论是否是这种情况(请参阅什么会导致服务器上的所有服务停止运行,但仍响应 ping?以及如何弄清楚) .
所以,
我如何在 CentOS 中禁用或大幅减少内存过度使用?我读过有两个设置称为 vm.overcommit_memory(值 0、1 或 2)和 vm.overcommit_ratiom 但我不知道我必须在哪里找到和更改它们(希望是一些配置文件),我应该尝试什么值,以及我是否需要重新启动服务器以使更改生效。
安全吗?我可以期待什么副作用?在谷歌搜索 overcommit_memory 时,我发现一些可怕的事情,比如人们说他们的服务器无法再启动......
由于导致内存使用量突然增加的原因是 mysql,因为 php 进行的查询又在服务 http 请求时被调用,我希望只有一些 php 脚本无法完成,因此时不时会有大约 500 个响应服务器太忙,这是我可以承担的风险(当然更好的是让整个服务器变得无法访问并且必须硬重启它)。
或者如果我选择了错误的设置,它真的会导致我的服务器无法重启吗?
可以通过以下方式禁用内存过量使用
vm.overcommit_memory=2
0 是默认模式,其中内核通过计算与发出的分配请求相比的空闲内存来试探性地确定分配。将它设置为 1 会启用魔法模式,在这种模式下,内核总是通告它有足够的空闲内存来进行任何分配。设置为 2,意味着进程最多只能分配可配置数量 (
overcommit_ratio
) 的 RAM,并且当超过该数量时将开始获取分配失败或 OOM 消息。这样做安全吗,不。除非您 100% 确定工作负载和硬件容量,否则我还没有看到任何适当的用例可以证明禁用内存过量使用实际上有帮助。如果您有兴趣,请安装
kernel-docs
软件包并转到/Documentation/sysctl/vm.txt
阅读更多内容,或在线阅读。如果您设置
vm.overcommit_memory=2
,那么它将过量使用配置的物理 RAM 的百分比vm.overcommit_ratio
(默认为 50%)。这将无法在重启后继续存在。为了持久性,将其放入
/etc/sysctl.conf
文件中:并运行
sysctl -p
。无需重启。完全不合格的说法:禁用内存过量使用绝对比启用它“更安全”。
$customer 已在数百台 Web 服务器上设置它,它对解决稳定性问题有很大帮助。如果 Nagios 从未被禁用,甚至还有一个 Nagios 检查会大声呼叫火警。
另一方面,当人们只想过度使用一个小 ram 并且永远不会真正使用它时,他们可能不会认为让他们的进程内存不足是“安全的”。(即 SAP 将是一个很好的例子)
所以,你回头看看它是否对你有所改善。由于您已经在研究它以消除相关问题 - 我认为它可能对您有所帮助。
(我知道我会冒着被某个脾气暴躁的人投反对票的风险)
我同意在某些情况下禁用过度使用比启用它更安全。如果服务器只运行很少的大内存作业(比如我的电路模拟),那么提前拒绝应用程序内存请求比等待 OOM 事件(肯定会很快发生)要安全得多我们经常看到服务器在 OOM 杀手完成其工作后出现问题。