首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Linux上使用英特尔威斯特米尔1 1GB页面?

如何在Linux上使用英特尔威斯特米尔1 1GB页面?
EN

Stack Overflow用户
提问于 2015-01-15 04:24:24
回答 1查看 2.3K关注 0票数 20

编辑:我用基准测试的详细信息更新了我的问题

为了进行基准测试,我尝试在Linux 3.13系统中设置1 1GB的页面,该系统运行在两个Intel Xeon 56xx (“韦斯特米尔”)处理器之上。为此,我修改了引导参数,添加了对1 1GB页面(10个页面)的支持。这些引导参数只包含1 1GB的页面,不包含2MB的页面。运行hugeadm --pool-list会导致:

代码语言:javascript
复制
      Size  Minimum  Current  Maximum  Default
1073741824       10       10       10        *

我的内核引导参数也会被考虑在内。在我的基准测试中,我分配了1GiB的内存,我想用一个1GiB的大页面来支持它,使用:

代码语言:javascript
复制
#define PROTECTION (PROT_READ | PROT_WRITE)
#define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB)
uint64_t size = 1UL*1024*1024*1024;
memory = mmap(0, size, PROTECTION, FLAGS, 0, 0);
if (memory == MAP_FAILED) {
    perror("mmap");
    exit(1);
}
sleep(200)

在工作台处于睡眠状态时查看/proc/meminfo (上面的sleep调用),我们可以看到已经分配了一个巨大的页面:

代码语言:javascript
复制
AnonHugePages:      4096 kB
HugePages_Total:      10
HugePages_Free:        9
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:    1048576 kB

注意:在运行bench之前禁用了THP (通过/sys文件系统),所以我猜/proc/meminfo报告的AnonHugePages字段表示在停止它之前由THP分配的巨大页面。

在这一点上,我们可以认为一切都很好,但不幸的是,我的工作台让我认为使用了许多2MiB页面,而不是一个1GiB页面。以下是解释:

该工作台通过指针跟踪随机访问分配的内存:第一步填充内存以启用指针跟踪(每个单元格指向另一个单元格),第二步工作台使用

代码语言:javascript
复制
pointer = *pointer;

使用perf_event_open系统调用,我只对工作台的第二步的数据TLB读取未命中进行计数。当内存分配的大小是64MiB时,我计算了一个非常小的数字,6400000次内存访问中的0.01%,数据TLB读取未命中。所有的访问都保存在TLB中。换句话说,64MiB的内存可以保留在TLB中。一旦分配的内存大小大于64TLB,我就会看到data MiB读取未命中。对于等于128TLB的内存大小,我的6400000次内存访问中有50%是在MiB中未命中的。64MiB似乎是TLB中可以容纳的大小,64MiB = 32个条目(如下所述)* 2MiB页。我的结论是,我使用的不是1GiB页面,而是2MiB页面。

你能看到对这种行为的任何解释吗?

此外,cpuid工具会报告以下有关我系统上的tlb的信息:

代码语言:javascript
复制
   cache and TLB information (2):
      0x5a: data TLB: 2M/4M pages, 4-way, 32 entries
      0x03: data TLB: 4K pages, 4-way, 64 entries
      0x55: instruction TLB: 2M/4M pages, fully, 7 entries
      0xb0: instruction TLB: 4K, 4-way, 128 entries
      0xca: L2 TLB: 4K, 4-way, 512 entries
   L1 TLB/cache information: 2M/4M pages & L1 TLB (0x80000005/eax):
   L1 TLB/cache information: 4K pages & L1 TLB (0x80000005/ebx):
   L2 TLB/cache information: 2M/4M pages & L2 TLB (0x80000006/eax):
   L2 TLB/cache information: 4K pages & L2 TLB (0x80000006/ebx):

正如您所看到的,没有关于1GiB页面的信息。在TLB中可以缓存多少这样的页面?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-20 06:55:13

TL;DR

在这种情况下,您(特别是您的处理器)不能从1 1GB的页面中获益,但是您的代码在没有修改的情况下是正确的。

长版本

我按照以下步骤尝试重现您的问题。

代码语言:javascript
复制
My System: Intel Core i7-4700MQ, 32GB RAM 1600MHz, Chipset H87

  1. svn co https://github.com/ManuelSelva/c4fun.git

  1. cd c4fun.git/trunk

  1. make.发现需要一些依赖项。安装了它们。构建失败,但mem_load确实构建并链接了,因此不再继续进行其他操作。

  1. 重新启动了系统,并在GRUB时将以下内容附加到启动参数中:

hugepagesz=1G hugepages=10 default_hugepagesz=1G

它保留了10个1 1GB的页面。

  1. cd c4fun.git/trunk/mem_load

  1. 在随机访问模式模式下使用memload运行了几个测试,并将其固定在核心3上,核心3不是0(引导处理器)。

代码语言:javascript
复制
- `./mem_load -a rand -c 3 -m 1073741824 -i 1048576`

这导致了大约零个TLB未命中。

代码语言:javascript
复制
- `./mem_load -a rand -c 3 -m 10737418240 -i 1048576`

这导致了大约60%的TLB未命中。凭直觉我是这么做的

代码语言:javascript
复制
- `./mem_load -a rand -c 3 -m 4294967296 -i 1048576`

这导致了大约零个TLB未命中。凭直觉我是这么做的

代码语言:javascript
复制
- `./mem_load -a rand -c 3 -m 5368709120 -i 1048576`

这导致了大约20%的TLB未命中。

此时,我下载了cpuid实用程序。它给了我这个给cpuid -1 | grep -i tlb

代码语言:javascript
复制
   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
      0xb5: instruction TLB: 4K, 8-way, 64 entries
      0xc1: L2 TLB: 4K/2M pages, 8-way, 1024 entries
   L1 TLB/cache information: 2M/4M pages & L1 TLB (0x80000005/eax):
   L1 TLB/cache information: 4K pages & L1 TLB (0x80000005/ebx):
   L2 TLB/cache information: 2M/4M pages & L2 TLB (0x80000006/eax):
   L2 TLB/cache information: 4K pages & L2 TLB (0x80000006/ebx):

如您所见,我的TLB中有4个条目对应于1 1GB的页面。这很好地解释了我的结果:对于1 1GB和4 1GB,TLB的4个插槽完全足以满足所有访问。对于5 5GB和随机访问模式模式,5个页面中的4个只能通过TLB映射,因此将指针追逐到剩余的一个页面将导致未命中。追逐指针进入未映射页面的概率是1/5,因此我们预计错失率为1/5 = 20%,我们得到了这一点。对于10 got,映射了4/10页,而不映射6/10页,因此错失率将为6/10=60%,我们得到了这一点。

所以你的代码至少不需要修改就能在我的系统上运行。那么你的代码就不会有问题了。

然后我在CPU-World上做了一些研究,虽然不是所有的CPU都列出了TLB几何数据,但也有一些列出了。我看到的唯一与您的cpuid打印输出完全匹配(可能还有更多)的是Xeon Westmere-EP X5650;CPU- TLB0没有明确表示Data World具有1 GB页面的条目,但表示处理器支持"1 GB大页面“。

然后我做了更多的研究,最终成功了。RealWorldTech的一位作者在讨论Sandy Bridge的内存子系统时做了一个即席评论(诚然,我还必须找到一个来源)。它读取的是as follows

在地址生成之后,与高速缓存访问的开始并行,微操作将访问

以从虚拟地址转换为物理地址。DTLB基本保持不变,但对1 1GB页面的支持有所提高。之前,添加了对1 1GB页面的支持,但由于没有任何1 1GB页面条目,因此将1 1GB页面分成多个2MB页面。

(已添加强调)

结论

无论"CPU支持1 1GB页“的模糊概念代表什么,英特尔认为它并不意味着"TLB支持1 1GB页条目”。我担心您无法在Intel Westmere处理器上使用1 1GB的页面来减少TLB未命中的数量。

或者,英特尔通过区分大页面(在TLB中)和大页面来欺骗我们。

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27951778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档