در مطلب “چرا 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 0 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
**********************************************************************
خیلی عالی بود