现代的x86 CPU能够支持比传统的4K(即2MB或4MB)更大的页面大小,并且有操作系统功能(LinuxWindows)可以访问此功能。

上面的Microsoft链接指出,大页面“提高了转换缓冲区的效率,这可以提高频繁访问的内存的性能”。这对预测大页面是否可以改善任何给定情况不是很有帮助。我对具体的示例(最好是量化的示例)感兴趣,这些示例将某些程序逻辑(或整个应用程序)移动到使用大页面的位置可以带来一些性能改进。任何人都有成功的故事吗?

我知道myself的一种特殊情况:使用大页面可以使dramatically减少派生大型进程所需的时间(大概是因为需要复制的TLB记录的数量减少了1000倍左右)。我对大型页面是否也可以在不那么奇特的情况下受益还很感兴趣。

最佳答案

当您对宽大的内存区域进行大范围的随机访问时,性能上的最大区别将出在这里–“大”表示比TLB中所有小页面条目可以映射的范围大得多(通常在现代处理器中具有多个级别)。

使事情变得更复杂的是,用于4kB页的TLB条目的数量通常大于用于2MB页的TLB条目的数量,但这因处理器而异。级别2 TLB中可用的“大页面”条目数量也有很大的不同。

例如,在AMD Opteron系列10h版本D(“ Istanbul 尔”)系统上,cpuid报告:

  • L1 DTLB:4kB页:48个条目; 2MB页面:48个条目; 1GB页面:48个条目
  • L2 TLB:4kB页:512条目; 2MB页面:128个条目; 1GB页面:16个条目

  • 在Intel Xeon 56xx(“Westmere”)系统上,cpuid报告:
  • L1 DTLB:4kB页:64个条目; 2MB页面:32个条目
  • L2 TLB:4kB页:512条目; 2MB页面:无

  • 两者都可以在遭受第2级TLB丢失之前使用小页面映射2MB(512 * 4kB),而Westmere系统可以使用其32个2MB TLB条目来映射64MB,而AMD系统可以使用其L1和L2中的176个2MB TLB条目来映射352MB。 TLB。通过使用大页面对大于2MB且小于64MB的内存范围进行随机访问,这两种系统都可以显着提高速度。对于大得多的内存范围,使用大页面的AMD系统应该继续显示出良好的性能。

    在所有这些情况下,您都想要避免的是遍历x86_64分层地址转换的所有四个级别的最坏情况(注释1)。
    如果地址转换缓存机制(注2)都不起作用,则需要:
  • 5次访问内存以加载映射到4kB页面
  • 上的数据
  • 4次访问内存以加载映射到2MB页面上的数据,而
  • 3跳至内存以加载映射到1GB页面上的数据。

  • 在每种情况下,最后一次访问内存都是为了获取请求的数据,而其他两次访问则需要获取页面转换信息的各个部分。
    我见过的最好的描述是在AMD的“AMD64体系结构程序员手册第二卷:系统编程”的第5.3节(出版物24593)中http://support.amd.com/us/Embedded_TechDocs/24593.pdf

    注1:上面的数字并不是最坏的情况。在虚拟机下运行会使这些数字更糟。在一个环境中运行该环境会导致持有各个级别的页表的内存被交换到磁盘,这会使性能大大降低。

    注意2:不幸的是,仅知道这一详细级别是不够的,因为所有现代处理器都为页面转换层次结构的较高级别提供了额外的缓存。据我所知,这些在公开场合记录得很少。

    关于performance - 在什么情况下大页面可以提高速度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2876377/

    10-11 22:25
    查看更多