Ubuntu 使用HugePage 加速应用

来源:互联网 发布:centos7 软件管理器 编辑:程序博客网 时间:2024/05/17 07:56

本文主要讲解的是如何在Ubuntu中配置HugePage 并且使用HugePage来为程序加速。

HugePage概念

Hugepage的概念是相对Linux中的分页机制中的默认页(4KB)大小而言的。在linux系统中除了使用4KB的默认页大小外还支持2M、1G等其他页大小配置,而超过4KB页大小的页称为Hugepage。

通常当进程产生一个Virtual Address进行访存时,系统需要将Virtual Address 转化为实际可以访问物理内存的物理地址。Page table主要在该过程中主要起到了维护VA和PA映射的关系。

![如图 Address translation通过页表完成]

具体操作系统中如何来进行virtual address to physical address
可以去查阅相关的资料,在这里我推荐《深入理解计算机系统 2e》——第十章虚拟存储章节。

而在Page Table中并不是一个虚拟地址就会对应一个物理地址的,这样Page Table会非常的大。所以在系统中,实际虚拟地址空间中一定大小的地址集合会对应物理地址空间相同大小的地址集合,这就是Page(页)。在虚拟地址空间中称为虚页,在物理地址空间中称为物理页。

通过上面的页的概念我们可以知道,当Page的大小越大时,PageTable中的entry数量就会越少,这是必然的结果。

另外系统为了加速访存的速度,为PageTable也设定了一个cache,那就是TLB。由于TLB的稀有性,怎样让TLB能大概率的命中我们的Page地址转换就很是关键了。
下图中(a)是TLB缓存命中后系统直接通过返回的信息访存。(b)是系统中TLB不命中系统处理的流程,需要先去访存对应的页表来获取对应的物理地址信息,然后再去访存该物理地址。

![上图是TLB命中,下图是TLB不命中]

这也就是HugePage的一个最大的功效,能够显著的减少PageTable中entry的数量,并且由于Page的减少TLB可能缓存的对象也就减少了,所以命中率提高,整体效率提升。
比如当前系统需要4G的内存,对于4K的页,需要2^20的页表项,但对对于1G的页而言,只需要4个页表项。TLB是绝对没办法缓存所有的4K页表项的,但是对于4个页表项还是搓搓有余的。

HugeTable的应用

HugeTable 显著减少页表项,提高TLB命中率, 能够对于内存需求很大的程序有一定的加速,尤其是哪些访存没有很好的局部性的程序,比如说数据库底层的B+树索引检索等。

HugeTable 配置

系统使用Ubuntu 16.04

1. 对于kernel启动的命令行进行设置

$ sudo vim /etc/default/grub

对于文件中的GRUB_CMDLINE_LINUX_DEFAULT 字段进行修改,主要是新增配置

#文件内容GRUB_CMDLINE_LINUX_DEFAULT="...略... transparent_hugepage=never default_hugepagesz=1G hugepagesz=1G hugepages=30"

其中default_hugepagesz 是指定系统默认HugePage大小
hugepagesz 为设置每个页的大小,可选的4M,1G等。
hugepages 指定的是系统一共生成多少Hugepages

# 更新系统grub重启$ sudo updata-grub$ reboot

2. 重启后查询状态

$ cat /proc/meminfo | grep HugeHugePages_Total:      30HugePages_Free:       30HugePages_Rsvd:        0HugePages_Surp:        0Hugepagesize:    1048576 kB

详细字段解释参看文献2

3.安装libhugetlbfs

sudo apt-get install libhugetlbfs-dev

建立挂在点

$ mkdir -p /mnt/hugetlbfs$ mount -t hugetlbfs none /mnt/hugetlbfs

在程序中使用

libhugetlbfs 提供了多种使用方法

  • library functions
    libhugetlbfs provides functions that allow an applications to
    explicitly allocate and use hugepages more easily they could by
    directly accessing the hugetblfs filesystem

  • hugepage malloc()
    libhugetlbfs can be used to make an existing application use hugepages
    for all its malloc() calls. This works on an existing (dynamically
    linked) application binary without modification.

  • hugepage text/data/BSS
    libhugetlbfs, in conjunction with included special linker scripts can
    be used to make an application which will store its executable text,
    its initialized data or BSS, or all of the above in hugepages. This
    requires relinking an application, but does not require source-level
    modifications.

我使用的是第二种链接指定程序的malloc为libhugetlbfs中malloc而不是GNU中的libc malloc:

LD_PRELOAD=libhugetlbfs.so HUGETLB_MORECORE=yes <your app command line>

参考文献

https://github.com/libhugetlbfs/libhugetlbfs/blob/master/HOWTO
https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt

原创粉丝点击