پیکربندی Huge Page برای دیتابیس اوراکل

در مطلب “چرا Huge Page” در مورد مزایا و دلایل استفاده از Huge Page مطالبی را ارائه کردیم در این مطلب قصد داریم نکاتی را در مورد Huge Page برای دیتابیس اوراکل ارائه کنیم.

همانند دیتابیس پستگرس، دیتابیس اوراکل هم در صورت پیکربندی Huge Page در محیط سیستم عامل، به صورت خودکار و در زمان استارت شدن instance، برای فضای shared memory از Huge Page استفاده خواهد کرد.

اوراکل برای کنترل استفاده و یا عدم استفاده از Huge Page، پارامتر USE_LARGE_PAGES را ارائه کرده که در همین ابتدای متن، توضیحاتی را در مورد این پارامتر ارائه می کنیم.

 

پارامتر USE_LARGE_PAGES

امکان تنظیم سه مقدار زیر برای این پارامتر وجود دارد:

USE_LARGE_PAGES = { [TRUE] | FALSE | ONLY }

TRUE: با تنظیم پارامتر USE_LARGE_PAGES به مقدار TRUE، دیتابیس اوراکل مجوز استفاده از Huge Page را برای فضای shared memory خواهد داشت و در صورتی که Huge Page در محیط سیستم عامل پیکربندی شده باشد، اوراکل می تواند از این قابلیت استفاده کند(البته در صورت عدم استفاده از AMM که در ادامه توضیح داده خواهد شد).

اگر حجم در نظر گرفته شده برای مخزن Huge Page هم اندازه و یا بزرگتر از فضای SGA نباشد، اوراکل تا جایی که امکان دارد از صفحات از نوع Huge Page استفاده خواهد کرد و بقیه فضا را از صفحات 4KB خواهد گرفت. البته در صورت تنظیم پارامتر USE_LARGE_PAGES به مقدار TRUE، اگر Huge Page پیکربندی هم نشده باشد، باز هم instance بدون خطا استارت می شود.

در زمان استارت instance، پیامی در ALERT LOG ثبت خواهد شد که اطلاعات دقیقی را در این مورد ارائه می کند:

SHARED GLOBAL AREA (SGA) into memory: 64G

Available system pagesizes:

  4K, 2048K

Supported system pagesize(s):

  PAGESIZE  AVAILABLE_PAGES  EXPECTED_PAGES  ALLOCATED_PAGES  ERROR(s)

        4K           Configured                                  10                       16777226        NONE

     2048K                                                        32769                       0                  NONE

RECOMMENDATION:For optimal performance, configure system with expected number of pages for every supported system pagesize prior to the next instance restart operation.

همانظور که می بینید، با توجه به عدم پیکربندی Huge Page، اوراکل به ناچار از 16777226 صفحه 4KB برای SGA استفاده کرده است.

توجه: به صورت پیش فرض، پارامتر USE_LARGE_PAGES به مقدار TRUE تنظیم شده است.

 

ONLY: در حالت قبل(USE_LARGE_PAGES=TRUE) ممکن بود اوراکل همزمان از صفحات 4KB و 2MB استفاده کند که این مسئله به لحاظ پرفورمنسی می توانست مسبب کندی دیتابیس شود.

اگر بخواهیم اوراکل را ملزم به استفاده از Huge Page برای همه فضای shared memory بکنیم، می توانیم پارامتر USE_LARGE_PAGES را به مقدار ONLY تنظیم کنیم در این صورت، با عدم پیکربندی Huge Page و یا عدم وجود صفحات کافی، استارت instance با خطا مواجه خواهد شد.

برای مثال، دستور startup زیر به دلیل عدم پیکربندی Huge Page با خطا متوقف شده است:

[root@myhost~]# grep Huge /proc/meminfo

HugePages_Total:       0

HugePages_Free:        0

HugePages_Rsvd:        0

HugePages_Surp:        0

Hugepagesize:       2048 kB

SQL> startup

ORA-27106: system pages not available to allocate memory

 

FALSE:با تنظیم USE_LARGE_PAGES به این مقدار، به صورت کلی دیتابیس از Huge Page استفاده نخواهد کرد.

 

مراحل پیکربندی Huge Page برای دیتابیس اوراکل

برای استفاده دیتابیس اوراکل از Huge Page، انجام مراحل زیر پیشنهاد می شود.

 

مرحله اول: غیرفعال کردن ویژگی (Automatic Memory Management (AMM

ویژگی (Automatic Memory Management (AMM با Huge Page ناسازگار است به این جهت، باید دو پارامتر MEMORY_TARGET و MEMORY_MAX_TARGET را به مقدار صفر تنظیم کرده و یا آنها را از فایل راه انداز حذف نمود(در اوراکل 11g پارامترها را حذف کنید):

SQL>  alter system reset memory_max_target scope=spfile;

System altered.

SQL> alter system reset memory_target scope=spfile;

System altered.

 

مرحله دوم: تنظیم محدودیت memlock

مقدار محدودیت max locked memory یا همان memlock را برای کاربر سیستم عاملی oracle افزایش می دهیم. به عبارت دیگر، مجوز لازم برای قفل کردن قسمتی از حافظه را به این کاربر می دهیم.

این محدودیت را در فایل limits.conf به مقداری نزدیک به فضای کلی RAM(حدودا 90 درصد از فضای RAM) و یا حداقل فضایی بالاتر از مقدار SGA(بر اساس KB) تنظیم می کنیم:

SQL> select value/1024 from v$parameter where name = ‘sga_target‘;

VALUE/1024

———-

  67108864

[root@myhost ~]# vi /etc/security/limits.conf

oracle   hard   memlock    70108864

oracle   soft   memlock    70108864

بعد از تنظیم مقدار memlock، مجددا به سرور login کرده و دستور زیر را اجرا می کنیم:

 [root@myhost ~]# exit

Logout

 [root@myhost ~]# su – oracle

 [oracle@myhost ~]$ ulimit -l

70108864

 

مرحله سوم:محاسبه مقدار پارامتر vm.nr_hugepages

برای پیکربندی Huge Page در محیط لینوکس، باید مقدار پارامتر vm.nr_hugepages را محاسبه کرد. این پارامتر بیانگر حداکثر تعداد صفحات از نوع Huge Page می باشد.

برای محاسبه مقدار پارامتر nr_hugepages، اوراکل اسکریپتی را با عنوان 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.
# 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'}`
# Start from 1 pages to be on the safe side and guarantee 1 free HugePage
NUM_PG=1
# Cumulative number of pages required to handle the running shared memory segments
for SEG_BYTES in `ipcs -m | awk {'print $5'} | 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
# 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' | '3.8' | '3.10' | '4.1' | '4.14' ) echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
    *) echo "Unrecognized kernel version $KERN. Exiting." ;;
esac
# End

علاوه بر اسکریپت فوق، امکان محاسبه این پارامتر به صورت دستی و با اندکی تلرانس هم وجود دارد که در ادامه این روش را هم مرور می کنیم.

توجه: تنظیم پارامتر nr_hugepages به مقداری بیش از مقدار مورد نیاز برای shared memory می تواند سبب از دست رفتن بخشی حافظه شود.

همانطور که قبلا هم بیان شد، حجم هر صفحه(از نوع Huge Page) می تواند 2MB و یا بیشتر باشد(در مورد پشتیبانی CPU از حجم صفحات، می توانید به مطلب “چرا Huge Page” رجوع کنید.)

با کمک دستور زیر، حجم صفحات از نوع Huge Page را در سرور جاری مشخص می کنیم:

[root@myhost ~]# grep Hugepagesize /proc/meminfo

Hugepagesize:    2048 kB

در این سرور حجم هر صفحه به 2MB تنظیم شده است. برای محاسبه مقدار تقریبی پارامتر nr_hugepages، می توان از فرمول زیر بهره گرفت:

nr_hugepages(Number of Hugepages)=(SGA/Hugepagesize)

با توجه به آنکه فصای SGA برابر با 67108864 و اندازه هر صفحه هم برابر با 2048 بوده ، پس مقدار این پارامتر در سرور جاری به شکل زیر قابل محاسبه است:

vm.nr_hugepages=67108864/2048=32768

اگر عدد بدست آمده فوق، به حدی دقیق نباشد که همه فضای SGA را در بربگیرد، ممکن است قسمتی از SGA از صفحات 4K استفاده کند به همین جهت معمولا توصیه می شود عدد بدست آمده فوق را کمی(حدودا 3 درصد) افزایش دهیم.

برای مثال، عدد 32768 که بیانگر 32 هزار صفحه 2 مگابایتی می باشد، را به عددی بالاتر مثلا 33768 افزایش می دهیم تا مطمئن باشیم همه فضای SGA از Huge Page استفاده می کند البته تنظیم پارامتر use_large_pages به مقدار only می تواند این اطمینان را به ما بدهد.(مجددا تاکید می شود که تنظیم عدد خیلی بالا برای پارامتر nr_hugepages، سبب هدر رفتن بخشی از حافظه خواهد شد).

اگر در محیطی از ASM instance استفاده می شود و یا instance دیگری هم در حال اجرا است، بهتر است فضای SGA همه آنها را با هم جمع کرده و نهایتا حد بالایی از مقدار آن را بر Hugepagesize تقسیم کنیم تا همه instanceها از Huge Page استفاده کنند.

nr_hugepages= ( SGA 1. Instance + SGA 2. Instance + … etc. ) / Hugepagesize

 

مرحله چهارم: غیرفعالسازی Transparent Huge Page

نحوه غیرفعالسازی Transparent Huge Page در مطلب “تفاوتهای Transparent Huge Page با standard Huge Page” توضیح داده شد.

 

مرحله پنجم: تنظیم و اعمال پارامتر vm.nr_hugepages

بعد از محاسبه مقدار پارامتر nr_hugepages، مقدار جدید این پارامتر را در فایل sysctl.conf( و یا در فایلهای موجود در زیر دایرکتوری etc/sysctl.d/) تنظیم می کنیم.

[root@myhost ~]# vi /etc/sysctl.conf

vm.nr_hugepages=33768

به صورت پیش فرض، مقدار این پارامتر برابر با 0 می باشد.

با تنظیم این پارامتر، هنوز Huge Page کانفیگ نشده است:

 [root@myhost ~]# grep ^Huge /proc/meminfo

HugePages_Total:       0

HugePages_Free:        0

HugePages_Rsvd:        0

HugePages_Surp:        0

Hugepagesize:       2048 kB

 دو راه برای اعمال مقدار تنظیم شده برای پارامتر vm.nr_hugepages وجود دارد. یکی reboot و دیگری استفاده از دستور sysctl به همراه سوییچ p، که البته استفاده از reboot هر چند که نیاز به downtime بیشتری دارد ولی معمولا توصیه می شود:

 [root@myhost ~]# reboot

بعد از انجام reboot، خواهیم دید که Huge Page در سیستم پیکربندی شده و آماده استفاده است:

 [root@myhost ~]# grep ^Huge /proc/meminfo

HugePages_Total:   33768

HugePages_Free:    33768

HugePages_Rsvd:        0

HugePages_Surp:        0

Hugepagesize:       2048 kB

 

مرحله ششم: استارت مجدد دیتابیس اوراکل

اگر در محرحله قبل از دستور sysctl -p استفاده کردید باید دیتابیس را یکبار restart کنید تا برای فضای shared memoryاش از Huge Page استفاده کند:

[root@myhost ~]# grep Huge /proc/meminfo

AnonHugePages:         0 kB

HugePages_Total:   33768

HugePages_Free:    33768

HugePages_Rsvd:        0

HugePages_Surp:        0

Hugepagesize:       2048 kB

SQL> startup

ORACLE instance started.

Total System Global Area 6.8719E+10 bytes

Fixed Size                 30153408 bytes

Variable Size            1.1543E+10 bytes

Database Buffers         5.7043E+10 bytes

Redo Buffers              104062976 bytes

Database mounted.

Database opened.

SQL>

با استارت دیتابیس خواهیم دید که صرفا 999 صفحه از نوع Huge Page آزاد و بقیه در حال مصرف هستند:

[root@myhost ~]# grep Huge /proc/meminfo

AnonHugePages:         0 kB

HugePages_Total:   33768

HugePages_Free:      999

HugePages_Rsvd:        0

HugePages_Surp:        0

Hugepagesize:       2048 kB

با کمک دستور زیر سهم هر بخش SGA از Huge Page مشخص می شود. منظور از Variable Size در جدول زیر، قسمتهایی از SGA که قابلیت resize آنلاین دارند، می باشد قسمتهایی چون shared pool، bffer cache و … 

select “AREA NAME”, “SEGMENT SIZE”, “SIZE”, pagesize, shmid from x$ksmssinfo;

همچنین در زمان استارت instance، پیام زیر در ALERT LOG قابل مشاهده هستند:

**********************************************************************

2020-04-09T14:44:43.843580+04:30

Dump of system resources acquired for SHARED GLOBAL AREA (SGA)

 Per process system memlock (soft) limit = 67G

 Expected per process system memlock (soft) limit to lock

 SHARED GLOBAL AREA (SGA) into memory: 64G

 Available system pagesizes:

  4K, 2048K

 Supported system pagesize(s):

  PAGESIZE  AVAILABLE_PAGES  EXPECTED_PAGES  ALLOCATED_PAGES  ERROR(s)

        4K            Configured                      10                      10                          NONE

     2048K               33768                     32769                32769                        NONE

**********************************************************************

ارتباط با نویسنده مطلب:vahidusefzadeh@ کانال تخصصی اوراکل و لینوکس: OracleDB@

Comment (1)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.