介绍
HugePages是Linux内核2.6+集成的一个功能,可以允许管理大于4KB的页。
相关概念
Page Table:页表是操作系统存储的虚拟地址和物理地址的映射的数据结构.
TLB: A Translation Lookaside Buffer (TLB),是CPU的一个固定大小的buffer,缓存了部分内存页表,可以更快进行虚拟地址转换。
hugetlb: 是TLB中指向HugePage的入口,通常等同于HugePage
hugetlbfs: 是2.6内核中新的像tmpfs的内存文件系统
为什么需要
如果你使用大内存及大的SGA,那HugePages是加快数据库性能的重要因素,优点如下:
页变大页数变少: 默认页是4K,而HugePageTLB是2048K,意味着页数少512倍
减少页表 Walking
更少的内存操作成本
更少的内存使用
没有内存交换
没有 'kswapd' 操作:正常页kswapd 会占用大量CPU资源(i.e. 13 million page table entries for 50GB memory). 而使用HugePages,则不需要。
如何配置
Step 1: vi/etc/security/limits.conf 单位KB,设置比SGA大没问题。使用oracle-validated包和exadata默认会被设置。也可以在etc/security/limits.d/ 目录下设置。
* soft memlock 60397977
* hard memlock 60397977
Step 2: 重新登陆oracle,check
$ ulimit -l
60397977
Step 3: AMM同hugepages不兼容,需先禁用(11.2.0.3+默认不配置AMM),不然会有如下报错:
ORA-00845:MEMORY_TARGET not supported on this system
Step4: 开启数据库实例,包括ASM,使用如下脚本计算vm.nr_hugepages:
$ ./hugepages_settings.sh
...
Recommended setting: vm.nr_hugepages = 1496
$
Step 5: vi etc/sysctl.conf 设置 vm.nr_hugepages,sysctl -p:
...
vm.nr_hugepages = 1496
...
Step6: 停实例,重启server(最佳实践建议重启)系统重启后,启动实例,检查是否生效, HugePages_Free value应该小于HugePages_Total:
# grep HugePages/proc/meminfo
HugePages_Total: 1496
HugePages_Free: 485
HugePages_Rsvd: 446
HugePages_Surp: 0
如果所有oracle实例PRE_PAGE_SGA参数是false,参数HugePages_Rsvd>0。12.1之前该参数默认false,12.1开始该参数默认为true
NOTES
HugePages配置基于内在和运行实例的SGA,如下变化需重新配置
OS总内存变化
添加新实例
实例SGA变化
如下情况需要评估HugePages配置是否合适:
数据库性能很差
系统OOM或过多swapping
实例不能启动
重要的服务失败
参考:mos 361468.1
附:hugepages_settings.sh
#!/bin/bash## hugepages_settings.sh## Linux bash script to compute values for the# recommended HugePages/HugeTLB configuration## Note: This script does calculation for all shared memory# segments available when the script is run, no matter it# is an Oracle RDBMS shared memory segment or not.## This script is provided by Doc ID 401749.1 from My Oracle Support# http://support.oracle.com# Welcome textecho "This script is provided by Doc ID 401749.1 from My Oracle Support(http://support.oracle.com) where it is intended to compute values forthe recommended HugePages/HugeTLB configuration for the current sharedmemory segments. 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 andyou should accommodate this while calculating SGA 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 -mPress Enter to proceed..."read# Check for the kernel versionKERN=`uname -r | awk -F. '{ printf("%d.%d\n",$1,$2); }'`# Find out the HugePage sizeHPG_SZ=`grep Hugepagesize /proc/meminfo | awk '{print $2}'`if [ -z "$HPG_SZ" ];thenecho "The hugepages may not be supported in the system where the script is being executed."exit 1fi# Initialize the counterNUM_PG=0# Cumulative number of pages required to handle the running shared memory segmentsfor SEG_BYTES in `ipcs -m | cut -c44-300 | awk '{print $1}' | grep "[0-9][0-9]*"`doMIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q`if [ $MIN_PG -gt 0 ]; thenNUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`fidoneRES_BYTES=`echo "$NUM_PG * $HPG_SZ * 1024" | bc -q`# An SGA less than 100MB does not make sense# Bail out if that is the caseif [ $RES_BYTES -lt 100000000 ]; thenecho "***********"echo "** ERROR **"echo "***********"echo "Sorry! There are not enough total of shared memory segments allocated forHugePages configuration. HugePages can only be used for shared memory segmentsthat you can list by command:# ipcs -mof a size that can match an Oracle Database SGA. Please make sure that:* Oracle Database instance is up and running* Oracle Database 11g Automatic Memory Management (AMM) is not configured"exit 1fi# Finish with resultscase $KERN in '2.2') echo "Kernel version $KERN is not supported. Exiting." ;;'2.4') HUGETLB_POOL=`echo "$NUM_PG*$HPG_SZ/1024" | bc -q`;echo "Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL" ;;'2.6') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;esac# End




