在Linux 64位系統裡面,預設記憶體是以4K的頁面(Page)來管理的,當系統有非常多的記憶體的時候,管理這些記憶體的消耗就比較大;而HugePage使用2M大小的頁面來減小管理開銷。
Hugepage的背景
作業系統對于資料的存取直接從記憶體要比從硬碟讀寫資料要快的多,但是記憶體是有限的,這樣就引出了實體記憶體與虛拟記憶體的概念。虛拟記憶體是利用硬碟空間虛拟出的一塊邏輯記憶體,這部分磁盤空間Windows下稱之為虛拟記憶體,Linux下被稱為交換空間(Swap Space)。
對于這個大記憶體的管理(實體記憶體+虛拟記憶體),大多數作業系統采用了分頁的方式進行管理。分頁方式可以避免記憶體空間的浪費。相應地,也就存在記憶體的實體位址與虛拟位址的概念,CPU必須把虛拟位址轉換程實體記憶體位址才能真正通路記憶體。為了提高這個轉換效率,CPU會緩存最近的虛拟記憶體位址和實體記憶體位址的映射關系,并儲存在一個由CPU維護的映射表中(快表)。為了盡量提高記憶體的通路速度,需要在映射表中儲存盡量多的映射關系。
linux的記憶體管理采取的是分頁存取機制,為了保證實體記憶體能得到充分的利用,核心會按照LRU算法在适當的時候将記憶體中不經常使用的記憶體頁自動交換到虛拟記憶體中,而将經常使用的資訊保留到記憶體。通常情況下,Linux預設情況下每頁是4K,這就意味着如果實體記憶體很大,則映射表的條目将會非常多,會影響CPU的檢索效率。因為記憶體大小是固定的,為了減少映射表的條目,可采取的辦法隻有增加頁的尺寸。是以Hugepage便是以而來。
Hugepages相關概念
- Page Table:頁表,也就是一種用于記憶體管理的實作方式,用于實體位址到邏輯位址之間的映射。是以對于記憶體的通路,先是通路Page Table,然後根據Page Table中的映射關系,隐式的轉移到實體位址來存取資料。
- TLB: Translation Lookaside Buffer (TLB) ,CPU中的一塊固定大小的cache,包含了部分page table的映射關系,用于快速實作虛拟位址到實體位址的轉換。
- hugetlb: hugetlb 是TLB中指向HugePage的一個入口。
Regular Pages 與 HugePages
- Regular Pages:在下圖中有兩個不同的程序,兩個程序對于記憶體的通路是首先通路本地的page table,而本地的page table又參照了TLB,指向了實際的實體位址。圖中實體位址page size大小4kb。

- HugePages:在下圖中,本地的page table 與TLB中都包含了huge page屬性。是以page table中的任意一個page可能使用了正常的page,也有可能使用了huge page。
Hugepage 優點
- 減少了TLB的工作量,由于使用了huge page,相同的記憶體大小情況下,管理的虛拟位址數量變少。
- 增大TLB的覆寫範圍,可以包含更多的位址空間,cpu的尋址能力相應的得到了增強。
- 降低page table負載,消除page table查找負載,提高記憶體的整體性能。
使用Hugepage
在NUMA機器上,應該在單獨的節點上明确配置設定頁面(假定需要1024頁):
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
檢視Hugepage使用情況:
cat /proc/meminfo|grep Huge
如果已經配置好了大記憶體頁機制,就可以讓DPDK利用大記憶體頁的機制了。
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge