Linux上的虚拟内存大小

问题描述:

我想深入了解OS Linux上的虚拟内存管理。Linux上的虚拟内存大小

我真的不明白操作系统如何确定虚拟机的大小的过程。

我知道,一个32位的x86操作系统可以到3 GB的虚拟寻址空间放弃...它始终是真的吗?

在我的情况,我有大约110 MB与物理存储器和32位Linux和我的主要过程有一个VM寻址空间约660 MB。但是,物理内存(我的进程中的RSS)只有50 MB,因此我的物理RAM未满。其余的都是免费的,几乎整个页面都被页面缓存使用。这似乎是一种正常的行为。

如果我检查/ proc/my_process_PID/SMAP,有几个8 MB匿名VMA。

我的实际问题是我需要在代码中做一个额外的10 MB malloc,但不幸的是OOM杀手杀死了我的进程(内存不足)...我认为没有更多的免费可用页面堆的vm,不是吗?某处存在巨大的内存泄漏吗?

为什么OS不延长我的过程中VM的大小呢?

有关信息提供虚拟机的大小是无限的:-v的ulimit:无限

+0

你的问题到底是什么;你期望操作系统给你不存在的内存?机器是否具有页面文件或磁盘形式的任何“支持存储”? – wildplasser

+0

我“不能”理解的是我的操作系统为110 MB的物理内存提交了大约660 MB的虚拟内存,现在操作系统不允许我在进程中分配额外的10 MB。为什么他不将vm大小扩展到670 MB? –

+0

660/110有六倍过度使用。这很难。但请记住:还有其他过程。 (试图找出哪些;也许你可以在那里削减)而操作系统想要为新启动的进程和缓冲区保留一些冗余内存。 – wildplasser

可以有3GB的每个进程的虚拟内存(约,在很多32位Linux),并不断创造新的进程占用了千兆字节以千兆字节为单位的虚拟内存。内核的开销很小,但虚拟内存非常便宜。您使用的地址空间量可能并不重要,它可能不会触发OOM杀手。

但是,您的系统只有这么多RAM。当您在地址空间(写入)中使用页面启动时,内核被迫查找物理RAM来映射它们。如果没有物理RAM,内核可以从RAM中驱逐其他页面 - 将它们交换出来或丢弃它们。但是如果它不能驱逐任何页面,那么它会触发OOM杀手。

用完地址空间将导致malloc在我的系统上返回NULL,而不是触发OOM杀手。

这听起来像你的过程只是使用太多的RAM。 RSS不是您的进程使用的内存量,而只是物理内存量。如果你的进程存在内存泄漏并且持续增长,RSS最终会停止增长 - 因为对于你使用的每一个新页面,内核都会从你的进程中逐出一页。

尝试使用内存设置,像Valgrind的。这将帮助你理清你应该担心的内存(malloc)以及你可以忽略的内存(共享库和其他内存映射文件)。内核(和/ proc)不会给你足够的细节。

Linux系统上可用的虚拟内存空间总量(大致)为RAM + swap space-kernel overhead。 RAM是您安装的硬件,内核开销大致是一个常量(不同内核版本之间有所不同),因此控制可用虚拟机总空间的唯一简单方法是添加或删除交换空间。

除了总限制之外,还有每个进程的VM限制。这是可配置的,并且(至少在32位linux上)最多为3GB,但可能会少一些。 ulimit -v会告诉你这个限制或可以用来改变它。

当一个进程请求更多的VM空间(通常是通过malloc的),内核将考虑所有的这些限制,以及其中是否会被超越,将只返回0。OOM杀手,而另一方面,当您接近总VM限制时开始投入。但是,当OOM杀手杀死你时,你就会死亡 - 没有内存不足的错误或任何机会来捕捉它。因此,如果你真的遇到总的VM限制,并且想要避免这种情况,你可以分配更多的交换空间,或者摆脱(杀死或不首先启动)其他正在使用的进程大量的虚拟机空间,以释放一些为您的程序。