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
Bir yanıt yazın