ORACLE DB实例因内存耗尽而DOWN
(2017-11-09 14:38:52)分类: ORACLE |
db 进程退出
ORACLE11G 退出.日志报
PMON (ospid: 7028): terminating the instance due to error 471
[Process 0x0x15a7c5008 appears to be hung while dumping
Current time = 439317916, process death time = 439257905 interval =
60000
Attempting to kill process 0x0x15a7c5008 with OS pid = 7067
OSD kill succeeded for process 0x15a7c5008
PMON (ospid: 7028): terminating the instance due to error 471
Instance terminated by PMON, pid = 7028
Thu Nov 09 13:23:03 2017
Starting ORACLE instance (normal)
查BAIDU 说是内存用尽所致
oracle@NY-DB2 trace]$ free -m
Mem:
-/+
buffers/cache:
Swap:
/var/log/message 日志
Nov
Nov
Nov
Nov
Nov
Nov
调整前先查检一下当前大小
$sqlplus sys/oracle@orcl as sysdba
SQL> show parameter memory;
SQL> show parameter SGA;
调整(比原来调小些):
SQL> alter system set sga_max_size=3G scope=spfile;
System altered.
SQL> alter system set memory_max_target=4G scope=spfile;
System altered.
SQL> alter system set memory_target=4G scope=spfile;
System altered.
注意,实际只要调整MEMORY就可以SGA可不用调,如
SQL>alter system set memory_max_target=4G scope=spfile;
System altered.
SQL> alter system set memory_target=4G scope=spfile;
System altered.
总结如下,以后调整sga的顺序是,
调整后正常
SQL> ! free
Mem:
-/+
buffers/cache:
Swap:
一.HugePages 介绍
二. 配置HugePages
关键:
初始化参数MEMORY_TARGET 和MEMORY_MAX_TARGET 为0
配置的/etc/security/limits.conf
用配置/etc/sysctl.conf
2.1 第一步: 设置memlock
在/etc/security/limits.conf文件中添加memlock的限制,注意该值略微小于实际物理内存的大小。 比如物理内存是64GB,可以设置为如下:
*
*
如果这里的值超过了SGA的需求,也没有不利的影响。
如果使用了Oracle Linux的oracle-validated包,或者Exadata DB compute会自动配置这个参数。
2.2 第二步: 验证memlock
使用如下命令查看参数值:
$ ulimit -l
60397977
2.3 第三步:11g中禁用AMM
如果Oracle 是11g以后的版本,那么默认创建的实例会使用Automatic Memory Management (AMM)的特性,该特性与HugePage不兼容。
在设置HugePage之前需要先禁用AMM。设置初始化参数MEMORY_TARGET 和MEMORY_MAX_TARGET 为0即可。
使用AMM的情况下,所有的SGA 内存都是在/dev/shm 下分配的,因此在分配SGA时不会使用HugePage。这也是AMM 与HugePage不兼容的原因。
另外:默认情况下ASM instance 也是使用AMM的,但因为ASM 实例不需要大SGA,所以对ASM 实例使用HugePages意义不大。
如果我们要使用HugePage,那么就必须先确保没有设置MEMORY_TARGET/ MEMORY_MAX_TARGET参数。
2.4 第四步:计算vm.nr_hugepages的建议值
确保所有的数据库实例都已经启动,包括ASM 实例。使用hugepages_settings.sh
脚本获取thevm.nr_hugepages
$ ./hugepages_settings.sh
...
Recommended setting: vm.nr_hugepages = 1496
$
也可以根据自己的经验来计算该值。
脚本如下:
#!/bin/bash
#
#hugepages_settings.sh
#
#
Linux bash scriptto compute values for the
#
recommendedHugePages/HugeTLB configuration
#
#
Note: This scriptdoes calculation for all shared
memory
#
segmentsavailable when the script is run, no matter
it
#
is an OracleRDBMS shared memory segment or not.
#
#
This script isprovided by Doc ID 401749.1 from My Oracle
Support
#http://support.oracle.com
#
Welcome text
echo
"
This
script isprovided by Doc ID 401749.1 from My Oracle
Support
(http://support.oracle.com)where
it is intended to compute values
for
the
recommendedHugePages/HugeTLB configuration for the current
shared
memory
segments.Before proceeding with the execution please note
following:
And
make sure that:
Press
Enter toproceed..."
read
#
Check for thekernel version
KERN=`uname
-r |awk -F. '{ printf("%d.%d\n",$1,$2); }'`
#
Find out theHugePage size
HPG_SZ=`grepHugepagesize
/proc/meminfo | awk '{print $2}'`
if
[ -z"$HPG_SZ" ];then
fi
#
Initialize thecounter
NUM_PG=0
#
Cumulative numberof pages required to handle the running shared
memory segments
for
SEG_BYTES in`ipcs -m | cut -c44-300 | awk '{print $1}' | grep
"[0-9][0-9]*"`
do
done
RES_BYTES=`echo"$NUM_PG
* $HPG_SZ * 1024" | bc -q`
#
An SGA less than100MB does not make sense
#
Bail out if thatis the case
if
[ $RES_BYTES -lt100000000 ]; then
HugePagesconfiguration.
HugePages can only be used for shared memory
segments
that
you can listby command:
of
a size that canmatch an Oracle Database SGA. Please make sure
that:
fi
#
Finish withresults
case
$KERN in
esac
#
End
2.5 第五步: 在/etc/sysctl.conf文件中设置vm.nr_hugepages参数
...
vm.nr_hugepages = 1496
...
2.6 第六步:停止所有实例,并重启服务器
2.7 验证配置
在重启系统之后,确保所有的数据库实例都已经启动,使用如下命令检查HugePage的状态:
# grep HugePages /proc/meminfo
HugePages_Total:
HugePages_Free:
HugePages_Rsvd:
HugePages_Surp:
为了确保HugePages配置的有效性,HugePages_Free值应该小于HugePages_Total
Hugepages_Free