Home > Linux > Linux下试验大页面映射(MAP_HUGETLB)

Linux下试验大页面映射(MAP_HUGETLB)

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: Linux下试验大页面映射(MAP_HUGETLB)

Linux对大页面内存的引入对减少TLB的失效效果不错,特别是内存大而密集型的程序,比如说在数据库中的使用。innodb引擎就支持大页面内存,具体使用可参见 这里

大页面更详细的资料可以参考: Documentation/vm/hugetlbpage.txt

过去使用大页面内存主要透过hugetlbfs需要mount文件系统到某个点去,部署起来很不方便,我们只想要点匿名页面,要搞的那么麻烦吗?
新的2.6.32内核通过支持MAP_HUGETLB方式来使用内存,避免了烦琐的mount操作,对用户更友好。

参见man mmap:

MAP_HUGETLB (since Linux 2.6.32)
Allocate the mapping using “huge pages.” See the kernel source file Documentation/vm/hugetlbpage.txt for further information.

这样明显会方便些,但是大内存页面预留的操作还是要做的,我们来演示下,先来准备环境:

# uname -a
Linux dr4000 2.6.32-131.17.1.el6.x86_64 #1 SMP Wed Oct 5 17:19:54 CDT 2011 x86_64 x86_64 x86_64 GNU/Linux

# cat /proc/meminfo |grep -i huge
AnonHugePages:      2048 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

# sysctl vm.nr_hugepages=192
vm.nr_hugepages = 192

# cat /proc/meminfo |grep -i huge
AnonHugePages:      2048 kB
HugePages_Total:     192
HugePages_Free:      192
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

从上面输出可以看到我们的内核是2.6.32, 我用的是RHEL 6U2发行版本,同时保留了192*2M页面。

再来看演示代码如下:

# cat huge.c
#include <sys/mman.h>
#include <stdio.h>
#include <memory.h>

int main(int argc, char *argv[]) {
  char *m;
  size_t s = (8UL * 1024 * 1024);

  m = mmap(NULL, s, PROT_READ | PROT_WRITE,
                    MAP_PRIVATE | MAP_ANONYMOUS | 0x40000 /*MAP_HUGETLB*/, -1, 0);
  if (m == MAP_FAILED) {
    perror("map mem");
    m = NULL;
    return 1;
  }

  memset(m, 0, s);

  printf("map_hugetlb ok, press ENTER to quit!\n");
  getchar();

  munmap(m, s);
  return 0;
}
# gcc huge.c
# ./a.out 
map_hugetlb ok, press ENTER to quit!

我们成功用大页面申请了8M内存,4个大页面,同时进行清零操作成功,再munmap之前,我们需要确认内存确实是被我们使用了。

好,切换到另外一个窗口来看下:

# cat /proc/meminfo |grep -i huge
AnonHugePages:      2048 kB
HugePages_Total:     192
HugePages_Free:      188
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

是不是不费吹灰之力就成功了,这也说明内核天天在进步。

祝玩得开心!

Post Footer automatically generated by wp-posturl plugin for wordpress.

Categories: Linux Tags: ,
  1. richardc
    March 15th, 2012 at 14:29 | #1

    我们成功用大页面申请了4M内存?
    没看懂,貌似是2M一个page,申请了四个page,8M吧?

    [Reply]

    Yu Feng Reply:

    谢谢指出错误!是8M内存,4个页面,已经更正。

    [Reply]

  2. anan
    July 7th, 2014 at 10:36 | #2

    /*MAP_HUGETLB*/, 注释掉为何???

    [Reply]

  1. No trackbacks yet.