hugepages你用了吗?----原理概念篇hugepages你用了吗?----测试案例篇引子系统进程是通过虚拟地址访问内存,但是cpu必须把它转换程物理内存地址才能真正访问内
hugepages你用了吗?----原理概念篇
引子
系统进程是通过虚拟地址访问内存,但是cpu必须把它转换程物理内存地址才能真正访问内存。为了提高这个转换效率,cpu会缓存最近的虚拟内存地址和物理内存地址的映射关系,并保存在一个由cpu维护的映射表中。为了尽量提高内存的访问速度,需要在映射表中保存尽量多的映射关系。
而在linux中,内存都是以页的形式划分的,默认情况下每页是4k,这就意味着如果物理内存很大,则映射表的条目将会非常多,会影响cpu的检索效率。因为内存大小是固定的,为了减少映射表的条目,可采取的办法只有增加页的尺寸。
一、hugepages及相关概念
hugepage是在linux2.6内核被引入的,主要提供4k的page和比较大的page的选择。
有一些显示的概念需要澄清,香港虚拟主机,在我们继续讨论hugepages之前, 如hugetlb, hugetlbfs
page table(页表)是操作系统上的虚拟内存系统的数据结构模型,用于存储虚拟地址与物理地址的对应关系。
当我们访问内存时,首先访问”page table“,然后linux在通过“page table”的mapping来访问真实物理内存(ram+swap)
tlb: a translation lookaside buffer (tlb)
tlb是在cpu中分配的一个固定大小的buffer(or cache),用于保存“page table”的部分内容,使cpu更快的访问并进行地址转换。
hugetlb: hugetlb 是记录在tlb 中条目并指向到hugepage。所以hugepages 通过 hugetlb entries来调用的。
hugetlbfs: 这是一个新的基于2.6 kernel之上的内存文件系统,如同tmpfs。
在tlb中通过hugetlb来指向hugepage。这些被分配的hugepage作为内存文件系统hugetlbfs(类似tmpfs)提供给进程使用。
二、“regular page”和“huge page“的请求过程
当一个进程请求内存时,它需要访问文件系统的“页表”(pagetable)去调用一个实际的物理内存地址
当hugepage部署后,依然是调用普通的页表。 最大的不同是process pagetable和system pagetable增加了hugepage属性。所以任何页表中的page条目可以是“regular page” 或者是“huge page”
hugepage 的尺寸根据内核版本和硬件架构从 2mb 到 256mb , 如下表
hw platform
source code tree
kernel 2.4
kernel 2.6
linux x86 (ia32)
i386
4 mb
4 mb *
linux x86-64 (amd64, em64t)
x86_64
2 mb
2 mb
linux itanium (ia64)
ia64
256 mb
256 mb
ibm power based linux (ppc64)
ppc64/powerpc
n/a **
16 mb
ibm zseries based linux
s390
n/a
n/a
ibm s/390 based linux
s390
n/a
n/a
三、 hugepage 优点
1. hugepages 会在系统启动时,直接分配并保留对应大小的内存区域
2. hugepages 在开机之后,如果没有管理员的介入,是不会释放和改变的。
3. not swappable: hugepages 是不会swap.也就是没有page-in/page-out。hugepages一直被pin在内存中
4. relief of tlb pressure:
在purge tlb的时候,减少了事物条目的加载,提高了性能。
使用hugepages后tlb能覆盖更大的内存地址空间,加快地址转换的时间
更少的tlb条目,意味着有更大空间用来记录其他的地址空间
四. 如何配置hugepages
根据下面的步骤来配置hugepages,修改hugepages需要重启机器,使用请计划停机时间。
step 1: 需要在/etc/security/limits.conf 中设置memlock值(单位kb),该值小于内存大小,例如你的内存大小是64g,有可以设置以下的值
* soft memlock 60397977
* hard memlock 60397977
这个值大于sga需求并没有什么害处。
如果是exadata机器,参数要求请参考文档1284261.1
step 2: 重新登录root和oracle用户,检查memlock limit
$ ulimit -l
60397977
step 3: 如果你使用11g及以后的版本,amm已经默认开启,但是amm与hugepages是不兼容的,必须先disable amm。
-----------------------------------------------------------------
禁用memory_max_target和memory_target参数方法
这里注意,官方文档说的是“unset” ,直接alter system set memory_target=0 scope=spfile;是更改不成功的。直接设置为‘0’,就抱如下的错误
ora-00843: parameter not taking memory_max_target into account
ora-00849: sga_target 35433480192 cannot be set to more than memory_max_target 0.
ora-01078: failure in processing system parameters
通过创建pfile.ora文件,然后在文件里删除两个参数memory_target/memory_max_target。然后再创建spfile就可以了。
-----------------------------------------------------------------
step 4:
确保你的全部实例都已经启动(包括asm) ,然后根据document 401749.1 的hugepages_settings.sh去评估需要设置的hugepages的大小。
$ ./hugepages_settings.sh
...
recommended setting: vm.nr_hugepages = 1496
注:也可以自己计算需要的hugepages大小,其实就是hugepages size> all of the sga size
step 5: 编辑/etc/sysctl.conf 设置 vm.nr_hugepages参数:
...
vm.nr_hugepages = 1496
...
step 6: 停止实例并重启os系统
step 7:检查设置是否生效
系统重启后,启动全部的数据库,通过以下命令检查