环境: OEL 6.5 64bit + Oracle 11.2.0.4 + 32G内存 [11GSGA]
在数据库启动中Alert日志有如下提示信息:
-
************************ Large Pages Information *******************
-
Per process system memlock (soft) limit = 64 KB
-
-
Total Shared Global Region in Large Pages = 0 KB (0%)
-
-
Large Pages used by this instance: 0 (0 KB)
-
Large Pages unused system wide = 0 (0 KB)
-
Large Pages configured system wide = 0 (0 KB)
-
Large Page size = 2048 KB
-
-
RECOMMENDATION:
-
Total System Global Area size is 11 GB. For optimal performance,
-
prior to the next instance restart:
-
1. Increase the number of unused large pages by
-
at least 5761 (page size 2048 KB, total size 11 GB) system wide to
-
get 100% of the System Global Area allocated with large pages
-
2. Large pages are automatically locked into physical memory.
-
Increase the per process memlock (soft) limit to at least 11 GB to lock
-
100% System Global Area\'s large pages into physical memory
-
********************************************************************
看来这样大的内存占用势必需要配置HugePages 提高性能。
在MY ORACLE SUPPORT 中
Shell Script to Calculate Values Recommended Linux HugePages / HugeTLB Configuration (Doc ID 401749.1)
提供了计算
vm.nr_hugepages的具体脚本。
-
#!/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 text
-
echo \"
-
This script is provided by Doc ID 401749.1 from My Oracle Support
-
(http://support.oracle.com) where it is intended to compute values for
-
the recommended HugePages/HugeTLB configuration for the current shared
-
memory 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 and
-
you 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 -m
-
-
-
Press Enter to proceed...\"
-
-
read
-
-
# Check for the kernel version
-
KERN=`uname -r | awk -F. \'{ printf(\"%d.%d\\n\",$1,$2); }\'`
-
-
# Find out the HugePage size
-
HPG_SZ=`grep Hugepagesize /proc/meminfo | awk \'{print $2}\'`
-
if [ -z \"$HPG_SZ\" ];then
-
echo \"The hugepages may not be supported in the system where the script is being executed.\"
-
exit 1
-
fi
-
-
# Initialize the counter
-
NUM_PG=0
-
-
# Cumulative number of 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
-
MIN_PG=`echo \"$SEG_BYTES/($HPG_SZ*1024)\" | bc -q`
-
if [ $MIN_PG -gt 0 ]; then
-
NUM_PG=`echo \"$NUM_PG+$MIN_PG+1\" | bc -q`
-
fi
-
done
-
-
RES_BYTES=`echo \"$NUM_PG * $HPG_SZ * 1024\" | bc -q`
-
-
# An SGA less than 100MB does not make sense
-
# Bail out if that is the case
-
if [ $RES_BYTES -lt 100000000 ]; then
-
echo \"***********\"
-
echo \"** ERROR **\"
-
echo \"***********\"
-
echo \"Sorry! There are not enough total of shared memory segments allocated for
-
HugePages configuration. HugePages can only be used for shared memory segments
-
that you can list by command:
-
-
# ipcs -m
-
-
of 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 1
-
fi
-
-
# Finish with results
-
case $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\" ;;
-
\'3.8\') echo \"Recommended setting: vm.nr_hugepages = $NUM_PG\" ;;
-
esac
-
-
# End
根据执行结结果配置
/etc/sysctl.conf 文件,增加vm.nr_hugepages=****;
如果配置到此,仅仅完成了第一步,在数据库启动时依然有如下提示信息:
-
************************ Large Pages Information *******************
-
Per process system memlock (soft) limit = 64 KB
-
-
Total Shared Global Region in Large Pages = 0 KB (0%)
-
-
Large Pages used by this instance: 0 (0 KB)
-
Large Pages unused system wide = 5764 (11 GB)
-
Large Pages configured system wide = 5764 (11 GB)
-
Large Page size = 2048 KB
-
-
RECOMMENDATION:
-
Total System Global Area size is 11 GB. For optimal performance,
-
prior to the next instance restart:
-
1. Large pages are automatically locked into physical memory.
-
Increase the per process memlock (soft) limit to at least 11 GB to lock
-
100% System Global Area\'s large pages into physical memory
-
********************************************************************
根据提示需要将分配的内存Lock 在屋里内存中。
可以参考
MY ORACLE SUPPORT 中 HugePages on Oracle Linux 64-bit (Doc ID 361468.1)
配置
/etc/security/limits.conf 文件
-
soft memlock ******
-
hard memlock ******
其中具体数值需要大于SGA大小。
至此配置完成,重新启动后,Alert日志出现以下内容:
-
************************ Large Pages Information *******************
-
Per process system memlock (soft) limit = 12 GB
-
-
Total Shared Global Region in Large Pages = 11 GB (100%)
-
-
Large Pages used by this instance: 5761 (11 GB)
-
Large Pages unused system wide = 3 (6144 KB)
-
Large Pages configured system wide = 5764 (11 GB)
-
Large Page size = 2048 KB
-
********************************************************************
下面图片详细解释了HugePages

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28538954/viewspace-1344834/
,如需转载,请注明出处,否则将追究法律责任。