在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