如何在Linux上使用英特尔Westmere 1GB页面?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (65)

为了进行基准测试,我试图在运行于两个Intel Xeon 56xx(“Westmere”)处理器之上的Linux 3.13系统中安装1GB页面。当我运行hugeadm --pool-list时 导致:

      Size  Minimum  Current  Maximum  Default
1073741824       10       10       10        *

我的内核启动参数被考虑在内。在我的基准测试中,我分配了1GiB的内存,我想用1GiB的巨大页面来支持:

#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)

我们可以看到一个巨大的页面被分配了:

AnonHugePages:      4096 kB
HugePages_Total:      10
HugePages_Free:        9
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:    1048576 kB

这个工作台通过指针追踪随机访问分配的内存:第一步填充内存以启用指针追逐,然后在第二步中,工作台通过内存导航 :

pointer = *pointer;

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

此外,该cpuid工具在我的系统中报告了关于tlb的以下内容:

   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中可以缓存多少个这样的页面?

提问于
用户回答回答于

TL; DR:

在这种情况下,无法从1GB页面中获益,但是你的代码在没有可以修改的系统上是正确的。

长版

我按照这些步骤尝试重现你的问题:

My System: Intel Core i7-4700MQ, 32GB RAM 1600MHz, Chipset H87
  1. svn co https://github.com/ManuelSelva/c4fun.git
  2. cd c4fun.git/trunk
  3. make。发现了一些依赖需要。安装它们。建设失败,但mem_load建立和联系,所以没有进一步追求休息。
  4. 重新引导系统,在GRUB时间附加以下引导参数: hugepagesz=1G hugepages=10 default_hugepagesz=1G 其中保留10个1GB页面。
  5. cd c4fun.git/trunk/mem_load
  6. 然使用多次测试memload,在随机存取图案模式,并将其钉扎到芯3,这恐怕是不为0(引导处理器)。
    • ./mem_load -a rand -c 3 -m 1073741824 -i 1048576 这导致大约无TLB失误。
    • ./mem_load -a rand -c 3 -m 10737418240 -i 1048576 这导致约60%的TLB未命中。在我的预感上,我做到了
    • ./mem_load -a rand -c 3 -m 4294967296 -i 1048576 这导致大约无TLB失误。在我的预感上,我做到了
    • ./mem_load -a rand -c 3 -m 5368709120 -i 1048576 这导致约20%的TLB未命中。

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

   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):

扫码关注云+社区

领取腾讯云代金券