Oracle数据库内存耗尽,大页惹的祸?
一、数据内存耗尽场景
问题现象:
Oracle数据库服务器内存资源耗尽,库内数据库无响应。存耗
问题原因:
原linux环境没有启用HugePages,页惹启用HugePages后,数据内存使用率直线上涨,库内最终内存资源耗尽。存耗

启用HugePages明明是页惹提高性能,为什么会导致内存资源耗尽呢?数据这和HugePages内存分配机制有关:
例如当前配置信息如下:
数据库服务器总内存128GB,SGA分配75GB,库内PGA分配30GB,存耗SGA+PGA占总内存82%。页惹
通常启用HugePages大页时,数据会将HugePages设置为偏大于SGA值,库内例如76G。存耗
但如果设置HugePages比SGA值小,会出现什么情况?
例如:将HugePages设置为70GB。
此时服务器内存最大会分出70GB给HugePages使用,但是由于HugePages<SGA,导致Oracle数据库不会完全使用HugePages中的内存来分配给SGA,出现内存资源浪费,高并发、服务器租用高负载等场景下可能会导致内存资源耗尽。
在官方文档有这么一段描述:
Ensure that HugePages is configured properly as the system may run out of memory if excess HugePages is not used by the application.
确保HugePages配置正确,因为如果应用程序未使用过多的HugePage,系统可能会耗尽内存。
问题重现:
环境说明:
复制OS:Red Hat Enterprise Linux Server release 7.5 (Maipo) DB:Oracle 11.2.0.4.0 内存:3692MB1.2.3.参数:
复制sga_max_size=sga_target=1970MB pga_aggregate_target=980MB use_large_pages=TRUE1.2.3.AMM内存管理和HugePages不兼容,如果内存启用了AMM(Automatic Memory managed),需要先切换为ASMM(Automatic Shared Memory Managed)。
先备份参数文件:
复制SQL> show parameter spfile SQL> ho cp /oracle/app/oracle/product/11.2/db/dbs/spfilecjc.ora /home/oracle/spfilecjc.ora.bak1.2.将AMM转换为ASMM:
复制alter system reset memory_target scope=spfile; ---alter system reset memory_max_target scope=spfile; alter system set sga_max_size=1970M scope=spfile; alter system set sga_target=1970M scope=spfile; alter system set pga_aggregate_target=980M scope=spfile;1.2.3.4.5.重启数据库:
复制SQL> shutdown immediate SQL> startup1.2.1.1 正确启用HugePages方法:
启动前,检查基本信息 复制[root@cjc-db-01 ~]# grep Huge /proc/meminfo AnonHugePages: 100352 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB1.2.3.4.5.6.7. 复制[root@cjc-db-01 ~]# uname -sr Linux 4.1.12-112.16.4.el7uek.x86_641.2. 复制[root@cjc-db-01 ~]# cat /proc/meminfo|grep PageTables PageTables: 38084 kB1.2.3.4. 复制[root@cjc-db-01 ~]# free -h total used free shared buff/cache available Mem: 3.6G 490M 2.2G 289M 918M 1.9G Swap: 2.0G 0B 2.0G1.2.3.4. 配置memlock在/etc/security/limits.conf文件中设置memlock值,memlock设置以KB为单位。
当启用HugePages内存时,最大锁定内存限制应至少设置为当前服务器内存的90%。
禁用HugePages内存时,最大锁定内存限制应设置为至少3145728 KB(3 GB)。
例如,如果安装了64 GB RAM,则添加以下条目以增加最大锁定内存地址空间:
复制* soft memlock 60397977 * hard memlock 603979771.2.也可以将memlock值设置为高于SGA要求的值,或者设置为unlimited
复制oracle soft memlock unlimited oracle hard memlock unlimited1.2.再次以oracle用户身份登录并运行ulimit-l命令以验证新的memlock设置
复制[oracle@cjc-db-01 ~]$ ulimit -l Unlimited1.2. 检查并启动实例RAC:
检查实例是启动状态
复制srvctl status instance -d dbname1.如果没启动,手动启动实例
复制srvctl start instance -d dbname -i instance_name -o open1.单机:
复制SQL> select status from v$instance;1. 使用脚本为当前共享内存段计算hugepages配置的建议值:root用户下执行:
复制chmod +x hugepages_settings.sh ./hugepages_settings.sh1.2.备注:脚本内容见末尾。香港云服务器
脚本来自My Oracle Support note 401749.1 。
例如:
复制[root@cjc-db-01 oracle]# ./hugepages_settings.sh1. 复制This script is provided by Doc ID 401749.1 from My Oracle Support (http://support.oracle.com) where it is intended to compute values for the recommended HugePages/HugeTLB configuration for the current shared memory segments on Oracle Linux. Before proceeding with the execution please note following: * For ASM instance, it needs to configure ASMM instead of AMM. * The pga_aggregate_target is outside the SGA and you should accommodate this while calculating the overall size. * In case you changes the DB SGA size, as the new SGA will not fit in the previous HugePages configuration, it had better disable the whole HugePages, start the DB with new SGA size and run the script again. And make sure that: * Oracle Database instance(s) are up and running * Oracle Database 11g Automatic Memory Management (AMM) is not setup (See Doc ID 749851.1) * The shared memory segments can be listed by command: # ipcs -m Press Enter to proceed... Recommended setting: vm.nr_hugepages = 9961.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.最终计算出的vm.nr_hugepages建议值为996,tmd数字不吉利。
其中996乘以2MB=1992MB > sga_target(1970MB)
执行脚本除了看vm.nr_hugepages,也要关注下其他内容:
在执行之前,请注意以下事项:
复制(1)对于ASM实例,需要配置ASMM而不是AMM。 (2)“pga_gaggregate_target”位于SGA之外,在计算总体大小时应考虑到这一点。 (3)如果更改了DB SGA的大小,因为新的SGA将不适合以前的HugePage配置,因此最好禁用整个HugePage,用新SGA大小启动DB,然后再次运行脚本。 并确保: (1)数据库实例是启动运行的; (2)HugePages and Oracle Database Automatic Memory Management (AMM) on Linux (Doc ID 749851.1) (3)共享内存段可以通过以下命令列出: # ipcs -m1.2.3.4.5.6.7.8. 停止数据库实例 复制RAC: srvctl stop instance -d dbname -i instance_name -o immediate 单机: SQL> shutdown immediate1.2.3.4. 设置vm.nr_hugepages内核参数写入配置文件,永久生效
复制vi /etc/sysctl.conf vm.nr_hugepages=996 wq1.2.3.# sysctl -w vm.nr_hugepages=<value from above> 临时改变,重启失效。亿华云
本次示例:996
复制sysctl -p1.查询:
复制[root@cjc-db-01 ~]# grep Huge /proc/meminfo AnonHugePages: 98304 kB HugePages_Total: 996 HugePages_Free: 996 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB1.2.3.4.5.6.7. 启动实例 复制RAC: srvctl start instance -d dbname -i instance_name -o open 单机: SQL> startup1.2.3.4.查看alert_cjc.log日志信息:
复制Starting ORACLE instance (normal)相关文章
电脑主机配置和安装教程(从零开始学习电脑主机配置和安装,让你的电脑运行更流畅)
摘要:在当今科技快速发展的时代,电脑已成为我们生活中不可或缺的工具。想要让电脑运行更流畅,配置和安装主机是至关重要的环节。本文将为大家详细介绍电脑主机的配置和安装教程,让你轻松打造一个高...2025-11-04以朵唯手机L9如何满足用户需求(优秀性能和出色拍照能力的朵唯L9手机)
摘要:随着科技的不断进步,手机已经成为我们生活中不可或缺的一部分。选择一款性能出众、功能丰富的手机已经成为消费者的共同需求。朵唯手机L9凭借其卓越的性能和出色的拍照能力,在市场上引起了广...2025-11-04联想电脑安装64位系统的完整教程(以联想安装64位系统为例,详解安装步骤和注意事项)
摘要:在计算机的日常使用中,系统起着至关重要的作用,而64位系统相较于32位系统拥有更大的寻址空间和更高的运行效率。本文将以联想电脑为例,为大家详细介绍如何安装64位系统,帮助读者顺利完...2025-11-04- 摘要:在信息爆炸的时代,高效率和良好用户体验是企业取得竞争优势的重要因素。而深度完美系统作为一种终极工具,以其卓越的功能和灵活性,逐渐成为众多企业和个人首选。本文将深入探讨深度完美系统的...2025-11-04
 - 摘要:在当今高科技时代,液晶显示技术已经成为人们日常生活中不可或缺的一部分。其中,LCD70TX85A作为最新一代的顶级液晶显示器,以其卓越的技术和令人叹为观止的视觉效果,引领了液晶显示...2025-11-04
 三星台式电脑开机教程(轻松学会三星台式电脑开机的步骤和技巧)
摘要:作为一款备受欢迎的电脑品牌,三星台式电脑拥有出色的性能和稳定的系统。然而,对于一些新手用户来说,可能不太清楚如何正确地开机。本文将详细介绍三星台式电脑的开机步骤和技巧,帮助读者轻松...2025-11-04

最新评论