发布网友 发布时间:2022-04-22 05:25
共2个回答
懂视网 时间:2022-05-05 18:00
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- (AMD, EMT)
x86_
2 MB
2 MB
Linux Itanium (IA)
ia
256 MB
256 MB
IBM Power Based Linux (PPC)
ppc/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),该值小于内存大小,例如你的内存大小是G,有可以设置以下的值
* 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:检查设置是否生效
系统重启后,启动全部的数据库,通过以下命令检查
热心网友 时间:2022-05-05 15:08
[root@localhost ~]# grep Huge /proc/meminfo
AnonHugePages: 2048 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
如果输出包含类似于"AnonHugepages: xxxx kB",并且AnonHugePages > 0kB,则表明内核使用的是Transparent HugePages(透明巨大页面)
它的值我们可以从/proc/meminfo从找到它正在被内核使用的AnonHugePages当前值
# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] never
若显示的不是never则证明Transparent HugePages正在被使用。
下面的操作是如何disable Transparent HugePages操作,
[root@localhost ~]# vim /etc/grub.conf ///在kernel /最后添加transparent_hugepage=never,保存退出
title Oracle Linux Server (2.6.32-300.25.1.el6uek.x86_)
root (hd0,0)
kernel /vmlinuz-2.6.32-300.25.1.el6uek.x86_ ro root=LABEL=/ transparent_hugepage=never
initrd /initramfs-2.6.32-300.25.1.el6uek.x86_.img
重启下,
[root@localhost ~]# grep Huge /proc/meminfo
AnonHugePages: 0 kB
HugePages_Total: 2
HugePages_Free: 2
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]