当您对大内存区域进行大间隔随机访问时,性能的最大差异将出现——其中“大”意味着比 TLB 中所有小页面条目可以映射的范围大得多(通常在现代处理器中具有多个级别)。
更复杂的是,4kB 页面的 TLB 条目数通常大于 2MB 页面的条目数,但这因处理器而异。2 级 TLB 中可用的“大页面”条目的数量也有很多变化。
例如,在 AMD Opteron Family 10h Revision 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 架构程序员手册第 2 卷:系统编程”(出版物 24593)的第 5.3 节http://support.amd.com/us/Embedded_TechDocs/24593.pdf
注 1:上面的数字并不是最坏的情况。在虚拟机下运行会使这些数字变得更糟。在导致保存不同级别页表的内存被交换到磁盘的环境中运行会使性能变得更糟。
注 2:不幸的是,即使知道这一级别的细节还不够,因为所有现代处理器都有额外的缓存用于页面转换层次结构的上层。据我所知,这些在公共场合的记录非常差。