CentOS6u9 Oracle11g 内存策略选择和大页内存优化

简单说明:

Oracle 内存管理模式:

AMM(Automatic Memory Management)
  该模式对Oracle使用的总内存(SGA+PGA)进行统一自动管理
  该模式是完全托管模式,当库不重要或缺少专门的维护DBA的时候可以使用
  该模式与HugePage大页内存优化冲突

ASMM(Automatic Shared Memory Management)
  该模式是对SGA的组成部件(如buffer、cache等)自动调整
  当AMM模式关闭后,ASMM模式才会生效

AMM 模式启用:

memory_target非0,开启AMM
memory_target为0,关闭AMM

memory_max_target指定memory_target所能使用的最大值,静态参数
memory_max_target设置不能超过/dev/shm的容量,否则报错:
  ORA-00845: MEMORY_TARGET not supported on this system
关于/dev/shm可以参见牛人关于tmpfs的博文:
  https://blog.csdn.net/java211/article/details/52295348
memory_target指定库所能使用的最大内存值,是PGA和SGA的总和,动态参数

设置memory_target 没有设置memory_max_target
  库重启后memory_max_target和memory_target大小相等
设置memory_max_target 没有设置memory_target
  库重启后memory_target为0,即AMM模式关闭
设置memory_max_target < memory_target,启动报错:
  ORA-00837: Specified value of MEMORY_TARGET greater than MEMORY_MAX_TARGET
设置memory_target非0,启用AMM模式,sga_target和pga_aggregate_target参数不生效

建议:
  同时设置memory_target和memory_max_target,且两者相等,小于/dev/shm
su -
# 首先关闭数据库
su - oracle -c "echo 'shutdown immediate;'|sqlplus / as sysdba"

# OS和Oracle内存分配依然遵循二八原则
# SGA和PGA内存分配也遵循二八原则
SUM_Bytes=$(grep 'MemTotal' /proc/meminfo |awk '{printf ("%d\n",$2*1024*0.8)}')

# 获取当前的/dev/shm容量
TMPFS_Bytes=$(df -k|awk '{if($1~/tmpfs/) print $2*1024}')

# /dev/shm容量默认是物理内存的一半,而Oracle使用的内存占物理内存的80%
# 是需要调整的,调整方法是计算容量(要稍大一点),修改fstab,重新挂载:
FIN_MB=$(echo "size=$((${SUM_Bytes}/1024/1024+10))M")
sed -i "s|\(^.*/dev/shm.*\)\(defaults\)\(.*$\)|\1\2,${FIN_MB}\3|g" /etc/fstab
mount -o remount /dev/shm

# 切换到Oracle用户,生成pfile进行编辑设置
su - oracle
cd $ORACLE_HOME/dbs
echo 'create pfile from spfile;'|sqlplus / as sysdba
mv -v spfile${ORACLE_SID}.ora /tmp/

# 配置pfile
sed -i '/^[^*]/d' init${ORACLE_SID}.ora
sed -i '/^.*memory_target.*$/d' init${ORACLE_SID}.ora
sed -i '/^.*memory_max_target.*$/d' init${ORACLE_SID}.ora
sed -i '/^.*sga_target.*$/d' init${ORACLE_SID}.ora
sed -i '/^.*pga_aggregate_target.*$/d' init${ORACLE_SID}.ora
sed -i '/^.*workarea_size_policy.*$/d' init${ORACLE_SID}.ora
SUM_Bytes=$(grep 'MemTotal' /proc/meminfo |awk '{printf ("%d\n",$2*1024*0.8)}')
echo "*.memory_max_target=${SUM_Bytes}">>init${ORACLE_SID}.ora
echo "*.memory_target=${SUM_Bytes}">>init${ORACLE_SID}.ora

# 启动验证
echo 'create spfile from pfile;'|sqlplus / as sysdba
mv -v init${ORACLE_SID}.ora /tmp/
echo 'startup;'|sqlplus / as sysdba
echo 'show parameter memory_target'|sqlplus -s / as sysdba
echo 'show parameter memory_max_target'|sqlplus -s / as sysdba
echo 'show parameter sga_target'|sqlplus -s / as sysdba
echo 'show parameter pga_aggregate_target'|sqlplus -s / as sysdba
echo 'show parameter workarea_size_policy'|sqlplus -s / as sysdba

ASMM 模式启用:

memory_target为0,关闭AMM
sga_target非0,开启ASMM
workarea_size_policy为auto
pga_aggregate_target非0,开启自动PGA管理
su - oracle
# 首先关闭数据库
echo 'shutdown immediate;'|sqlplus / as sysdba

# 计算根据当前内存容量SGA和PGA的容量
SGA_Bytes=$(grep 'MemTotal' /proc/meminfo |awk '{printf ("%d\n",$2*1024*0.8*0.8)}')
PGA_Bytes=$(grep 'MemTotal' /proc/meminfo |awk '{printf ("%d\n",$2*1024*0.8*0.2)}')

# 生成pfile,进行配置
cd $ORACLE_HOME/dbs
echo 'create pfile from spfile;'|sqlplus / as sysdba
mv -v spfile${ORACLE_SID}.ora /tmp/

# 配置pfile
sed -i '/^[^*]/d' init${ORACLE_SID}.ora
sed -i '/^.*memory_target.*$/d' init${ORACLE_SID}.ora
sed -i '/^.*memory_max_target.*$/d' init${ORACLE_SID}.ora
sed -i '/^.*sga_target.*$/d' init${ORACLE_SID}.ora
sed -i '/^.*pga_aggregate_target.*$/d' init${ORACLE_SID}.ora
sed -i '/^.*workarea_size_policy.*$/d' init${ORACLE_SID}.ora
echo "*.sga_target=${SGA_Bytes}">>init${ORACLE_SID}.ora
echo "*.pga_aggregate_target=${PGA_Bytes}">>init${ORACLE_SID}.ora
echo "*.workarea_size_policy=auto">>init${ORACLE_SID}.ora

# 启动验证
echo 'create spfile from pfile;'|sqlplus / as sysdba
mv -v init${ORACLE_SID}.ora /tmp/
echo 'startup;'|sqlplus / as sysdba
echo 'show parameter memory_target'|sqlplus -s / as sysdba
echo 'show parameter memory_max_target'|sqlplus -s / as sysdba
echo 'show parameter sga_target'|sqlplus -s / as sysdba
echo 'show parameter pga_aggregate_target'|sqlplus -s / as sysdba
echo 'show parameter workarea_size_policy'|sqlplus -s / as sysdba

HugePage大页内存优化:

当物理内存较大时,使用HugePage大页内存优化可以提高性库能
只有在ASMM内存管理模式下才可以进行大页内存优化

方法1,依据库内存容量直接计算:

su -
# 首先关库
su - oracle -c "echo 'shutdown immediate;'|sqlplus / as sysdba"

# 库内存容量根据二八原则计算得出,也可以查询pfile文件确定
SUM_Bytes=$(grep 'MemTotal' /proc/meminfo |awk '{printf ("%d\n",$2*1024*0.8)}')

# 系统大页内存块大小,一般为2M大小
HPSIZE_Bytes=$(grep Hugepagesize /proc/meminfo|awk '{print $2*1024}')

# 分配Oracle库所需内存的大页内存块数量计算公式为:
# NUM=SUM_Bytes/HPSIZE_Bytes+100
# 需要一些盈余空间,100块大页内存块即可
NUM=$((${SUM_Bytes}/${HPSIZE_Bytes}+100))
NUM_KB=$((${NUM}*2*1024))

# 添加配置
echo "vm.nr_hugepages = ${NUM}">>/etc/sysctl.conf
sysctl -p
echo "oracle soft memlock ${NUM_KB}">>/etc/security/limits.conf
echo "oracle hard memlock ${NUM_KB}">>/etc/security/limits.conf

# 启库验证
su - oracle -c "echo 'startup;'|sqlplus / as sysdba"
for i in $(seq 10)
do
  grep -E 'HugePages_Total|HugePages_Free' /proc/meminfo
  cat /proc/meminfo|grep PageT
  echo -e '\n\n\n'
  sleep 5
done
#HugePages_Free和HugePages_Total不相等,PageTables变化,HugePages配置成功

方法2,官方提供的计算方法:

# MOS文档 Doc ID 401749.1 提供了一个计算NUM的脚本
# 原理是根据库启动后系统中所有的共享内存段大小进行计算

# 首先启动库,或者依据库高峰负载的情况进行计算
su - oracle -c "echo 'startup;'|sqlplus / as sysdba"

# 系统大页内存块大小,一般为2M大小
HPSIZE_Bytes=$(grep Hugepagesize /proc/meminfo|awk '{print $2*1024}')

# 计算盈余块和基础块
ADD=$(ipcs -m | awk '{print $5}' | grep "[0-9][0-9]*"|wc -l)
BASE=$(ipcs -m | awk '{print $5}' | grep "[0-9][0-9]*"|awk "{SunBytes+=\$1}END{printf(\"%d\",SunBytes/${HPSIZE_Bytes})}")
NUM=$((${BASE}+${ADD}))
NUM_KB=$((${NUM}*2*1024))
# 库启动后,当前系统存在的所有共享内存段,包括SGA和PGA以及非库的共享内存段
# 以这些为基础计算大页内存块数量,并增加盈余块为共享内存段的数量

# 添加配置
echo "vm.nr_hugepages = ${NUM}">>/etc/sysctl.conf
sysctl -p
echo "oracle soft memlock ${NUM_KB}">>/etc/security/limits.conf
echo "oracle hard memlock ${NUM_KB}">>/etc/security/limits.conf

# 重启库验证
su - oracle -c "echo 'shutdown immediate;'|sqlplus / as sysdba"
su - oracle -c "echo 'startup;'|sqlplus / as sysdba"
for i in $(seq 10)
do
  grep -E 'HugePages_Total|HugePages_Free' /proc/meminfo
  cat /proc/meminfo|grep PageT
  echo -e '\n\n\n'
  sleep 5
done
#HugePages_Free和HugePages_Total不相等,PageTables变化,HugePages配置成功

两种方法的区别:

第一种方法直接根据库使用的内存大小计算大页内存块数量,然后增加100个盈余块
第二种方法根据系统当前所有的共享内存段大小
  包括SGA和PGA以及系统非库的共享内存段计算大页内存块数量
  然后每个共享内存段增加一个大页内存块作为盈余
两者任选其一即可,差别不大

注意:

kernel 2.6 之后的系统版本,11.2.0.2 之后的库版本、单机或RAC
需要禁用大页新特性 Transparent HugePages

alter system set use_large_pages=only scope=spfile sid='*';
sed -i 's/\<kernel.*$/& transparent_hugepage=never/g' /boot/grub/grub.conf
su - oracle -c "echo 'shutdown immediate;'|sqlplus / as sysdba"
reboot
grep AnonHugePages /proc/meminfo
# 其值为0,则特性关闭

[TOC]

猜你喜欢

转载自blog.csdn.net/zwjzqqb/article/details/80621713
今日推荐