Answers:
默认情况下,Linux具有某种大脑损坏的内存管理概念:它使您可以分配比系统更多的内存,然后在遇到麻烦时随机地将一个进程射向头部。(被杀死的内容的实际语义比这要复杂得多-Google“ Linux OOM Killer”提供了很多有关它是好是坏的细节和论据)。
要使您的内存管理恢复理智的样子:
vm.oom-kill = 0
放在/etc/sysctl.conf中)vm.overcommit_memory = 2
/etc/sysctl.conf中)。这些设置将使Linux以传统方式运行(如果某个进程所请求的内存多于可用内存,则malloc()将失败,并且期望该内存的进程可以应对该失败)。
重新引导计算机以使其重新加载/etc/sysctl.conf
,或立即使用proc
文件系统启用计算机,而无需重新引导:
echo 2 > /proc/sys/vm/overcommit_memory
/etc/sysctl.conf
可能仅在下次重新启动时生效;如果您现在要进行更改,则应使用sysctl
具有root权限的命令,例如sudo sysctl vm.overcommit_memory=2
对于服务器,最简单的答案是购买并安装更多RAM。
常规上足以发生OOM(内存不足)错误,然后在Linux内核中除了VM(虚拟内存)管理器的过量使用sysctl选项之外,这不是一件好事。
如果当前值较低,则增加交换量(已由内核的内存管理器分页到磁盘的虚拟内存)将很有帮助,并且使用情况涉及许多任务,每个任务都需要如此大的内存,而不是一个或几个处理每个请求大量可用总虚拟内存(RAM +交换)的请求。
对于许多分配两倍以上(2x)的应用程序,作为交换的RAM数量会减少改进的回报。在某些大型计算仿真中,如果速度下降是可以忍受的,这可能是可以接受的。
我必须承认,RAM(无论是否使用ECC)对于少量的内存(例如4-16 GB)来说都是可以承受的,我本人已经很长时间没有遇到这个问题了。
查看内存消耗的基础知识,包括使用free
和top
按内存使用情况排序,这是对内存使用模式的两种最常见的快速评估。因此,请确保至少了解这些命令的输出中每个字段的含义。
由于没有具体的应用程序(例如数据库,网络服务服务器,实时视频处理)和服务器的使用情况(很少的超级用户,100-1000个用户/客户端连接),因此我无法想到任何有关处理的一般建议。 OOM问题。
在所有情况下,增加物理内存量可能不是一种有效的措施。
一种检查方法是“ 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终端服务器大量过量使用虚拟内存分配,但实际上很少消耗所请求的页面。
尽管不建议您遵循此确切路线,但我们将过量使用内存从默认的50调整为90,从而缓解了一些问题。我们最终不得不将所有用户转移到另一台终端服务器,然后重新启动才能看到全部好处。
我有与此错误相关的类似问题,解决方案是使用旧的/更新的(固定的)内核。
但是,当时我无法重新启动计算机,因此某种丑陋的解决方法是使用root命令登录并使用以下命令清除系统缓存:
echo 3 > /proc/sys/vm/drop_caches
@ voretaq7 linux不具有破坏大脑的内存管理概念,默认情况下vm.overcommit_ratio为0,
0 - Heuristic overcommit handling. Obvious overcommits of
address space are refused. Used for a typical system. It
ensures a seriously wild allocation fails while allowing
overcommit to reduce swap usage. root is allowed to
allocate slightly more memory in this mode. This is the
default.
这样,如果您有4GB的ram并尝试使用虚拟内存的malloc分配4.2 GB,则分配将失败。
使用vm.overcommit_ratio = 1
1 - Always overcommit. Appropriate for some scientific
applications. Classic example is code using sparse arrays
and just relying on the virtual memory consisting almost
entirely of zero pages.
使用vm.overcommit_ratio = 2
2 - Don't overcommit. The total address space commit
for the system is not permitted to exceed swap + a
configurable percentage (default is 50) of physical RAM.
Depending on the percentage you use, in most situations
this means a process will not be killed while accessing
pages but will receive errors on memory allocation as
appropriate.
Useful for applications that want to guarantee their
memory allocations will be available in the future
without having to initialize every page.
因此,默认情况下linux不会过量使用,如果您的应用程序拥有更多的内存,那么您的代码可能有错误