Linux
hugepage使用与实现
——lvyilong316
1.1引言
随着计算需求规模的不断增大,应用程序对内存的需求也越来越大。为了实现虚拟内存管理机制,操作系统对内存实行分页管理。自内存“分页机制”提出之始,内存页面的默认大小便被设置为4096字节(4KB),虽然原则上内存页面大小是可配置的,但绝大多数的操作系统实现中仍然采用默认的4KB页面。4KB大小的页面在“分页机制”提出的时候是合理的,因为当时的内存大小不过几十兆字节,然而当物理内存容量增长到几G甚至几十G的时候,操作系统仍然以4KB大小为页面的基本单位,是否依然合理呢?
在Linux操作系统上运行内存需求量较大的应用程序时,由于其采用的默认页面大小为4KB,因而将会产生较多TLB Miss和缺页中断,从而大大影响应用程序的性能。当操作系统以2MB甚至更大作为分页的单位时,将会大大减少TLB
Miss和缺页中断的数量,显著提高应用程序的性能。这也正是Linux内核引入大页面支持的直接原因。好处是很明显的,假设应用程序需要2MB的内存,如果操作系统以4KB作为分页的单位,则需要512个页面,进而在TLB中需要512个表项,同时也需要512个页表项,操作系统需要经历至少512次TLB Miss和512次缺页中断才能将2MB应用程序空间全部映射到物理内存;然而,当操作系统采用2MB作为分页的基本单位时,只需要一次TLB
Miss和一次缺页中断,就可以为2MB的应用程序空间建立虚实映射,并在运行过程中无需再经历TLB Miss和缺页中断(假设未发生TLB项替换和Swap)。
为了能以最小的代价实现大页面支持,Linux操作系统采用了基于hugetlbfs特殊文件系统2M字节大页面支持。这种采用特殊文件系统形式支持大页面的方式,使得应用程序可以根据需要灵活地选择虚存页面大小,而不会被强制使用2MB大页面。本文将针对hugetlb大页面的应用和内核实现两个方面进行简单的介绍,以期起到抛砖引玉的作用。
1.2 Hugetlb FileSystem的应用
本文的例子摘自Linux内核源码中提供的有关说明文档(Documentation/vm/hugetlbpage.txt)。使用hugetlbfs之前,首先需要在编译内核(make menuconfig)时配置CONFIG_HUGETLB_PAGE和CONFIG_HUGETLBFS选项,这两个选项均可在File systems内核配置菜单中找到。
内核编译完成并成功启动内核之后,将hugetlbfs特殊文件系统挂载到根文件系统的某个目录上去,以使得hugetlbfs可以访问。命令如下:
mount none /mnt/huge -t hugetlbfs
此后,只要是在/mnt/huge/目录下创建的文件,将其映射到内存中时都会使用2MB作为分页的基本单位。值得一提的是,hugetlbfs中的文件是不支持读/写系统调用(如read()或write()等)的&#x