我正在学习 RHCSA,对我在一些培训材料中看到的一句话感到困惑:
没有实际的最大 RAM,理论上,您可以在 RHEL 6 上运行 128 TB RAM。但这只是理论。 RHEL 6 上的 Red Hat 支持的最大 RAM 在 32 位系统上为 16 GB,在 64 位系统上为 2 TB。
有人可以解释一下 128 TB 理论限制是从哪里来的吗?如果 RHEL 6 明确定义了其他最大限制,我很困惑作者如何知道理论限制的存在。这是否只是考虑到 64 位架构的理论限制?或者这里还有其他原因吗?
答案1
从内核文档中,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
答案2
简短回答
每个 Linux 进程最多可寻址 128 TB虚拟的记忆。然而,这超出了 Linux 内核的处理能力身体上的。因此,这个限制是理论上的。
它可能是基于假定的可预见的“最坏情况”使用场景而任意选择的。
详细解答
实际上,您使用的 RAM 不能超过硬件允许的数量(48 位 =256TB 常见这些天),然后你将受到 Linux 内核可以处理的物理内存量的限制。
例如,在英特尔x86 64 位Linux 不能使用超过64TB物理内存(自版本2.6.30, 但它是 16TB就在之前)。请注意,RHEL 6 使用2.6.32核心。
在 64 位上S390架构, 这相同的限制适用(因为2.6.28)。但是,如果您使用 32 位,则限制为4GB,但是使用奇怪的戏法叫PAE,你可能会上升到64GB(通常在 x86 上使用)。
我认为其他 64 位架构的限制较低。
请参见红帽极限表欲了解更多信息(谢谢惠更斯)。
答案3
人们不应该混淆虚拟内存和物理易失性内存。前者是特定于 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 的功能。他们明确指出“最大 x86_64 每个进程虚拟地址空间 [...] 128TB [对于 RHEL 6]”
该页面指出 RHEL 6 最大支持 2TB/64TB RAM(物理易失性内存)。我猜这意味着它经过了最大 2TB RAM 的认证,理论上可以达到 64TB。SLES在这方面就清楚多了。
答案4
它仅仅是理论性的另外一个原因是缺乏实施经验。
程序员通常会远远提前于硬件的能力来确定变量的大小,这样内核就不需要危险的“推倒重来”编程,因为这种能力的硬件在十年或更长时间后才会出现。
然而,可变大小并不是唯一的限制。数据结构及其算法有其自身的限制。想象一下对描述 128TB 的每个 4KB 页的数据结构进行线性遍历。有一些明显的反应:不要使用 4KB 页面,不要使用线性数据结构,不要经常访问这些数据结构,尽可能将负载卸载到硬件中。但是还有更微妙的数据结构+算法限制,只有遇到它们我们才会知道。
我们知道,如果我们明天神奇地发现一台 128TB 的 PC 并尝试在其上启动 Linux,它的性能将会非常糟糕,甚至可能会严重到无法启动。但是修复算法是微不足道的,修复数据结构是一些工作,但仍然比修复广泛理解的变量的大小要少得多。因此,随着内存大小的增加,我们将看到这种性质的变化。