HugePage简介和KVM中使用HugePage

现在,有许多的处理器架构都支持多种的内存页大小,其中就包括比一般的page size大很多的huge page。就目前来说,尽管在个人电脑中基本都实现了对huge page的支持,然而,huge page的使用主要还是在一些大型服务器和计算机集群中使用。

1,一般的内存页查询:

# getconf PAGE_SIZE

说明:一般是4096Byte

 

2,hugepagesize查询

# cat /pro/meminfo | grep Huge

Hugepagesize=2048

说明:不同的处理器架构,可能不一样,通常情况下,是2048KB即2M.

C程序调用接口:sysconf(_SC_PAGESIZE));  /* _SC_PAGE_SIZE is OK too. */ 涉及头文件:unistd.h

 

3, 查看hugepage相关信息

cat /proc/meminfo | grep Huge

2.huge page的相关信息:cat /proc/meminfo | grep Huge

HugePages_Total:    1024

HugePages_Free:     1024

HugePages_Rsvd:        0

HugePages_Surp:        0

Hugepagesize:       2048 kB

说明:

HugePages_Total: Hugepage的页面数量

HugePages_Free: 剩余的页面数量

HugePages_Rsvd: 被分配预留但是还没有使用的page数目

HugePages_Surp:HugePages_Total减去/proc/sys/vm/nr_hugepages中的值(我对这个理解也不很清楚)。

Hugepagesize: 每单位数量大小

又摘:

 HugePages_Total: 所分配的页面数目,
    和Hugepagesize相乘后得到所分配的内存大小。43000*2/1024大约为84GB
HugePages_Free:  从来没有被使用过的Hugepages数目。
    即使oracle sga已经分配了这部分内存,但是如果没有实际写入,那么看到的还是Free的。这是很容易误解的地方
HugePages_Rsvd:  已经被分配预留但是还没有使用的page数目。
    在Oracle刚刚启动时,大部分内存应该都是Reserved并且Free的,随着oracle SGA的使用,Reserved和Free都会不断的降低
HugePages_Total为设定的值大小,HugePages_Free应该和HugePages_Total一样大,HugePages_Rsvd为0.

HugePages_Free – HugePages_Rsvd 这部分是没有被使用到的内存,如果没有其他的oracle instance,这部分内存也许永远都不会被使用到,也就是被浪费了。在该系统上有11.5GB的内存被浪费了。

4设置huge pages

  首先mount一个hugetlbfs文件系统: mount -t hugetlbfs hugetlbfs /dev/hugepages

  然后为huge pages保留一定数量的内存:sysctl vm.nr_hugepages=1024

  (或者在/etc/sysctl.conf加入一行:vm.nr_hugepages=1024)

设置完后用命令sysctl -p 使得设置生效

  (或者,改动linux启动的grub参数也是可以的,加上 hugepages=1024 这样的参数)

 

其它:

 

1.设置了多少的huge page,free内存就会被使用多少。

  比如:我使用sysctl vm.nr_hugepages=1024 之后,free命令可以看到free的内存会减少nr_hugepages*Hugepagesize大小,这里是2048M。

 

2,使用Hugepages的内存页是不会被交换出去到磁盘的,永远常驻在内存中,所以也减少了内存页交换的额外开销。使用hurgepage的内存不能被其他的进程使用,所以,一定要合理设置这个值,避免造成浪费。使用超过8G物理内存的系统,有人推荐使用HugePage。

 HugePages_Free - HugePages_Rsvd部分的内存是浪费的,且不能被其他程序使用。在实际应用中,尽可能让HugePages_Free - HugePages_Rsvd=0

 

3,HugePage的好处:

  大大提高了CPU cache中存放的page table所覆盖的内存大小,从而提高了TLB命中率。进程的虚拟内存地址段先连接到page tables然后再连接到物理内存。所以在访问内存时需要先访问page tables得到虚拟内存和物理内存的映射关系,然后再访问物理内存。CPU cache中有一部分TLB(Translation Lookaside Buffer)用来存放部分page table以提高这种装换的速度。因为page size变大了,所以同样大小的TLB,所覆盖的内存大小也变大了。提高了TBL命中率,也就是提高了地址转换的速度。

  系统进程是通过虚拟地址访问内存,但是CPU必须把它转换程物理内存地址才能真正访问内存。为了提高这个转换效率,CPU会缓存最近的虚拟内存地址和物理 内存地址的映射关系,并保存在一个由CPU维护的映射表中。为了尽量提高内存的访问速度,需要在映射表中保存尽量多的映射关系。

 

 4,Linux kernel 2.6.X 通过hugetlbfs文件系统对Huge pages进行了支持。当然Windows也有相应的支持,此处暂不详述。

 

 5,KVM如何让guest使用huge pages ?

  首先,让host开启huge pages(像上面那样设置)

  在qemu启动时加上参数,示例:qemu-system-x86_64 -m 2048 -hda /mnt/rhel6.img -mem-path /dev/hugepages

  如果是用libvirt来启动KVM的,那么需要在启动guest的XML配置文件中添加如下的参数:

 

  (启动guest后,可以发现,在host中的cat /pro/meminfo看到的HugePages_Free数量有所减少)

 

posted @ 2015-08-22 11:22 咚咚锵锵 阅读(...) 评论(...) 编辑 收藏