当大量内存用于 Oracle 数据库时,操作系统将消耗大量资源来管理虚拟地址到物理地址转换,其结果往往是一个非常大的页表结构。由于每条页表条目包含进程正在使用的所有内存页面的虚拟地址到物理地址的转换,因此对于非常大的系统全局区 (SGA),每个进程的页表条目都可能很大。例如,使用 8 GB 内存的 Oracle 数据库进程的页表条目将达 8 GB/4 KB(即 2097152 条记录或页面)。如果有 100 个 Oracle 数据库会话/进程,则将页面数乘以 100。您可以看到,要管理的页面数量巨大。

通过在 Linux 中启用 HugePages,可以通过增大页面大小来减少 TLB 条目数。对于 Linux,HugePages 大小为 2 MB。通过为 Oracle 数据库 SGA 选用更大的页面,可大大减少要管理的页面数。

注:启用 HugePages 可显著提升性能。

透明 HugePages 和 Oracle 数据库

最近,RHEL 6、Oracle Linux 6 和 SUSE Linux Enterprise Server 11 中引入了一个新特性 — 透明 HugePages。透明 HugePages 旨在自动、动态地利用 HugePages。遗憾的是,目前透明 HugePages 与传统 HugePages 联用会出现一些问题,导致性能问题和系统重启。在 My Oracle Support 说明 1557478.11557478.1 中,Oracle 建议不要同时使用透明 HugePages 和 Oracle 数据库。
注:在 Oracle Linux 6.5 版中,已删除透明 HugePages。

验证是否已对 Oracle 数据库实例启用大页面

可以通过检查警报日志来验证是否对数据库实例启用了大页面。启动实例时,您应在警报日志中参数列表前面看到如下内容:

Large Pages Information *
Total Shared Global Region in Large Pages = 28 GB (100%)
Large Pages used by this instance: 14497 (28 GB)
Large Pages unused system wide = 1015 (2030 MB) (alloc incr 64 MB)
Large Pages configured system wide = 19680 (38 GB)
Large Page size = 2048 KB
参考http://www.oracle.com/technetwork/cn/articles/servers-storage-dev/hugepages-2099009-zhs.html

Linux设置HugePages操作记录步骤如下:

1、查看当前系统是否配值HugePages

下面的查询中HugePages相关的几个值都为0,表明当前未配值HugePages,其次可以看到Hugepagesize为2MB。

[root@hch_test_pd_121_217 ~]$grep Huge /proc/meminfo
AnonHugePages:   5787648 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

2、修改用户的memlock限制

通过修改/etc/security/limits.conf 配值文件来实现
该参数的值通常配值位略小于当前的已安装系统内存,如当前你的系统内存为64GB,可以做如下设置

  • soft memlock 60397977
  • hard memlock 60397977
    上述的设置单位为kb,不会降低系统性能。至少也要配值为略大于系统上所有SGA的总和。

使用ulimit -l 来校验该设置

3、禁用AMM(oracle 11g)

如果当前的Oracle 版本为10g,可以跳过此步骤。
如果当前的Oracle 版本为11g,由于AMM(Automatic Memory Management)特性与Hugepages不兼容,需要禁用AMM:

    ALTER SYSTEM RESET memory_target SCOPE=SPFILE;
    ALTER SYSTEM RESET memory_max_target SCOPE=SPFILE;
    ALTER SYSTEM SET sga_target=<n>g SCOPE=SPFILE;
    ALTER SYSTEM SET pga_aggregate_target=<n>g SCOPE=SPFILE;
    SHUTDOWN IMMEDIATE; 
    STARTUP;

4、计算vm.nr_hugepages 的值

使用Oracle 提供的脚本hugepages_settings.sh的脚本来计算vm.nr_hugepages的值
在执行脚本之前确保所有的Oracle 实例已启动以及ASM也启动(存在的情形下)
sh hugepages_settings.sh
Recommended setting: vm.nr_hugepages = 14467
手工计算:
nr_hugepages>=SGA_Target/Hugepagesize
=16G*1024M/2M
=4608

vim /etc/sysctl.conf 来设置vm.nr_hugepages参数

vm.nr_hugepages = 1496  
sysctl -p     #执行生效

5、停止所有的Instance并重启server

上述的所有步骤已经实现了动态修改,但对于HugePages的分配需要重新启动server才能生效。

6、验证配值

HugePages相关参数的值会随着当前服务器上的实例的停止与启动而动态发生变化
通常情况下,HugePages_Free的值应当小于HugePages_Total的值,在HugePages被使用时HugePages_Rsvd值应当为非零值。

 [root@c69160 ~]$ grep Huge /proc/meminfo
  HugePages_Total:   131
  HugePages_Free:     20
  HugePages_Rsvd:     20
  Hugepagesize:     2048 kB 
 如下面的情形,当服务器上仅有的一个实例被关闭后,HugePages_Rsvd的值为零。且HugePages_Free等于HugePages_Total
  $ grep Huge /proc/meminfo
  HugePages_Total:   131
  HugePages_Free:    131
  HugePages_Rsvd:      0
  Hugepagesize:     2048 kB   

#### 下面的三种情形应当重新配置HugePages
    1、物理内存的增减或减少
    2、在当前服务器上新增或移出Instance
    3、Instance的SGA大小增加或减少   
#### 如果未能调整HugePages,可能会引发下面的问题
    1、数据库性能地下
    2、出现内存不足或者过度使用交换空间
    3、数据库实例不能被启动
带符号 * 的表示必填项