Hugepage介绍以及实践
在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