לאחרונה נוכחתי בהרצאתו של אמיר סלע, בכנס OpenIsrael 2011. המצגת דיברה על חידושים ב-RHEL6, ביניהם
הוספה של Patch אשר הוסיף תמיכה ב-Transparent HugePages ל-RHEL6.
קצת רקע: כברירת מחדל, הקרנל מנהל את הזכרון בבלוקים של 4K. כלומר, בקשה של 4M של זכרון תגרום לקרנל להקצות 1024 דפי זכרון.
מנגנון ה-HugePages מאפשר ניהול של בלוקים של 2M בזכרון, ונועד לאפשר ניהול יעיל יותר והקצאה מהירה יותר של זכרון עבור פרוססים שדורשים הרבה זכרון (עוד על כך בהמשך)
בקרנלים ישנים יותר\גרסאות ישנות יותר של RHEL, היה צורך להגדיר מראש את כמות ה-HugePages שנקצה. התוספת (שתופסת) ל-RHEL6 מאפשר הקצאה אוטומית של HugePages כאשר פרוסס מבקש כמות גדולה של זכרון.
לנושא הפוסט. צרכן קלאסי, ואחד שיצא לי "לנהל", של זכרון הוא Oracle. החל מ-Oracle 9 ומעלה, המערכת תדע לבקש אוטומאטית HugePages בהינתן כמה דרישות קדם שיסופקו. היתרון הוא כמובן ניהול טוב יותר של הזכרון, הקצאה מהירה יותר ושיפור ביצועים כללי.
אז כדי לאפשר שימוש ב-HugePages ב-RHEL4, נתחיל בקביעת כמות הזיכרון שנרצה להקצות כ-HugePages. ההקצאה תעשה בד"כ לפי גודל ה-SGA. למשל, במערכת שה-SGA שלה הוא 4G, נצטרך להקצות 2048 בלוקים של HugePages (שהם 2M*2048 = 4G).
ההקצאה נעשית בעזרת כתיבת הערך הרצוי לתוך /proc/sys/vm/nr_hugepages.
# echo 2048 > /proc/sys/vm/nr_hugepages
אפשרות שניה היא שימוש ב-sysctl, ע"י הוספת השורה
vm.nr_hugepages = 2048
לקובץ /etc/sysctl.conf, והרצת הפקודה "sysctl -p". את התוצאה ניתן לראות בפלט של הפקודה
# cat /proc/meminfo | grep HugePages
HugePages_Total: 2048
HugePages_Free: 0
חשוב לציין כמה עובדות:
א. הזכרון שמוקצה נלקח מהמערכת הפעילה ויראה כזכרון שבשימוש, אפילו אם אף אפליקציה לא תשתמש בו
ב. במידה וביקשתם 2048 בלוקים, ואין מספיק פנויים במערכת, יוקצו רק כמות הבלוקים האפשרית. במקרה כזה קרוב לודאי שיהיה צורך לאתחל את המערכת או להוריד תהליכים אשר משתמשים בזכרון, ולנסות שוב.
דרישת קדם נוספת היא מתן הרשאה ל-oracle לנעול כמות זהה לזכרון ה-SGA ב-RAM. יש להכניס את השורות הבאות לקובץ /etc/security/limits.conf
oracle soft memlock 4194304
oracle hard memlock 4194304
כאשר הערך המספרי הוא ב-K, ובמקרה הזה הוא 2 * 2048 * 1024 (מגה * בלוקים * 1024).
אחרי העלאה של Oracle, ניתן לוודא שאכן הוא משתמש ב-HugePages:
# cat /proc/meminfo | grep HugePages
HugePages_Total: 2048
HugePages_Free: 2048
הניתן לראות כי כל הזכרון בשימוש. בבדיקה של הזכרון שבשימוש ע"י Oracle, למשל דרך ps, ניתן יהיה לראות כי Oracle הקצה את כל גודל ה-SGA
לסיכום, מומלץ להשתמש ב-HugePages, לא משנה באיזה גרסאת קרנל\RHEL אתם משתמשים.
נקודה אחת לתשומת לב היא שיש צורך להגדיל את כמות ה-HugePages ולשנות את limits.conf אם רוצים להגדיל או להקטין את ה-SGA.