HugePages on Linux
【Huge pages】
在 Linux 中大页分为两种:Huge pages ( 标准大页 ) 和 Transparent Huge pages( 透明大页 ) 。
内存是以块即页的方式进行管理的,当前大部分系统默认的页大小为 4096 bytes 即 4K 。1MB 内存等于 256 页;1GB 内存等于 256000 页。
系统进程是通过虚拟地址访问内存,但是CPU必须把它转换程物理内存地址才能真正访问内存。
为了提高这个转换效率,CPU会缓存最近的虚拟内存地址和物理内存地址的映射关系,并保存在一个由CPU维护的映射表中。
为了尽量提高内存的访问速度,需要在映射表中保存尽量多的映射关系。
而在Linux中,内存都是以页的形式划分的,默认情况下每页是4K,这就意味着如果物理内存很大,则映射表的条目将会非常多,会影响CPU的检索效率。
因为内存大小是固定的,为了减少映射表的条目,可采取的办法只有增加页的尺寸。
Huge pages 是从 Linux Kernel 2.6 后被引入的,目的是通过使用大页内存来取代传统的 4kb 内存页面, 以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能。
Huge pages 有两种格式大小:2MB 和 1GB , 2MB 页块大小适合用于 GB 大小的内存, 1GB 页块大小适合用于 TB 级别的内存;2MB 是默认的页大小。
【Transparent Huge Pages】
Transparent Huge Pages 缩写 THP ,这个是 RHEL 6 开始引入的一个功能,在 Linux6 上透明大页是默认启用的。
由于 Huge pages 很难手动管理,而且通常需要对代码进行重大的更改才能有效的使用,因此 RHEL 6 开始引入了 Transparent Huge Pages ( THP ), THP 是一个抽象层,能够自动创建、管理和使用传统大页。
THP 为系统管理员和开发人员减少了很多使用传统大页的复杂性 , 因为 THP 的目标是改进性能 , 因此其它开发人员 ( 来自社区和红帽 ) 已在各种系统、配置、应用程序和负载中对 THP 进行了测试和优化。这样可让 THP 的默认设置改进大多数系统配置性能。但是 , 不建议对数据库工作负载使用 THP 。
这两者最大的区别在于 : 标准大页管理是预分配的方式,而透明大页管理则是动态分配的方式。
注:THP 目前只能映射异步内存区域,比如堆和栈空间
【使用Huge pages的优缺点】
Oracle 官方是推荐我们使用 Huge pages 的,它拥有以下的好处:
- Larger Page Size and Less # ofPages: Default page size is 4K whereas the HugeTLB size is 2048K. That meansthe system would need to handle 512 times less pages.
- Reduced Page Table Walking:Since a HugePage covers greater contiguous virtual address range than a regularsized page, a probability of getting a TLB hit per TLB entry with HugePages arehigher than with regular pages. This reduces the number of times page tablesare walked to obtain physical address from a virtual address.
- Less Overhead for MemoryOperations: On virtual memory systems (any modern OS) each memory operation isactually two abstract memory operations. With HugePages, since there are lessnumber of pages to work on, the possible bottleneck on page table access isclearly avoided.
- Less Memory Usage: From theOracle Database perspective, with HugePages, the Linux kernel will use lessmemory to create pagetables to maintain virtual to physical mappings for SGAaddress range, in comparison to regular size pages. This makes more memory tobe available for process-private computations or PGA usage.
- No Swapping: We must avoidswapping to happen on Linux OS at all Document 1295478.1. HugePages are notswappable (whereas regular pages are). Therefore there is no page replacementmechanism overhead. HugePages are universally regarded as pinned.
- No 'kswapd' Operations: kswapdwill get very busy if there is a very large area to be paged (i.e. 13 millionpage table entries for 50GB memory) and will use an incredible amount of CPUresource. When HugePages are used, kswapd is not involved in managing them. Seealso Document 361670.1
当然使用 Huge pages 也会存在某些缺点:
1、首先开启该功能需要进行额外设置。
2、Huge pages 和 Oracle 11g新 特性 AMM ( Automatic Memory Management )是相互冲突的,但是 ASMM ( Automatic Shared Memory Management )仍然可以继续使用。
Oracle 官方虽然推荐我们使用 Huge pages ,但是却建议我们关闭 Transparent Huge pages ,因为透明大页存在一些问题:
1)在 RAC 环境下 透明大页( TransparentHugePages )会导致异常节点重启,和性能问题;
2)在单机环境中,透明大页( TransparentHugePages ) 也会导致一些异常的性能问题;
注:Transparent Huge Pages在32位的RHEL 6中是不支持的。
【配置HugePages】
1、配置须知
1)Hugepages是在分配后就会预留出来的,其大小一定要比服务器上所有实例的SGA总和要大,差一点都不行。
比如说Hugepages设置为8G,oracle SGA为9G,那么oracle在启动的时候就不会使用到这8G的Hugepages。这8G就浪费了。所以在设置Hugepages时要计算SGA的大小,后面会给出一个脚本来计算。
2)其他进程无法使用Hugepages的内存,所以不要设置太大,稍稍比SGA大一点保证SGA可以使用到hugepages就好了。
3)在meminfo中和Hugepage相关的有四项:
grep HugePages /proc/meminfo
HugePages_Total: 4611
HugePages_Free: 474
HugePages_Rsvd: 467
Hugepagesize: 2048 kB
HugePages_Total为所分配的页面数目,和Hugepagesize相乘后得到所分配的内存大小。4611*2/1024大约为9GB
HugePages_Free为从来没有被使用过的Hugepages数目。即使oracle sga已经分配了这部分内存,但是如果没有实际写入,那么看到的还是Free的。这是很容易误解的地方。
HugePages_Rsvd为已经被分配预留但是还没有使用的page数目。在Oracle刚刚启动时,大部分内存应该都是Reserved并且Free的,随着oracle SGA的使用,Reserved和Free都会不断的降低。
HugePages_Free-HugePages_Rsvd 这部分是没有被使用到的内存,如果没有其他的oracle instance,这部分内存也许永远都不会被使用到,也就是被浪费了。
4)HugePages和oracle AMM(自动内存管理)是互斥的,所以使用HugePages必须设置内存参数MEMORY_TARGET / MEMORY_MAX_TARGET 为0。
2、数据库检查数据库的SGA参数配置
1)sga_max_size 设置为 (物理内存的1/2 - 1G )
2)检查sga_target 和 memory_max_target 参数都为0 (关闭动态内存分配功能)
3)重新启动数据库 再检查1、2设置是否正确
2、系统设置
1)修改内核参数memlock,单位是KB, 物理内存的一半。
/etc/security/limits.conf (一般使用是这个文件,修改这个文件前 先备份这个文件)
oracle soft memlock 物理内存的一半(单位是KB)
oracle hard memlock 物理内存的一半(单位是KB)
这个过程中使用memlock标记,用于设置每个用户允许的最大内存使用情况。
2)使用Oracle帐号验证大小
[oracle@dtydb5 ~]$ ulimit -a|grep lock
max locked memory (kbytes, -l) (是否是物理内存的一半)
3)计算需要使用的hugepage页面的大小。
hugepage目前只能用于共享内存段等少量内存类型,例如oracle SGA。 PGA则不适用。
4)检查目前hugepagesize的大小
[root@dtydb5 ~]# grep Hugepagesize /proc/meminfo
Hugepagesize: 2048 kB
(大页的页面大小是2M)
hugepage设置为物理内存的一半:这个值就是 (物理内存的1/2 (单位M)) /2M
5)修改vm.nr_hugepages参数,值为上步计算的数值
vi /etc/sysctl.conf (修改前备份文件)
vm.nr_hugepages = 上述的计算值
sysctl -p 命令使配置生效。
6)关闭数据库,重启主机和数据库
验证是否设置正确:
grep HugePages /proc/meminfo
HugePages_Free小于HugePages_Total的值则表示设置成功。如果HugePages_Rsvd应该保持少量保留内存。
注意:HugePages如果配置不恰当会引起系统性能下降等风险,需要慎重
【参考官方文档】
HugePages on Linux: What It Is... and What It Is Not... (Doc ID 361323.1)
HugePages on Oracle Linux 64-bit (Doc ID 361468.1)
HugePages and Oracle Database 11g Automatic Memory Management (AMM) on Linux (Doc ID 749851.1)
Linux IA64 example of allocating 48GB SGA using hugepages (Doc ID 397568.1)
Shell Script to Calculate Values Recommended Linux HugePages / HugeTLB Configuration (Doc ID 401749.1)
USE_LARGE_PAGES To Enable HugePages In 11.2 (Doc ID 1392497.1)