单进程x64 Linux中最大可能的内存

在x64 Linux中是否有单个进程内存限制?

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

Solutions Collecting From Web of "单进程x64 Linux中最大可能的内存"

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

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

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

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

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

要了解进程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激活)。

如果要编码服务器,请注意内存泄漏 。 valgrind工具有助于捕捉这些错误。 你可以考虑使用Boehm的垃圾收集器

目前的64位Linux内核已经限制到64TB的物理内存和128TB的虚拟内存(请参阅RHEL限制和Debian端口 )。 由于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内核文档 。 所以在这种情况下,程序只有在数据填满请求的内存后才会失败,而不是在内存分配的时候。