در مطلب “پیکربندی Huge Page برای دیتابیس اوراکل“ در مورد مقادیری که برای پارامتر USE_LARGE_PAGES قابل تنظیم است، نکاتی را مطرح کردیم و توضیح دادیم که برای این پارامتر می توان یکی از مقادیر FALSE, ONLY, TRUE را تنظیم کرد(مقدار AUTO در نسخه های جدید قابل تنظیم نیست.)
Connected to Oracle Database 18c Enterprise Edition Release 18.0.0.0.0
SQL> select value from v$parameter_valid_values p where upper(name)= ‘USE_LARGE_PAGES’;
VALUE
————–
TRUE
AUTO
ONLY
FALSE
در اوراکل نسخه 19c، مقدار AUTO_ONLY هم به این مجموعه مقادیر اضافه شده است که در این متن به بررسی این مقدار خواهیم پرداخت.
Connected to Oracle Database 19c Enterprise Edition Release 19.0.0.0.0
SQL> select value from v$parameter_valid_values p where upper(name)= ‘USE_LARGE_PAGES’;
VALUE
————–
TRUE
AUTO
ONLY
FALSE
AUTO_ONLY
زمانی که پارامتر USE_LARGE_PAGES را به مقدار AUTO_ONLY تنظیم می کنیم، محاسبه و تنظیم تعداد large pageها بر عهده دیتابیس اوراکل خواهد بود. مثال زیر را ببینید.
در محیط تستی که در آن قرار داریم، Huge Page قبلا پیکربندی نشده است:
[root@RAC2 ~]# grep ^Huge /proc/meminfo
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
همچنین مقدار در نظر گرفته شده برای instanceای که در حال اجرا است، برابر با 37GB می باشد:
SQL> show parameter sga
NAME TYPE VALUE
———————————— ———– ——————————
sga_max_size big integer 37G
sga_target big integer 37G
در این شرایط تصمیم داریم تا با کمک new feature اوراکل 19c، قابلیت Huge Page را پیکربندی کنیم:
SQL> alter system set use_large_pages=AUTO_ONLY scope=spfile sid=‘instance2’ ;
بعد از تنظیم پارامتر use_large_pages به مقدار AUTO_ONLYء، instance را restart می کنیم:
SQL> startup nomount force;
ORACLE instance started.
Total System Global Area 3.9728E+10 bytes
Fixed Size 30383136 bytes
Variable Size 6039797760 bytes
Database Buffers 3.3554E+10 bytes
Redo Buffers 103833600 bytes
بعد از restart کردن instance، خواهیم دید که تعداد Huage Pageها از 0 به 18946 رسیده است:
[root@RAC2 ~]# grep ^Huge /proc/meminfo
HugePages_Total: 18946
HugePages_Free: 111
HugePages_Rsvd: 111
HugePages_Surp: 0
Hugepagesize: 2048 kB
همچنین در پیامهای Alert Log می بینیم که اوراکل برای shared memory از Huge Page استفاده کرده است:
Dump of system resources acquired for SHARED GLOBAL AREA (SGA)
2021-03-30T13:54:12.777120+04:30
Per process system memlock (soft) limit = 40G
Expected per process system memlock (soft) limit to lock
instance MAX SHARED GLOBAL AREA (SGA) into memory: 37G
PAGESIZE AVAILABLE_PAGES EXPECTED_PAGES ALLOCATED_PAGES ERROR(s)
2021-03-30T13:54:12.777662+04:30
2048K 18946 18946 18946 NONE
**********************************************************************
البته اگر به اندازه مقدار محاسبه شده، large page قابل تخصیص موجود نباشد، دستور startup با خطا متوقف خواهد شد عدم قابلیت تخصیص large page می تواند به تنظیمات محیطی، نظیر memlock (soft) limit برگردد به عنوان یک نمونه از این محدودیتها، large page هیچگاه نمی تواند بیشتر از اندازه در نظر گرفته شده برای memlock (soft) limit باشد:
SQL> alter system set sga_max_size=50g scope=spfile sid=‘instance2’ ;
System altered.
SQL> alter system set sga_target=50g scope=spfile sid=‘instance2’ ;
System altered.
SQL> startup nomount force;
ORA-27125: unable to create shared memory segment
Linux-x86_64 Error: 1: Operation not permitted
Additional information: 4549
Additional information: 134217728
SQL>
در alert log هم می بینیم که memlock (soft) limit برابر با 40G می باشد بنابرین نمی توان 50G از حافظه را برای large page کنار گذاشت:
Per process system memlock (soft) limit = 40G
2021-03-30T13:56:37.061802+04:30
Expected per process system memlock (soft) limit to lock
instance MAX SHARED GLOBAL AREA (SGA) into memory: 50G
PAGESIZE AVAILABLE_PAGES EXPECTED_PAGES ALLOCATED_PAGES ERROR(s)
2021-03-30T13:56:37.062428+04:30
2048K 25551 25602 20559 ORA-27125
Reason for not supporting certain system pagesizes:
RECOMMENDATION:
2021-03-30T13:56:37.062744+04:30
- Configure system with expected number of pages for every
supported system pagesize prior to the next instance restart operation.
2021-03-30T13:56:37.065750+04:30
- Increase per process memlock (soft) limit to at least 50GB
to lock 100% of SHARED GLOBAL AREA (SGA) pages into physical memory
**********************************************************************
Oradism deallocated 6605 large pages of size 2097152 bytes.
SGA: Realm creation failed
بنابرین با افزایش مقدار memlock (soft) limit، از خطای فوق جلوگیری خواهد شد:
[root@RAC2 ~]# vi /etc/security/limits.conf
oracle soft memlock 52214400
oracle hard memlock 52214400
SQL> startup nomount force;
ORACLE instance started.
Total System Global Area 5.3687E+10 bytes
Fixed Size 30388144 bytes
Variable Size 6308233216 bytes
Database Buffers 4.7245E+10 bytes
Redo Buffers 103829504 bytes
SQL>
–alert log:
**********************************************************************
Per process system memlock (soft) limit = 53G
Expected per process system memlock (soft) limit to lock
instance MAX SHARED GLOBAL AREA (SGA) into memory: 50G
Supported system pagesize(s):
2021-03-30T14:35:24.158541+04:30
PAGESIZE AVAILABLE_PAGES EXPECTED_PAGES ALLOCATED_PAGES ERROR(s)
2021-03-30T14:35:24.158688+04:30
2048K 25602 25602 25602 NONE
**********************************************************************
همچنین اگر مقدار memlock (soft) limit و SGA را بیشتر از فضای ram در نظر بگیریم، instance استارت نخواهد شد:
[root@RAC2 ~]# free -g
total used free shared buff/cache available
Mem: 62 52 8 0 2 9
Swap: 17 0 17
[root@RAC2 ~]# vi /etc/security/limits.conf
oracle soft memlock 75214400
oracle hard memlock 75214400
SQL> alter system set sga_max_size=70g scope=spfile sid=‘instance2’ ;
System altered.
SQL> alter system set sga_target=70g scope=spfile sid=‘instance2’ ;
System altered.
SQL> startup nomount force;
ORA-27104: system-defined limits for shared memory was misconfigured
–alert log:
2021-03-30T14:40:10.354881+04:30
Starting ORACLE instance (normal) (OS id: 17671)
System cannot support SGA size of 70 GB.
Total system memory configured is 63 GB.
2021-03-30T14:40:10.551027+04:30
Instance maximum shared memory size should be less than 57 GB.
توجه: در صورت عدم تنظیم memlock (soft) limit، مقدار 64K برای آن در نظر گرفته خواهد شد:
Per process system memlock (soft) limit = 64K