שיפור הביצועים של אפליקציות MPI שמשתמשות ב-PSM3

בדף הזה מפורטים פרמטרים להגדרת PSM3 שאנחנו ממליצים להשתמש בהם עם אפליקציות MPI שפועלות במכונות וירטואליות מסוג H4D ב-Compute וב-Cloud RDMA.

מידע על כל פרמטרי ההגדרה הזמינים של PSM3 זמין במדריך למשתמש של Intel Ethernet Fabric Suite Host Software.

המלצות לאפליקציות עם זרימות נתונים לא יציבות או תנועה כבדה של נתוני שימוש

אפליקציות שחווות פרצי תנועה פתאומיים או שמסתמכות במידה רבה על מצב Unreliable Datagram (UD)‎ עלולות להציף את ממשק הרשת, מה שמוביל להשמטת מנות נתונים במקור.

  • פתרון: צריך להגדיר את מערכת הלחץ החוזר מבוסס-הקרדיט כדי לווסת את פרצי השידור ולמנוע אובדן מנות בשכבת התעבורה. מכונת H4D ב-Compute Engine מספקת 256 קרדיטים בסך הכול. מומלץ להקצות לכל vCPU לפחות קרדיט קבוע אחד, ולהוסיף את הקיבולת שנותרה למאגר משותף.
  • הגדרה מומלצת (דוגמה ל-192 דרגות לכל צומת): לפעולה עם 192 דרגות לכל צומת, אם כל vCPU מקבל קרדיט קבוע אחד, המאגר המשותף יהיה 256 – 192 = 64.

    IRDMA_SHARED_UD_CREDITS=64
    IRDMA_TRANSPARENT_UD_QD_OVERRIDE=1
    

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

אלה משתני הסביבה שבהם אפשר להשתמש כדי לשפר את הביצועים של Cloud RDMA:

  • IRDMA_SHARED_UD_CREDITS: מציין את הגודל של מאגר גלובלי של נקודות זכות לשימוש ב-UD שזמינות לכל התהליכים בצומת יחיד. אם הערך הוא 64, המשמעות היא שיש מכסת קרדיטים משותפת של 64 קרדיטים שכל תהליך יכול להשתמש בהם.
  • IRDMA_TRANSPARENT_UD_QD_OVERRIDE: מגביל את עומק התור לזוגות תורים (QPs) שמשתמשים ב-UD במנהל ההתקן irdma. כשהערך מוגדר ל-1, הוא פועל עם IRDMA_SHARED_UD_CREDITS כדי לאכוף לחץ חוזר בשכבת התעבורה ולמנוע הצפה של תור השידור בעומסים כבדים של ריבוי תהליכים.

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

כדי להבטיח את המהימנות של מנות UD בצד המקבל, אפליקציות ה-RDMA צריכות להקצות מספיק מאגרי קבלה ולשמור על משבצות פנויות בתור השלמת הפעולות (CQ).

  • המלצה רגילה לרמת מהימנות גבוהה: כדי למנוע השמטה של מנות UD בתור לקבלה (RX), מומלץ להשתמש במשתני הסביבה הבאים כדי לציין עומקים גבוהים יותר של תורים.

    PSM3_NUM_RECV_WQES=32767
    PSM3_NUM_RECV_CQES=65536
    
  • חריג לדרישות גבוהות של זיכרון: אם האפליקציה שלכם נתקלת בבעיות של חוסר זיכרון (OOM), צריך להקטין את גודל התור, אבל לשמור על אותו יחס בין שני הערכים.

    לאפליקציות כמו High Performance Conjugate Gradients (HPCG) יש דרישות זיכרון עצומות. שימוש בהגדרות של ההמלצה הרגילה לאמינות גבוהה עלול לגרום לשגיאות OOM. ‫PSM3_NUM_RECV_WQES קובע את מספר הרשומות בתור העבודה של RX (WQEs) ואת מאגרי הזיכרון המוקצים לכל נקודת קצה מקומית. ערכים גבוהים יותר מובילים לתקורה גדולה יותר של זיכרון.

