Hugepages的前世今生 (七)

以下讲述如何在RHEL/OL/SLES如何设置hugepages,Exadata后期的版本onecommand默认为数据库配置了hugepages,早期的版本配置方式与RHEL/OL 类似。

在RHEL/OL上,大致有如下步骤:

  •  首先需要配置memlock

在/etc/security/limits.conf最后添加:

oracle hard memlock lock_value
oracle soft memlock lock_value

其中上述lock_value使用比SGA值略大的一个值代替。

  • 估算hugepages的大小

在RHEL/OL平台,如果是数据库没有启动,则可以按照如下公式大致估算所需要的hugepages数目:

#hugepages=(SGA(MB)+(20k * # of Oracle processes running)/1024) / hugepage_size (MB)

例如: 如果sga的大小为64G,运行的oracle进程数为1000, 那么则大致需要32777个hugepages。

RedHat Consultant Scott Croft认为计算的时候应该加上PGA的值,但是pga是无法用到hugetlbfs的,所以这里没有算到pga的值。

当然在数据库实例没有启动的时候只能是估算,如果Oracle数据库正在运行,则可以得到更准确的值。以下脚本根据数据库启动以后的的共享内存段总和除上hugepages的大小,计算出来所需的hugepages的数量。

hugepages_settings.sh

01#!/bin/bash
02#
03# hugepages_settings.sh
04#
05# Linux bash script to compute values for the
06# recommended HugePages/HugeTLB configuration
07#
08# Note: This script does calculation for all shared memory
09# segments available when the script is run, no matter it
10# is an Oracle RDBMS shared memory segment or not.
11# Check for the kernel version
12#查看Oracle Kernel的版本,因为2.4和2.6使用的hugepages的参数是不一样的;
13#2.4使用vm.hugetlb_pool,而2.6使用vm.nr_hugepages。
14KERN='uname -r | awk -F. '{ printf("%d.%d\n",$1,$2); }''
15# Find out the HugePage size
16#查找Hugepages的大小,x86非PAE为4096,x86+PAE以及x86_64为2048,注意这里单位为K。
17HPG_SZ=`grep Hugepagesize /proc/meminfo | awk {'print $2'}`
18# Start from 1 pages to be on the safe side and guarantee 1 free HugePage
19#保证至少有1个page,也就是计数从1开始,MOS文档401749.1的初始计数从0开始。
20NUM_PG=1
21# Cumulative number of pages required to handle the running shared memory segments
22#循环计算一共需要多少hugepages
23#ipcs -m | awk {'print $5'} | grep "[0-9][0-9]*"的结果是列出所有的shared memory的大#小,单位为Bytes;echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q 为将shared memory处理单
24#个page的大小,得到单个shared memory所需的hugepages的数量。将所有的shared memory
25#循环累加,最终得到总的hugepages的数量。
26for SEG_BYTES in `ipcs -m | awk {'print $5'} | grep "[0-9][0-9]*"`
27do
28   MIN_PG='echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q'
29   if [ $MIN_PG -gt 0 ]; then
30      NUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`
31   fi
32done
33# Finish with results
34#根据不同的内核,提示设置不同的hugepages参数
35case $KERN in
36   '2.4') HUGETLB_POOL=`echo "$NUM_PG*$HPG_SZ/1024" | bc -q`;
37          echo "Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL" ;;
38   '2.6') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
39    *) echo "Unrecognized kernel version $KERN. Exiting." ;;
40esac
41# End
  • 设置hugepages内核参数

运行上述hugepages_settings.sh,得到一个值。将这个值写入/etc/sysctl.conf, 例如:

#echo "vm.nr_hugepages=20480">>/etc/sysctl.conf
#sysctl -p
#grep Huge /proc/meminfo
  • 禁用AMM特性

因为Oracle自动内存管理的AMM特性与hugetlbfs不兼容,所以需要禁用这个特性,但是可以使用SGA自动管理。具体做法将MEMORY_TARGET/MEMORY_MAX_TARGET设置为0, 并且手工指定SGA_TARGET/SGA_MAX_SIZE/PGA_AGGREGATE_TARGET的值。

  • 重启主机和数据库确认生效

设置完成以后,最好重启主机(不是必须的,但是建议)和数据库(必须)使得hugepages生效,如何确认hugepages生效,请查看上一篇文章:http://www.dbaleet.org/the_cirle_of_hugepages_part_6

 

如果使用的Linux是SLES (SUSE Linux Enterprise Server) ,则Oracle提供了一个名为orarun的rpm包,可以用于自动配置其hugepages。

This package creates the user and the groups for Oracle, sets the Oracle environment variables, sets kernel parameters to values recommended by Oracle, and provides for automated start and stop of Oracle components at system start and stop time.

SLES 11的orarun包可以在以下ftp站点找到:  http://ftp.novell.com/partners/oracle/sles-10/

SLES 11的orarun包可以在以下ftp站点找到: http://ftp.novell.com/partners/oracle/sles-11/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值