בדף הזה מוסבר על שגיאות של חוסר זיכרון (OOM) במכונה וירטואלית של Compute Engine בשירות המנוהל ל-Apache Spark, ומוצגים שלבים לפתרון בעיות שקשורות לשגיאות OOM.
ההשפעות של שגיאות OOM
כשמכונות וירטואליות של Managed Service for Apache Spark נתקלות בשגיאות של חוסר זיכרון (OOM), ההשפעות כוללות את התנאים הבאים:
המכונות הווירטואליות של המאסטר והעובד קופאות למשך תקופה מסוימת.
שגיאות OOM במכונות וירטואליות ראשיות גורמות לכשלים בעבודות עם שגיאות מסוג 'המשימה לא נרכשה'.
שגיאות OOM במכונות וירטואליות של Worker גורמות לאובדן הצומת ב-YARN HDFS, מה שמעכב את הביצוע של עבודות Managed Service for Apache Spark.
אמצעי בקרה של זיכרון ב-YARN
Apache YARN מספק את הסוגים הבאים של אמצעי בקרה לזיכרון:
- על סמך סקרים (מדור קודם)
- מחמיר
- אלסטי
כברירת מחדל, Managed Service for Apache Spark לא מגדיר את yarn.nodemanager.resource.memory.enabled כדי להפעיל את אמצעי הבקרה של YARN לזיכרון, מהסיבות הבאות:
- שליטה קפדנית בזיכרון עלולה לגרום לסיום של קונטיינרים כשיש מספיק זיכרון, אם גודלי הקונטיינרים לא מוגדרים בצורה נכונה.
- הדרישות של ניהול זיכרון דינמי עלולות להשפיע לרעה על ביצוע המשימות.
- יכול להיות שאמצעי הבקרה של הזיכרון ב-YARN לא ימנעו שגיאות OOM כשמדובר בתהליכים שצורכים זיכרון באופן אגרסיבי.
הגנה על הזיכרון של Managed Service for Apache Spark
כשמכונה וירטואלית באשכול Managed Service for Apache Spark נמצאת במצב של עומס על הזיכרון, התכונה 'הגנה על הזיכרון' של Managed Service for Apache Spark מפסיקה תהליכים או קונטיינרים עד להסרת מצב ה-OOM.
Managed Service for Apache Spark מספק הגנה על הזיכרון לצמתי האשכול הבאים בגרסאות התמונות הבאות של Managed Service for Apache Spark:
| תפקיד | 1.5 | 2.0 | 2.1 | 2.2 |
|---|---|---|---|---|
| מכונה וירטואלית ראשית | 1.5.74+ | 2.0.48+ | all | all |
| Worker VM | לא זמין | 2.0.76+ | 2.1.24+ | all |
| Driver Pool VM | לא זמין | 2.0.76+ | 2.1.24+ | all |
זיהוי ואישור של סיום הגנת הזיכרון
המידע הבא יעזור לכם לזהות ולבדוק מקרים של סיום עבודות בגלל עומס על הזיכרון.
עיבוד סיום העסקה
תהליכים שמוגנים על ידי הזיכרון של Managed Service for Apache Spark מסתיימים עם קוד
137או143.כש-Managed Service for Apache Spark מסיים תהליך בגלל עומס על הזיכרון, יכולות להתרחש הפעולות או התנאים הבאים:
- ב-Managed Service for Apache Spark, הערך של
dataproc.googleapis.com/node/problem_countהמדד המצטבר גדל, והערך שלreasonמוגדר ל-ProcessKilledDueToMemoryPressure. מידע נוסף זמין במאמר בנושא איסוף מדדי משאבים ב-Managed Service for Apache Spark. - Managed Service for Apache Spark כותב
google.dataproc.oom-killerיומן עם ההודעה:"A process is killed due to memory pressure: process name. כדי לראות את ההודעות האלה, מפעילים את רישום היומן ומשתמשים במסנן היומן הבא:resource.type="cloud_dataproc_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.cluster_uuid="CLUSTER_UUID" jsonPayload.message:"A process is killed due to memory pressure:"
- ב-Managed Service for Apache Spark, הערך של
סגירת עבודות במאגר צמתים של צומת ראשי או צומת דרייבר
כשמשימה של מאגר צמתים ראשיים או מאגר צמתים של מנהל התקן ב-Managed Service for Apache Spark מסתיימת בגלל עומס על הזיכרון, המשימה נכשלת עם קוד השגיאה
Driver received SIGTERM/SIGKILL signal and exited with INT. כדי לראות את ההודעות האלה, מפעילים את רישום היומן ומשתמשים במסנן היומן הבא:resource.type="cloud_dataproc_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.cluster_uuid="CLUSTER_UUID" jsonPayload.message:"Driver received SIGTERM/SIGKILL signal and exited with"- בודקים את היומן
google.dataproc.oom-killerאו אתdataproc.googleapis.com/node/problem_countכדי לוודא ש-Managed Service for Apache Spark Memory Protection הפסיק את העבודה (ראו Process terminations).
פתרונות:
- אם לאשכול יש מאגר של מנהלי התקנים, צריך להגדיל את
driver-required-memory-mbלשימוש בפועל בזיכרון של העבודה. - אם לא מוגדר מאגר דרייברים באשכול, צריך ליצור מחדש את האשכול ולהקטין את המספר המקסימלי של עבודות מקבילות שמופעלות באשכול.
- משתמשים בסוג מכונה של צומת ראשי עם זיכרון מוגדל.
- בודקים את היומן
סגירת קונטיינרים של YARN בצומת עובד
Managed Service for Apache Spark כותב את ההודעה הבאה במנהל המשאבים של YARN:
container id exited with code EXIT_CODE. כדי לראות את ההודעות האלה, מפעילים את האפשרות Logging (רישום ביומן) ואז משתמשים במסנן היומן הבא:resource.type="cloud_dataproc_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.cluster_uuid="CLUSTER_UUID" jsonPayload.message:"container" AND "exited with code" AND "which potentially signifies memory pressure on NODE
אם קונטיינר יצא עם
code INT, צריך לבדוק את היומן שלgoogle.dataproc.oom-killerאו אתdataproc.googleapis.com/node/problem_countכדי לוודא ש-Managed Service for Apache Spark Memory Protection סיים את העבודה (ראו סיום תהליכים).פתרונות:
- בודקים שהגדרתם את גודלי מאגרי התגים בצורה נכונה.
- כדאי לשקול להקטין את
yarn.nodemanager.resource.memory-mb. המאפיין הזה קובע את נפח הזיכרון שמשמש לתזמון של קונטיינרים של YARN. - אם יש כשלים עקביים בקונטיינרים של המשימות, בודקים אם חלוקת נתונים לא מאוזנת גורמת לשימוש מוגבר בקונטיינרים ספציפיים. אם כן, צריך לחלק מחדש את העבודה או להגדיל את גודל העובד כדי להתאים לדרישות הזיכרון הנוספות.
שיפור ההגנה על הזיכרון ב-Linux בצומת הראשי (מתקדם)
בצמתים הראשיים של Managed Service for Apache Spark נעשה שימוש בכלי earlyoom כדי למנוע קריסות של המערכת על ידי שחרור זיכרון כשהזיכרון הזמין נמוך באופן קריטי. הגדרת ברירת המחדל מתאימה לעומסי עבודה רבים. עם זאת, יכול להיות שתצטרכו לשנות את ההגדרות אם לצומת הראשי יש כמות גדולה של זיכרון והוא צורך זיכרון במהירות.
בתרחישים עם עומס גבוה על הזיכרון, המערכת יכולה להיכנס למצב של 'החלפה', שבו היא מבלה את רוב הזמן בניהול הזיכרון והופכת ללא מגיבה. זה יכול לקרות כל כך מהר ש-earlyoom לא מצליח לפעול על סמך הגדרות ברירת המחדל שלו, או לא מצליח לפעול לפני הפעלת התגובה של OOM בקרנל.
לפני שמתחילים
- זוהי אפשרות מתקדמת להתאמה. לפני שמשנים את ההגדרות של
earlyoom, כדאי לתת עדיפות לפתרונות אחרים, כמו שימוש במכונה וירטואלית ראשית עם יותר זיכרון, צמצום של מספר המשימות שמופעלות בו-זמנית או אופטימיזציה של השימוש בזיכרון של המשימות.
התאמה אישית של ההגדרות של earlyoom
ההגדרה של earlyoom כברירת מחדל משתמשת בכמות קבועה של זיכרון פנוי כטריגר. במכונות וירטואליות עם כמות גדולה של זיכרון RAM, למשל 32GB או יותר, הכמות הקבועה הזו עשויה לייצג חלק קטן מכלל הזיכרון.
כך המערכת חשופה לעליות פתאומיות בשימוש בזיכרון.
כדי להתאים אישית את ההגדרות של earlyoom, מתחברים לצומת הראשי ומשנים את קובץ ההגדרות.
פותחים את קובץ ההגדרות לעריכה:
sudo nano /etc/default/earlyoomמשנים את סף הזיכרון המינימלי. מאתרים את השורה
EARLYOOM_ARGS. האפשרות-M <kbytes>מגדירה את הכמות המינימלית של זיכרון פנוי ב-KiB שהכליearlyoomמנסה לשמור. ערך ברירת המחדל הוא-M 65536, ששווה ל-64 MiB.אם יש לכם צומת ראשי עם זיכרון משמעותי, כדאי להגדיל את הערך הזה. לדוגמה, כדי להגדיר את ערך הסף ל-
1 GiB(1048576 KiB), משנים את השורה באופן הבא:EARLYOOM_ARGS="-r 15 -M 1048576 -s 1"הערות:
-
-r: מרווח הדיווח של הזיכרון בשניות -s: ערך הסף של שטח ההחלפה להפעלתearlyoom
-
מפעילים מחדש את השירות
earlyoomכדי להחיל את השינויים:sudo systemctl restart earlyoom