אלה משתני הסביבה שבהם אפשר להשתמש כדי לשפר את המהימנות או את השימוש בזיכרון:

  • PSM3_NUM_RECV_WQES: מגדיר את מספר ה-WQEs של RX להקצאה. גודל התור להודעות לא מובטחות (UD QP) הוא PSM3_NUM_RECV_WQES + 1032 WQEs. הפרמטר הזה מגדיר גם את מספר מאגרי הזיכרון של ה-UD לקבלת הודעות חוזרות (כל אחד בגודל PSM3_MTU) שמוקצים לכל נקודת קצה מקומית.

  • PSM3_NUM_RECV_CQES: שולט במספר הרשומות בתור להשלמת פעולות (CQE) לקבלת פעולות. הפרמטר הזה עוזר להבטיח את המהימנות של חבילות UD בצד המקלט, כי הוא מוודא שתמיד יש משבצות זמינות בתור לסיום. עומק תור גבוה יותר, למשל 65536, עוזר למנוע השמטה של מנות RX UD, אבל הוא משתמש בזיכרון ועלול לגרום לשגיאות OOM באפליקציות שצורכות הרבה זיכרון.

המלצות לאפליקציות שלא עושות שימוש חוזר במאגרי נתונים

חלק מהאפליקציות, כמו High-performance LINPACK ‏ (HPL), מקצות ומפנות מאגרי תקשורת זמניים בתדירות גבוהה במקום לשמור אותם ולעשות בהם שימוש חוזר. המחזור המתמשך הזה של בקשת זיכרון ושחרורו גורם למערכת לרשום ולבטל רישום של דפי זיכרון כל הזמן, ויוצר צוואר בקבוק משמעותי בביצועים.

  • פתרון: אפשר להשתמש במקצה זיכרון מותאם אישית כמו jemalloc כפתרון עקיף. ‫jemalloc הוא מקצה זיכרון (malloc) לשימוש כללי עם ביצועים גבוהים, שנועד להדגיש את הרחבת הקיבולת של פעולות מקבילות ולמנוע פיצול זיכרון. הפתרון הזה מאלץ מיחזור יעיל של מאגרי תקשורת גדולים (גדולים מ-128 KB), וכך עוקף מחזורי הקצאה מחדש יקרים של ליבת המערכת ומשחזר את הביצועים של PSM3.

  • הגדרה מומלצת:

    1. מתקינים את jemalloc. לדוגמה, ב-Rocky Linux אפשר להריץ את הפקודות הבאות שמשתמשות במאגר החבילות הנוספות ל-Enterprise Linux‏ (EPEL):

      sudo dnf install epel-release
      sudo dnf install jemalloc
      
    2. טוענים מראש את jemalloc ומגדירים מגבלות אופטימליות של מטמון לפני שמריצים את האפליקציה:

      LD_PRELOAD="/usr/lib64/libjemalloc.so.2"
      export MALLOC_CONF="dirty_decay_ms:-1,muzzy_decay_ms:-1,lg_tcache_max:26"
      

פקודת ההגדרה משתמשת בהגדרות הבאות:

  • LD_PRELOAD: מציין את הספריות המשותפות לטעינה לפני הפעלת תהליך.
  • MALLOC_CONF: מגדיר את אופן הקצאת הזיכרון עבור jemalloc.
  • dirty_decay_ms:-1 ו-muzzy_decay_ms:-1: ההוראה ל-jemalloc היא לא להחזיר אף פעם זיכרון לא בשימוש למערכת ההפעלה. כך הדפים נשמרים באופן קבוע ומוכנים לשימוש חוזר מיידי.
  • lg_tcache_max:26: מגדיל את מגבלת המטמון של הזיכרון לכל שרשור ל-64 MB, כדי להבטיח שהמאגרי תקשורת הגדולים יישמרו במטמון באופן אגרסיבי.

המאמרים הבאים