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數量有所減少)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM