Oracle数据库内存耗尽,大页惹的祸?

系统运维2025-11-05 06:22:3068356

一、数据内存耗尽场景

问题现象:

Oracle数据库服务器内存资源耗尽,库内数据库无响应。存耗

问题原因:

原linux环境没有启用HugePages,页惹启用HugePages后,数据内存使用率直线上涨,库内最终内存资源耗尽。存耗

Oracle数据库内存耗尽,大页惹的祸?

启用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,出现内存资源浪费,高并发、IT技术网高负载等场景下可能会导致内存资源耗尽。

在官方文档有这么一段描述:

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)

本文地址:http://www.bzuk.cn/html/209d9499696.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

全站热门

LCD70TX85A(探索全新世界的尖端视觉科技)

绝尘侠主机(颠覆传统,重塑游戏世界)

如何选择适合的U盘容量进行电脑系统重装?(重装教程中,选择合适的U盘容量至关重要)

BCM4323无线芯片的性能与应用分析(探索BCM4323无线芯片的关键特性和市场前景)

保护电脑文件安全(以电脑文件加密码错误为中心的保护策略探讨)

飞利浦剃须刀190的使用体验(功能全面,舒适便捷,值得拥有)

1080PVR体验,带你进入逼真的虚拟世界(以1080P分辨率观看VR,还原身临其境的感受)

荣耀V8EMUI5(深度探索荣耀V8EMUI5的众多功能和用户体验优势)

友情链接

滇ICP备2023006006号-33