x86(包括x86-32x86-64)架构的CPU默认使用4KB大小的内存页面(getconf PAGESIZE),但是它们也支持较大的内存页,如x86-64系统就支持2MB大小的大页(huge page)

Linux 2.6及以上的内核都支持huge page

如果在系统中使用了huge page,则内存页的数量会减少,从而需要更少的页表(page table)约了页表所占用的内存数量,并且所需的地址转换也减少了,TLB缓存失效的次数就减少了,从而提高了内存访问的性能

另外,由于地址转换所需的信息一般保存在CPU的缓存中,huge page的使用让地址转换信息减少,从而减少了CPU缓存的使用,减轻了CPU缓存的压力,让CPU缓存能更多地用于应用程序的数据缓存,也能够在整体上提升系统的性能

 

在KVM中,也可以将huge page的特性应用到客户机中:

qemu-kvm 就提供了"-mempath FILE"参数选项用于使用huge page

另外,还有一个参数"-mem-prealloc"可以让宿主机在启动客户机时就全部分配好客户机的内存,而不是在客户机实际用到更多内存时才按需分配。

-mem-prealloc 必须在有"-mem-path" 参数时才能使用

提前分配好内存的好处是客户机的内存访问速度更快,缺点是客户机启动时就得到了所有的内存,从而让宿主机的内存很快减少(而不是根据客户机的需求而动态调整内存分配)。

 

通过在宿主机中的如下几个操作让客户机使用huge page

(1)检查宿主机目前状态,检查默认的内存大小和内存使用情况,如下:

getconf  PAGESIZE

cat  /proc/meminfo

 

 

(2)(在宿主机中)挂载hugetlbfs文件系统,命令为:

"mount  -t hugetlbfs  hugetlbfs  /dev/hugepages",

如下:

mount  -t hugetlbfs  hugetlbfs  /dev/hugepages

mount|grep  huge

( 3 )设置(在宿主机中设置允许虚拟机使用的)hugepage的数量,命令为"sysctl vm.nr_hugepages=num", 如下:

 

 

 

( 4 )启动客户机让其使用hugepage的内存,使用"-mem-path" 参数,如下:

qemu-system-x86_64  -m 1024  -smp 2  /opt/cs-01.img  -mem-path /dev/hugepages

( 5 )查看宿主机中huge page的使用情况,可以看到"HugePages_Free"数值减少,因为客户机使用了一定数最的hugepage。

在如下的输出中,"HugePages_Free"数值的减少没有512(512*2MB=1024MB)那么多,这是因为启动客户机时并没有实际分配1024MB内存,qemu-kvm命令行中加上前面提到的"-mem-prealloc"参数就会让meminfo文件中"HugePages_Free"的数量减少和分配给客户机的一致

 

 

至此,如果在客户机中运行的应用程序(典型的应用为oracle数据库)具备使用huge page的能力,那么就可以在客户机中使用huge page带来性能的提升

总的来说,对于内存访问密集型的应用,在KVM客户机中使用huge page是可以较明显地提高客户机性能的,不过,它也有一个缺点,使用huge page的内存不能被换出(swap out),也不能使用ballooning方式自动增长

posted on 2018-09-06 09:54  苦咖啡~~  阅读(22134)  评论(0编辑  收藏  举报