בדף הזה מוסבר על שגיאות של חוסר זיכרון (OOM) במכונה וירטואלית של Compute Engine ב-Managed Service for 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 |
|---|---|---|---|---|
| Master VM | 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 הפסיק את העבודה (ראו הפסקת תהליכים).
פתרונות:
- אם לאשכול יש מאגר של מנהלי התקנים, צריך להגדיל את הערך של
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