以下讲述如何在RHEL/OL/SLES如何设置hugepages,Exadata后期的版本onecommand默认为数据库配置了hugepages,早期的版本配置方式与RHEL/OL 类似。
在RHEL/OL上,大致有如下步骤:
在/etc/security/limits.conf最后添加:
oracle hard memlock lock_value
oracle soft memlock lock_value
其中上述lock_value使用比SGA值略大的一个值代替。
在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
14 | KERN= 'uname -r | awk -F. ' { printf ( "%d.%d\n" ,$1,$2); } '' |
17 | HPG_SZ=` grep Hugepagesize /proc/meminfo | awk { 'print $2' }` |
26 | for SEG_BYTES in `ipcs -m | awk { 'print $5' } | grep "[0-9][0-9]*" ` |
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` |
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." ;; |
运行上述hugepages_settings.sh,得到一个值。将这个值写入/etc/sysctl.conf, 例如:
#echo "vm.nr_hugepages=20480">>/etc/sysctl.conf
#sysctl -p
#grep Huge /proc/meminfo
因为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/