وقتی که یک پروسس میخواهد از memory استفاده کند ، CPU یک تکه از RAM را به آن اختصاص میدهد. در واقع CPU به اندازه یک 4k bytes ) chunk ) حافظه را به پروسس اختصاص میدهد. هر یک از اون chunkها یک page نامیده میشوند.
از اونجایی که آدرس فضایی که به یک پروسس اختصاص داده میشود ( همان pageها ) به صورت virtual است ، CPU و OS مجبور هستند که به خاطر بسپارند که هر page به چه process اختصاص دارد و در کجا ذخیره شده است.
اگر تعداد pageها زیاد باشد ، این موضوع زمان زیادی میبرد و همچنین فضای زیادی اشغال میشود.
فرض کنید یک پروسس به 1G از ram نیاز دارد. اگر این 1G را بر اون 4K تقسیم کنیم ، باید در page table به اندازه 262144 ، entry وارد شود (1GB/4K) . اگر فرض کنید هر entry در Page Table حدود 8bytes فضا مصرف میکند کل فضایی که فقط برایی ذخیره آدرس فیزیکی مصرف شده است (2MB(262144*8 است. که وقتی تعداد پروسس ها زیاد شود هم فضای زیادی اشغال میشود هم جستجو در این page table سخت تر میشود.
در حال حاضر در معماری CPUهای جدید ، Pageها میتوانند اندازه بزرگتری داشته باشند.
نکته 1 ) اگر hardware شما پشتیبانی کند سایز Huge Page حداکثر میتواند 1G باشد.
اگر شما یک سیستم دارید که ram آن بیشتر از 16G است و کل فضایی که به SGA اختصاص یافته است بیشتر از 8G است، برای رسیدن به performance بالاتر، بهتر است که از HugePages استفاده کنید.
نکته 2 ) اگر شما ویژگی Automatic Memory Management را که از اوراکل 11g به بعد آمده است enable کرده اید، نمیتوانید از HugePages استفاده کنید.
مزایای استفاده از HugePageها :
- تعداد کل pageهایی قرار است توسط kernel مدیریت شوند ، کاهش می یابد.
- فضای کمتری در memory به page table اختصاص می یابد.
پیکربندی HugePages برای دیتابیس های اوراکل
1- مطمئن باشید که مقدار متغیرهای زیر در etc/security/limits.conf/ به کمتر از ram ست شده باشد. مثلا اگر RAM ماشین شما 64G است بهتر است مقدار این متغیرها به صورت زیر باشد.
* soft memlock 60397977
* hard memlock 60397977
2- به oracle user وصل شوید و با استفاده از command زیر مقدار متغیر memlock را چک کنید ، تا مطمئن شوید تغییر بالا اعمال شده است.
$ ulimit -l
60397977
3- پارامترهای memory_target و memory_max_target را به 0 ست کنید.
SQL> alter system set memory_target=0;
System altered.
SQL> alter system set memory_max_target=0;
System altered.
4- مطمئن شوید که همه db instance , asm instanceها up باشند.
5- اسکریپتی با نام hugepages_settings.sh با محتوای زیر ایجاد کنید.
6- Permission مربوط به این فایل را تغییر دهید.
$ chmod u+x hugepages_settings.sh
7- اسکریپتی را که در بالا ایجاد کرده بودید اجرا کنید.
$ ./hugepages_settings.sh
.
Recommended setting: vm.nr_hugepages = 22960
8- با root وصل شوید و در فایل etc/sysctl.conf/ مقدار پارامتر vm.nr_hugepages را به مقدار پیشنهاد شده در بالا ست کنید.
vm.nr_hugepages = 22960
نکته 3 ) برای oracle linux 6.5 بهتر است که پارامتر زیر را هم به این فایل (etc/sysctl.conf/) اضافه کنید.
get the ID of the dba group : # fgrep dba /etc/group
vm.hugetlb_shm_group = 54322
9- در oracle_base یه جایی نوشته شده که از ورژن 11.2.0.2 به بعد ، اگر میخواهید force کنید که instance از hugepage استفاده کند ، پارامتر زیر را تنظیم کنید . ( این پارامتر داینامیک نیست )
ALTER SYSTEM SET use_large_pages=only SCOPE=SPFILE sid='*';
10- همه نودها را ریبوت کنید.
11- بعد از بالا آمدن سیستم ها چک کنید که تغییرات اعمال شده باشد.
# grep ^Huge /proc/meminfo
HugePages_Total: 22960
HugePages_Free: 2056
HugePages_Rsvd: 2016
HugePages_Surp: 0
Hugepagesize: 2048 kB
نکته 4 ) در oracle_base به یک feature به نام Transparent HugePage اشاره شده . این feature به صورت پیش فرض enable است و گفته شده که باعث میشه memory_management بهتر انجام شود. ولی گفته که این feature در دیتابیس های اوراکل و RAC کارایی خوبی نداره و باعث میشه که performance پایین بیاد و بهتره که این feature را disable کنید.
برای disable کردن این پارامتر در Oracle Linux6 باید به فایل "/boot/grub/grub.conf/" مقدار زیر را اضافه کنید.
transparent_hugepage=never
n منابع
https://docs.oracle.com/cd/E37670_01/E37355/html/ol_about_hugepages.html
http://docs.oracle.com/cd/E11882_01/server.112/e10839/appi_vlm.htm#UNXAR396
https://wiki.debian.org/Hugepages
https://oracle-base.com/articles/linux/configuring-huge-pages-for-oracle-on-linux-64