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映射的关系。
具体操作系统中如何来进行virtual address to physical address
可以去查阅相关的资料,在这里我推荐《深入理解计算机系统 2e》——第十章虚拟存储章节。
而在Page Table中并不是一个虚拟地址就会对应一个物理地址的,这样Page Table会非常的大。所以在系统中,实际虚拟地址空间中一定大小的地址集合会对应物理地址空间相同大小的地址集合,这就是Page(页)。在虚拟地址空间中称为虚页,在物理地址空间中称为物理页。
通过上面的页的概念我们可以知道,当Page的大小越大时,PageTable中的entry数量就会越少,这是必然的结果。
另外系统为了加速访存的速度,为PageTable也设定了一个cache,那就是TLB。由于TLB的稀有性,怎样让TLB能大概率的命中我们的Page地址转换就很是关键了。
下图中(a)是TLB缓存命中后系统直接通过返回的信息访存。(b)是系统中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 filesystemhugepage 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
- Ubuntu 使用HugePage 加速应用
- HugePage简介和KVM中使用HugePage
- HugePage简介和KVM中使用HugePage
- HugePage简介和KVM中使用HugePage
- hugepage配置使用
- 让instance使用hugepage
- hugepage
- PF_RING Libzero中使用HugePage
- PF_RING Libzero中使用HugePage
- 使用Preload 给Ubuntu 9.04 系统加速
- ubuntu上Caffe使用OpenBLAS多线程加速
- ubuntu上Caffe使用OpenBLAS多线程加速
- ubuntu 加速
- ubuntu加速
- 使用memcached加速web应用实例
- 使用 PHP 7 给 Web 应用加速
- 使用 PHP 7 给 Web 应用加速
- 使用 HTTP/2 加速 Node.js 应用
- IO流的学习—File类
- 发送邮件
- 线性代数 04.01 n维向量
- Ajax-用户名验证简单例子(详解)
- java:23种设计模式详解
- Ubuntu 使用HugePage 加速应用
- Eclipse rcp 开发中常用快捷键和相关功能
- 解决 Android 中 View 的 setPivotX 和 setPivotY 不生效的问题以及设置缩放中心的方法
- 安全(主要XSS与CSRF)
- 数据分析框架
- 解决eclipse中maven项目build的时候,console显示teminated,没有任何打印信息
- clone 克隆
- 数据存储全方案--详解持久化技术
- Maven学习笔记