HugePages是通過使用大頁內存來取代傳統的4kb內存頁面,使得管理虛擬地址數變少,加快了從虛擬地址到物理地址的映射以及通過摒棄內存頁面的換入換出以提高內存的整體性能。尤其是對於8GB以上的內存以及較大的Oracle SGA size,建議配值並使用HugePage特性。本文基於x86_64 Linux下來描述如何配值 HugePages。
1、Hugepage的引入
操作系統對於數據的存取直接從物理內存要比從磁盤讀寫數據要快的多,但是物理內存是有限的,這樣就引出了物理內存與虛擬內存的概念。虛擬內存就是為了滿足物理內存的不足而提出的策略,它是利用磁盤空間虛擬出的一塊邏輯內存,這部分磁盤空間Windows下稱之為虛擬內存,Linux下被稱為交換空間(Swap Space)。
對於這個大內存的管理(物理內存+虛擬內存),大多數操作系統采用了分段或分頁的方式進行管理。分段是粗粒度的管理方式,而分頁則是細粒度管理方式,分頁方式可以避免內存空間的浪費。相應地,也就存在內存的物理地址與虛擬地址的概念。通過前面這兩種方式,CPU必須把虛擬地址轉換程物理內存地址才能真正訪問內存。為了提高這個轉換效率,CPU會緩存最近的虛擬內存地址和物理內存地址的映射關系,並保存在一個由CPU維護的映射表中。為了盡量提高內存的訪問速度,需要在映射表中保存盡量多的映射關系。
linux的內存管理采取的是分頁存取機制,為了保證物理內存能得到充分的利用,內核會按照LRU算法在適當的時候將物理內存中不經常使用的內存頁自動交換到虛擬內存中,而將經常使用的信息保留到物理內存。通常情況下,Linux默認情況下每頁是4K,這就意味着如果物理內存很大,則映射表的條目將會非常多,會影響CPU的檢索效率。因為內存大小是固定的,為了減少映射表的條目,可采取的辦法只有增加頁的尺寸。因此Hugepage便因此而來。也就是打破傳統的小頁面的內存管理方式,使用大頁面2m,4m,16m等等。如此一來映射條目則明顯減少。如果系統有大量的物理內存(大於8G),則物理32位的操作系統還是64位的,都應該使用Hugepage。
二、hugepages相關概念
Page Table: page table也就是一種用於內存管理的實現方式,用於物理地址到虛擬之間的映射。因此對於內存的訪問,先是訪問Page Table,然后根據Page Table 中的映射關系,隱式的轉移到物理地址來存取數據。
TLB: Translation Lookaside Buffer (TLB) ,CPU中的一塊固定大小的cache,包含了部分page table的映射關系,用於快速實現虛擬地址到物理地址的轉換。
hugetlb: hugetlb 是TLB中指向HugePage的一個entry(通常大於4k或預定義頁面大小)。 HugePage 通過hugetlb entries來實現,也可以理解為HugePage 是hugetlb page entry的一個句柄。
hugetlbfs: 一個類似於tmpfs的新的in-memory filesystem,在2.6內核被提出。
三、Regular Pages 與 HugePages
a、Regular Pages
在下圖中有兩個不同的進程,兩個進程對於內存的訪問是首先訪問本地的page table,而本地的page table又參照了system-wide table的page(也就是前面描述的TLB),最終system-wide table中的entry指向了實際的物理地址。圖中物理地址page size大小4kb。也可以看到進程1和進程2在system-wide table中都指向了page2,也就是同一個物理地址。Oracle sga中共享內存的使用會出現上述情形。

b、Huge Pages
在下圖中,本地的page table 與system page table中都包含了huge page屬性。因此page table中的任意一個page可能使用了常規的page,
也有可能使用了huge page。同樣進程1和進程2都共享了其中的Hpage2。圖中的物理內存常規的page size是4kb,huge page size 是4mb。

四、 hugepage 優點
對於較大的系統內存以及sga,使用hugepage可以極大程度的提高Oracle數據庫性能。
a、Not swappable
無需交換。也就是不存在頁面由於內存空間不足而存在換入換出的問題
b、Relief of TLB pressure
減輕TLB的壓力,也就是降低了cpu cache可緩存的地址映射壓力。由於使用了huge page,相同的內存大小情況下,管理的虛擬地址數量變少。
TLB entry可以包含更多的地址空間,cpu的尋址能力相應的得到了增強。
c、Decreased page table overhead
降低page table負載,對於普通的page,每個entry需要64bytes進行管理,對於50gb的內存,管理這些entry,需要800mb的大小
(50*1024*1024)kb/4kb*64bytes/1024/1024=800mb。
d、Eliminated page table lookup overhead
消除page table查找負載
e、Faster overall memory performance
提高內存的整體性能
參考 : http://blog.csdn.net/leshami/article/details/8777639
