HUGEPAGES

Process ler memoryleri pages ler olarak kullanırlar, gelendede bu sayfalar 4kB , 2MB veya özel olarak 1gb dahi ayarlanabilmektedirler, yeni sistemlede bu değer genelde 2Mb olarak gelmektedir. Processler bir memory alanını kullanmak istediğinde, bu alan page olarak tahsis edilir ve bu page genelde çok küçük bir birimdir, dolayısıyla çok fazla memory ihtiyacı olan processler (veritabanları gibi) çok fazla sayıda page ihtiyacı olacaktır, çok fazla page üzerinde işlem yapmak ise çok fazla arama yapmak anlamına gelecektir buda sistemin yavaşlaması ile sonuçlanacaktır. Bu yüzden büyük memory kullanan (16GB dan büyük) Veritabanları için HugePage etkinleştirilmesi önerilmektedir.

ORACLE VERİTABANI İÇİN;

HugePage kullanmıyorsak eyvah yandık anlamı taşımıyor bu durum, bunu anlayabilmek için veritabanının en yoğun işlem yapıldığı bir zamanda aşağıdaki komutu çalıştırarak çıktısına bakabilir, o an ne kadar memory kullandığını görebiliriz

$ grep PageTables /proc/meminfo
PageTables:     20134880 kB

HugePage ayarlarının yapılabilmesi için ASMM (Autimotik Shared Memory Managemet) kullanıyor olmamız gerekir, AMM (Automatik Memory Management) HugePage desteklmez.

Mevcut HugePage kullanımını görmek için;

$ grep Huge /proc/meminfo
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

MOS dökümanında bulunan aşağıdaki scripti çalıştırarak ne kadarlık bir HugePage kullanmanız gerekir size öneride bulunan bir scrip aşağda verilmiştir.

$ 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 -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.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

Bu sh dosyasını çalıştırmadan önce Linux üzerinde tüm instance ların çalışır durumda olduğundan emin olunmalıdır. Benim durumum için çalıştırdığımda;

$ chmod 775 hugepages_settings.sh
$ sh hugepages_settings.sh

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 -m


Press Enter to proceed...

Recommended setting: vm.nr_hugepages = 41220

Bu önerilen değere göre artık HugePage ayarlarımızı yapabiliriz. (root ile)

# 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 oluşturuldu ancak şu an aktif değil, aşağıdaki dosyalar ilgili girişleri eklmemiz gerekmektedir.

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

Veritabanında use_large_pages parametresini kontrol edelim; TRUE değilse TRUE yapalım.

SQL> select value from v$parameter where name = 'use_large_pages';

VALUE
--------------------------------------------------------------------------------
TRUE

Peki biz bu hugepages_settings.sh ile hesaplamayıp, kendimiz hesaplamak istiyoruz bu değeri

All(SGA) / Hugepagesize = Number Hugepages

Benim durumumda ;

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     1048576
SGA / Hugepagesize = Number Hugepages
82432*1024/2048 = 41,216

En son olarak; veritabanı kapatılır ve server reboot edilir.

İlgili linkler

-- Configure operating system hugepages count satisfies total SGA requirements
-- HugePages on Linux: What It Is... and What It Is Not... (Doc ID 361323.1)
	 https://support.oracle.com/epmos/faces/DocContentDisplay?id=361323.1
-- HugePages on Oracle Linux 64-bit (Doc ID 361468.1)
	 https://support.oracle.com/epmos/faces/DocContentDisplay?id=361468.1
-- Oracle Linux: Shell Script to Calculate Values Recommended Linux HugePages / HugeTLB Configuration (Doc ID 401749.1)
	 https://support.oracle.com/epmos/faces/DocContentDisplay?id=401749.1
   
-- Configuring Huge Pages in Red Hat Enterprise Linux 4 or 5
	 https://goo.gl/Lb7nsM
-- Configuring HugePages for Oracle on Linux (x86-64)
	https://oracle-base.com/articles/linux/configuring-huge-pages-for-oracle-on-linux-64