פייסבוק פרסמה תיקונים המשפרים את בקר הזיכרון של ה- Slab בלינוקס

רומנו גושצ'ין (מהנדס תוכנה בפייסבוק) רשם קבוצת תיקונים לאפליקציית הקצאת הזיכרון של מנהל ההתקן של ה-slab (בקר זיכרון) ברשימת התפוצה של פיתוח ליבת לינוקס.

הדרייבר החדש בולט בהעברת חשבונאות לוחות (slab accounting) מרמת דפי הזיכרון לרמת אובייקטי הליבה, מה שמאפשר שיתוף דפי לוחות (slab) בין קבוצות c שונות, במקום להקצות מטמוני לוחות נפרדים לכל קבוצת c.

רומן מצא את מה שהוא מכנה "פגם רציני מאוד" בבקר הזיכרון הקיים של לוחות, המוביל לניצול נמוך בימינו עם קבוצות.

"הסיבה האמיתית שהעיצוב הקיים מוביל לניצול נמוך של לוחות היא פשוטה: דפי לוחות משמשים אך ורק על ידי מאגר זיכרון.

אם יש רק מספר הקצאות בגודל מסוים שנעשו על ידי קבוצה, או אם נותרו כמה אובייקטים פעילים לאחר הסרת הקבוצה, או שהקבוצה מכילה יישום הברגה בודד שבקושי מקצה לעצמי גרעין כלשהם, אך בכל פעם מחדש מעבד חדש: בכל המקרים הללו, ניצול הלוחות המתקבל הוא נמוך מאוד.

אם חשבונאות kmem מושבתת, הליבה יכולה להשתמש בשטח פנוי בדפי לוח לצורך הקצאות אחרות. «

בקר הזיכרון Slab שהוצע על ידי רומנו גושצ'ין בשנה שעברה היה מבטיח למדי מכיוון שהוא מאפשר יעילות מוגברת בשימוש ב-Slab, מפחית את גודל הזיכרון המשמש עבור slab ב-30-45%, ומפחית משמעותית את צריכת הזיכרון הכוללת של הליבה.

יתר על כן, התיקונים המיושמים הצביעו על כך שפייסבוק כבר משתמשת בקוד בתהליך ייצור בשרתים שלה וחסכה כ-650-700MB+ עבור שרתי אינטרנט קדמיים , אחסון במטמון של מסדי נתונים ושרתי DNS, בין היתר.

להפחתת מספר הלוחות הלא-ניידים יש גם השפעה חיובית על פיצול הזיכרון. בקר הזיכרון החדש מפשט משמעותית את הקוד לצורך התחשבות בלוחות ומבטל את הצורך באלגוריתמים מורכבים ליצירה ומחיקה דינמית של מטמוני לוחות עבור כל קבוצת c.

כל קבוצות הזיכרון ליישום החדש משתמשות במערך נפוץ של מטמני לוח, ואורך החיים של מטמונים לוח אינו קשור עוד לתוחלת החיים של מגבלות הזיכרון שנקבעו באמצעות קבוצת קבוצות.

חשבונאות המשאבים המדויקת יותר המיושמת בבקר הלוח החדש אמורה לטעון יותר את המעבד, אך בפועל ההבדלים התבררו כזניחים.

בפרט, בקר הלוח החדש נמצא בשימוש במשך מספר חודשים בשרתי פייסבוק חיים המטפלים בסוגים שונים של עומסים, ועד כה לא זוהו רגרסיות משמעותיות.

התיקון מכיל כמה חלקים עצמאיים למחצה, אשר יכולים למצוא את השימוש בהם גם מחוץ לבקר הזיכרון של הלוח:

  • ממשק ה- API של Subpage Load, שניתן להשתמש בו בעתיד לספירת אובייקטים אחרים שאינם בגודל של דף, למשל הקצאות percpu
  • ניתן לעשות שימוש חוזר בממשק ה- API של mem_cgroup_ptr, שבו מצביעים נספרים ל- memcg, לצורך השבה יעילה של אובייקטים אחרים, למשל מטמון דף.

במקביל, יש ירידה משמעותית בצריכת הזיכרון : בחלק מהמארחים ניתן היה לחסוך עד 1 ג'יגה-בייט של זיכרון, אך אינדיקטור זה תלוי במידה רבה באופי העומס, בגודל הכולל של זיכרון ה-RAM, בכמות המעבד ובמאפייני העבודה עם הזיכרון.

במקום ליצור קבוצה נפרדת של kmem_caches לכל קבוצת זיכרון, משתמשים בשתי קבוצות גלובליות: מערך השורש עבור מטלות שאינן מסופקות והקצאות קבוצת השורשים של קבוצת השורש והמערכה השנייה לכל שאר המטלות. זה מאפשר לפשט את ניהול החיים של kmem_caches בודדים.

לבסוף, אם אתם מעוניינים ללמוד על קבוצת 19 התיקונים החדשה, תוכלו למצוא אותה ברשימת התפוצה של הליבה.


הוסף כמקור מועדף בגוגל