x86(包括x86-32和x86-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方式自動增長。