TLB 中可存储的大页条目数量是否有限制

1 cpu cpu-architecture tlb huge-pages

我正在尝试分析虚拟机在使用大页面时获得的网络性能提升。为此,我通过更改 grub 命令行并重新启动,将虚拟机管理程序配置为具有多个 1G 大页面 (36),并且在启动虚拟机时,我确保将大页面传递到虚拟机。在启动 8 个虚拟机(每个虚拟机有 2 个 1G 大页面)并在它们之间运行网络吞吐量测试时,发现吞吐量大大低于没有大页面运行时的吞吐量。这让我想知道,这是否与我使用的大页面数量有关。使用 TLB 可以引用的 1G 大页面数量是否有限制?如果有,它是否低于常规大小页面的限制?我怎么知道这些信息。在这个场景中,我使用的是 Ivy Bridge 系统,并使用 cpuid 命令,我看到了类似的内容

cache and TLB information (2):
  0x63: data TLB: 1G pages, 4-way, 4 entries
  0x03: data TLB: 4K pages, 4-way, 64 entries
  0x76: instruction TLB: 2M/4M pages, fully, 8 entries
  0xff: cache data is in CPUID 4
  0xb5: instruction TLB: 4K, 8-way, 64 entries
  0xf0: 64 byte prefetching
  0xc1: L2 TLB: 4K/2M pages, 8-way, 1024 entries
Run Code Online (Sandbox Code Playgroud)

这是否意味着我在 TLB 中只能有 4 个 1G 大页映射?

Mar*_*oom 5

是的当然。TLB 条目数量的无限上限将需要 CPU 芯片中无限量的物理空间。

每个体系结构中的每个 TLB 对其可容纳的条目数都有上限。

对于 x86 情况,这个数字比您可能预期的要少:它是 4。
在您的 Ivy Bridge 中是 4,​​在我的 Kaby Lake 中仍然是 4,四代之后。

值得注意的是,4 个条目覆盖了 4GiB 的 RAM (4x1GiB),如果使用得当,这似乎足以处理网络问题。
最后,TLB是核心资源,每个核心都有自己的一组TLB。
如果禁用 SMT(例如 Intel 超线程)或将内核上的两个线程分配给同一 VM,则 VM 将不会竞争 TLB 条目。

但是,每个 VM 最多只能缓存 4xC 个大页条目,其中C是专用于该 VM 的核心数量。
VM 充分利用这些条目的能力取决于主机操作系统、虚拟机管理程序和来宾操作系统如何协同工作以及感兴趣的来宾应用程序的内存布局(跨内核共享的页面在每个内核中都有重复的 TLB 条目) )。
透明地使用 1GiB 页面很难(几乎不可能?),我不确定虚拟机管理程序和虚拟机将如何使用这些页面 - 我想说你需要对此的特定支持,但我不确定。

正如Peter Cordes指出的,1GiB 页面使用单级 TLB(在 Skylake 中,显然还有一个二级 TLB,其中 1GB 页面有 16 个条目)。1GiB TLB 的缺失将导致页面遍历,因此所有涉及的软件都使用页面感知代码非常重要。

  • @PeterCordes:仅供参考,根据[此英特尔文档](https://www.intel.com/content/dam/develop/external/us/en/documents/run-perf-opt-bp-large-code-pages -q1update.pdf),在 Broadwell 一代中添加了用于 1G 页的 16 项二级 TLB 缓存(请参见第 4 页顶部)。 (2认同)