Processes use memories as pages, in the future these pages can be set to 4kB, 2MB or even 1GB specifically, in new systems this value is usually 2Mb. When processes want to use a memory space, this space is allocated as a page and this page is usually a very small unit, so processes that need a lot of memory (like databases) will need too many pages, processing too many pages means too many searches. This will mean doing it, which will result in the system slowing down. Therefore, it is recommended to enable HugePage for Databases that use large memory (greater than 16GB).
FOR ORACLE DATABASE;
If we do not use HugePage, it does not mean that we are burned out. In order to understand this, we can run the following command at a time when the database is the busiest, and look at the output, and see how much memory it uses at that moment.
$ grep PageTables /proc/meminfo
PageTables: 20134880 kB
HugePage settings need to be using ASMM (Autimotic Shared Memory Management), AMM (Automatic Memory Management) HugePage is not supported.
To see the current HugePage usage;
$ grep Huge /proc/meminfo
AnonHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
A script that suggests how much HugePage you should use is given below by running the script below in the MOS document.
$ vi hugepages_settings.sh
#!/bin/bash
#
# hugepages_settings.sh
#
# Linux bash script to compute values for the
# recommended HugePages/HugeTLB configuration
# on Oracle Linux
#
# 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 on Oracle Linux. 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 the overall 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 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
doneRES_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.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” ;;
‘3.10’) echo “Recommended setting: vm.nr_hugepages = $NUM_PG” ;;
‘4.1’) echo “Recommended setting: vm.nr_hugepages = $NUM_PG” ;;
‘4.14’) echo “Recommended setting: vm.nr_hugepages = $NUM_PG” ;;
‘4.18’) echo “Recommended setting: vm.nr_hugepages = $NUM_PG” ;;
‘5.4’) echo “Recommended setting: vm.nr_hugepages = $NUM_PG” ;;
*) echo “Kernel version $KERN is not supported by this script (yet). Exiting.” ;;
esac# End
Before running this sh file, it should be ensured that all instances are running on Linux. For my case when I run it;
$ chmod 775 hugepages_settings.sh
$ sh hugepages_settings.shThis 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 on Oracle Linux. 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 the overall 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…
Recommended setting: vm.nr_hugepages = 41220
We can now adjust our HugePage settings according to this recommended value. (with root)
# vi /etc/sysctl.conf
vm.nr_hugepages = 41220
# sysctl -p
# grep Huge /proc/meminfo
AnonHugePages: 0 kB
HugePages_Total: 18
HugePages_Free: 18
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Huge page has been created but is not active at the moment, we need to add the following files and related entries.
vi /etc/security/limits.conf
oracle soft memlock 41943040
oracle hard memlock 41943040
#grid soft memlock 41943040 –grid user varsa
#grid hard memlock 41943040 -grid user varsa
Let’s check the use_large_pages parameter in the database; If not TRUE let’s set it to TRUE.
SQL> select value from v$parameter where name = ‘use_large_pages’;
VALUE
——————————————————————————–
TRUE
Well, we do not want to calculate this with hugepages_settings.sh, we want to calculate this value ourselves.
All(SGA) / Hugepagesize = Number Hugepages
In my case;
SQL> show parameter sga
NAME TYPE VALUE
———————————— ———– ——————————
allow_group_access_to_sga boolean FALSE
lock_sga boolean FALSE
pre_page_sga boolean TRUE
sga_max_size big integer 82432M
sga_min_size big integer 0
sga_target big integer 82432M
unified_audit_sga_queue_size integer 1048576SGA / Hugepagesize = Number Hugepages
82432*1024/2048 = 41,216
Finally; The database is closed and the server is rebooted.