現在,有許多的處理器架構都支持多種的內存頁大小,其中就包括比一般的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數量有所減少)