Answers:
从内核文档中,在Documentation/x86/x86_64/mm.txt
:
Virtual memory map with 4 level page tables:
0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm
2 47字节= 128TiB
每个Linux进程最多可以处理128 TB的虚拟内存。但是,这不仅仅是Linux内核可以实际处理的。因此,该限制是理论上的。
根据可能的“最坏情况”使用场景,可能已任意选择了它。
您实际使用的RAM不能超过硬件允许的数量(这些天通常是 48位= 256 TB ),然后您将受到Linux内核可以处理的物理内存量的限制。
例如,在Intel x86 64位架构,Linux不能使用超过64 TB的物理内存(从版本2.6.30,但它是 16 TB之前)。请注意,RHEL 6使用2.6.32内核。
在64位s390体系结构上,将应用相同的限制(自2.6.28开始)。但是,如果您使用32位,则限制为4 GB,但是使用一个称为PAE的奇怪技巧,您可能会增加到64 GB(通常在x86上使用)。
我认为其他64位体系结构具有较低的限制。
有关更多信息,请参见Red Hat 限制表(感谢Huygens)。
不应混淆虚拟内存和物理易失性内存。前者特定于CPU体系结构,并将映射到易失性和非易失性存储器。从内核的角度来看,后者(即RAM)应独立于CPU体系结构。
今天的AMD和Intel x86_64实现仅支持48位可寻址虚拟内存。这意味着内核可以为每个进程VM处理2 ^ 48 = 256 TiB。
x86_64体系结构上的Linux内核将可寻址的VM空间分为2个,用户空间为128 TiB,内核空间为128 TiB。因此,一个过程理论上可以处理总共128 TiB的虚拟内存。
内核可以处理的易失性物理内存的最大值是一个不同的方面,但是我不知道此信息。
关于RHCSA作者声明
声明的作者“没有实际的最大RAM,从理论上讲,您可以在RHEL 6上运行128 TB RAM。” 使用错误或误解的术语。这是Red Hat网站上的表格,总结了RHEL 3、4、5和6的功能。他们明确指出“ [针对RHEL 6的最大x86_64每个进程的虚拟地址空间为128TB]。
该页面指出RHEL 6最多支持2TB / 64TB RAM(物理易失性内存)。我猜这意味着它已经过2TB最大RAM的认证,理论上可以达到64TB。SLES在这方面要清晰得多。
理论上的另一个原因是缺乏实施经验。
对于程序员来说,通常要比硬件具有的功能早得多地确定变量的大小,这样一来,随着具有该功能的硬件出现十年或更长时间,内核就不需要进行危险的拆装编程。
但是可变大小不是唯一的限制。数据结构及其算法施加了自己的限制。想象一下,对描述128TB的每个4KB页的数据结构进行线性遍历。有一些明显的响应:不要使用4KB页面,不要使用线性数据结构,不要经常访问那些数据结构,将尽可能多的负载卸载到硬件中。但是,还有更多微妙的数据结构+算法限制,直到遇到这些限制我们才知道。
我们知道,如果明天我们能神奇地发现一台128TB的PC并尝试在其上启动Linux,它的性能将非常糟糕,甚至可能无法启动。但是,固定算法是微不足道的,固定数据结构是一项工作,但比固定已广为人知的变量的大小要少得多。因此,随着内存大小的增加,我们将看到这种性质的变化。