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

一、数据内存耗尽场景

问题现象:

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,出现内存资源浪费,高并发、香港云服务器高负载等场景下可能会导致内存资源耗尽。

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

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)

应用开发
上一篇:电脑深度待机唤醒教程(实现高效省电的电脑待机状态)
下一篇:电脑手绘装修柜子教程(学习如何使用电脑手绘技巧来装修你的柜子,让家居更加个性化)