Oracle 11.2.0.3.0作为常用的企业级数据库版本,在处理大内存场景时,开启大页(hugepages)能够减少内存页表查询的开销,降低TLB(转译后备缓冲器)缺失概率,显著提升数据库运行效率,尤其适合内存超过8G且SGA较大的部署环境。

开启大页前的环境检查
首先需要确认当前系统是否支持大页,以及当前大页的默认配置情况。可以执行以下命令查看系统大页相关信息:
# 查看系统支持的大页大小 cat /proc/meminfo | grep Huge # 查看当前大页数量 cat /proc/sys/vm/nr_hugepages # 查看是否开启透明大页(需要关闭) cat /sys/kernel/mm/transparent_hugepage/enabled
如果透明大页处于开启状态,需要先将其关闭,避免和手动配置的大页产生冲突。执行以下命令临时关闭透明大页:
echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag
若需要永久关闭,需要修改grub配置文件,在对应内核启动参数后添加transparent_hugepage=never,然后重启系统生效。
计算所需大页数量
大页数量需要根据Oracle的SGA大小来计算,默认大页大小为2M(不同架构可能不同,可通过上面的Hugepagesize字段确认)。计算公式如下:
所需大页数量 = (SGA_MAX_SIZE + 冗余空间) / 单个大页大小
冗余空间一般建议设置为SGA大小的10%左右,避免大页不足。SGA大小可以通过登录Oracle数据库查询:
sqlplus / as sysdba SQL> show parameter sga_max_size;
假设查询到的sga_max_size为16G,单个大页大小为2M,那么所需大页数量为:(16*1024 + 16*1024*0.1)/2 = 8448个。
配置系统大页参数
修改系统的大页数量配置文件,不同Linux发行版的配置文件路径略有差异:
- RedHat、CentOS等系统:修改
/etc/sysctl.conf文件 - SUSE系统:修改
/etc/sysctl.d/下的自定义配置文件
在配置文件中添加或修改以下参数:
vm.nr_hugepages = 8448 # 设置大页内存的使用限制,建议设置为大页总大小的90%以上 vm.hugetlb_shm_group = 54321 # 这里填写Oracle用户的组ID,可通过id oracle命令查询
执行sysctl -p命令让配置生效,然后再次查看/proc/meminfo中的HugePages_Free字段,确认大页已经分配成功。如果Free数量等于nr_hugepages,说明分配完成;如果不足,可能是系统内存不足,需要释放部分内存后重新生效。
调整Oracle数据库参数
登录Oracle数据库,修改以下参数让SGA使用大页内存:
sqlplus / as sysdba SQL> alter system set sga_max_size=16G scope=spfile; SQL> alter system set sga_target=16G scope=spfile; # 设置内存使用大页,11g版本参数名为use_large_pages SQL> alter system set use_large_pages=true scope=spfile;
修改完成后重启Oracle数据库实例,使参数生效。
验证大页是否生效
数据库重启后,可以通过以下两种方式验证大页是否成功被使用:
第一种方式查看系统大页使用情况,执行:
cat /proc/meminfo | grep Huge
如果HugePages_Free的数量明显小于HugePages_Total,说明大页已经被占用。
第二种方式查看Oracle数据库的告警日志,路径一般在$ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace/alert_$ORACLE_SID.log,搜索关键词hugepages,如果看到类似Large pages enabled的日志,说明大页已经成功生效。
常见问题说明
如果配置完成后大页没有生效,可以从以下几个方面排查:
- 确认透明大页是否已经完全关闭,重启后需要再次检查
- 确认大页数量是否足够,SGA大小不能超过大页总容量的90%
- 确认Oracle用户的组ID是否和
vm.hugetlb_shm_group配置的一致 - 确认系统内存是否充足,大页需要连续的内存空间,内存碎片化严重可能导致分配失败
另外需要注意,修改大页配置前建议备份原有的系统参数和数据库参数,避免配置错误导致数据库无法启动。