2012-01-10 714 views
1

x64 Linux中是否有单个进程的内存限制?x64 Linux中的单进程最大可能内存

我们正在运行一个带有32Gb内存的Linux服务器,我想知道是否我可以将它的大部分分配给我需要大量RAM的单个进程。

+2

你可以尝试一下,看看自己。应该没有实际的限制 - 因为我已经能够在Ubuntu的64GB机器上分配超过60GB的连续内存。 – Mysticial 2012-01-10 06:40:26

回答

4

某些内核具有不同的限制,但在任何现代64位Linux上,单进程限制仍远远超过32GB(假设进程是64位可执行文件)。使用sysctl时,各种分布也可能设置了每个进程的限制,因此您需要检查当地环境以确保没有设置任意的低限(同时在基于RPM的系统上检查ipcs -l)。

AMD64端口的Debian port documentation明确提到每个进程的虚拟地址空间限制是128TiB(物理内存限制的两倍),所以应该是您正在使用的合理上限。

3

资源限制使用setrlimit系统调用进行设置。您可以使用内建的shell来更改它们(例如,bash中的ulimit,zsh中的limit)。

实际限制还与RAM大小和交换大小有关。 free命令显示这些。 (有些系统过度使用内存,但这是有风险的)。

一个进程实际上不使用RAM,它使用系统调用如mmap(可能会被malloc调用)来使用virtual memory。您甚至可以使用该呼叫将文件的一部分映射到内存中。

要了解进程1234的内存映射,请查看/proc/1234/maps文件。从您自己的应用程序中,阅读/proc/self/maps。你也有/proc/1234/smaps/proc/self/smaps。尝试命令cat /proc/self/maps以了解运行该进程的内存映射cat

在32Gb RAM机器上,通常可以运行31 Gb的进程空间进程(假设没有其他大进程)。如果你还有64Gb的交换空间,你可以运行一个至少64Gb的进程,但是速度会非常慢(大部分时间都花在交换磁盘上)。您可以添加交换空间(例如,通过交换到文件,使用dd然后mkswap进行初始化,并使用swapon激活)。

如果要编码服务器,请务必小心memory leaksvalgrind工具有助于捕捉此类错误。您可以考虑使用Boehm's garbage collector

3

当前的64位Linux内核对64TB的物理RAM和128TB的虚拟内存有限制(请参阅RHEL limitsDebian port)。由于CPU中的地址寄存器如何使用所有位(高位用于页面标志,例如ReadOnly,Writable等),所以当前的x86_64 CPU(即我们在PC中拥有的)具有(虚拟)地址限制2^48 = 256TB。 ExecuteDisable,PagedToDisc等),但规范允许切换到真正的64位地址模式,在2^64 = 16EB(Exa字节)处达到最大值。但是,主板和CPU芯片没有太多的引脚来通过地址总线将所有48位存储器地址传送到RAM芯片,因此物理RAM的限制较低(取决于制造商),但虚拟地址空间本质上可以超过主板上RAM的数量,超过上述虚拟内存的限制。

每个进程的限制是通过如何设置进程的内存虚拟地址空间来提高的,因为堆栈,mmap()区域(和动态库),程序代码本身以及内核映射到进程空间。其中一些设置可以通过向链接器传递参数(有时通过源代码中的特殊指令)或直接使用程序修改二进制文件(二进制文件具有ELF格式)来更改。机器(root)已设置或用户拥有的管理员也有限制(请参阅命令“ulimit -a”的输出)。这些限制可能很软或很难,用户无法克服硬限制。

此外,Linux内核可以设置为允许内存过度使用分配。在这种情况下,程序可以分配大量的RAM,然后只使用几页(参见稀疏矩阵,稀疏矩阵),请参阅Linux kernel documentation。所以在这种情况下,只有在数据填满所请求的内存之后,程序才会失败,而不是在内存分配时。

相关问题