בדף זה מתואר איך לבדוק את שיעור ההיטים של המטמון ואיך לחקור את פעולות חסרות מטמון בהקשר של ביצוע מרחוק.
הדף הזה מניח שיש לך build ו/או בדיקה שמנצלות בהצלחה ביצוע מרחוק, וברצונך לוודא שאתה משתמש ביעילות במטמון מרוחק.
בדיקת שיעור ההיטים של המטמון
בפלט הרגיל של הרצת Bazel, יש לעייןINFO
קו המפרט
תהליכים, שזה פחות או יותר תואם לפעולות של Bazel. את הקו הזה
שבו הפעולה בוצעה. חפשו את התווית remote
, המציינת פעולה שבוצעה מרחוק, linux-sandbox
את הפעולות שבוצעו בארגז חול מקומי
וערכים אחרים עבור שיטות ביצוע אחרות. פעולה שהתוצאה שלה הגיעה
ממטמון מרוחק מוצגת כ-remote cache hit
.
למשל:
INFO: 11 processes: 6 remote cache hit, 3 internal, 2 remote.
בדוגמה הזו היו 6 היטים של מטמון מרחוק, ושתי פעולות לא כללו מטמון
ופעולות שבוצעו מרחוק. ניתן להתעלם מהחלק הפנימי של 3.
בדרך כלל מדובר בפעולות פנימיות קטנטנות, כגון יצירת קישורים סימבוליים. היטים
מקומיים של המטמון לא נכללים בסיכום הזה. אם מתקבלים 0 תהליכים
(או מספר הנמוך מהצפוי), יש להריץ את bazel clean
ואחריו את פקודת ה-build/test.
פתרון בעיות הקשורות להיטים במטמון
אם לא מתקבל שיעור ההיט הצפוי, אתם יכולים לבצע את הפעולות הבאות:
יש לוודא שהרצה מחדש של אותה פקודת Build/בדיקה יוצרת היטים של מטמון
מריצים את גרסאות ה-build ו/או הבדיקות שרוצים לאכלס את המטמון. בפעם הראשונה שבה בונים גרסת build חדשה בערימה מסוימת, לא ניתן לצפות להיטים מרוחקים של המטמון. כחלק מהביצוע מרחוק, תוצאות הפעולה מאוחסנות במטמון והרצה הבאה צריכה לאסוף אותן.
מקצה
bazel clean
. פקודה זו מנקה את המטמון המקומי שלך, שמאפשרת לחקור התאמות למטמון מרוחק בלי להסתיר את התוצאות של מטמון מקומי.מריצים את גרסת ה-build ואת הבדיקה שאותה בודקים שוב (באותו המכונה).
יש לבדוק את השורה
INFO
של שיעור ההיטים של המטמון. אם לא מופיעים תהליכים מלבדremote cache hit
ו-internal
, פירוש הדבר שהמטמון שלך מאוכלס כראוי והוא ניגש אליו. במקרה כזה, דלגו לקטע הבא.מקור סביר של אי-התאמה הוא משהו שאינו מהותי בפרויקט, מה שגורם לפעולות לקבל מפתחות פעולה שונים בשתי ההפעלות. כדי למצוא את הפעולות האלה:
א. מריצים מחדש את גרסאות ה-build או הבדיקות הרלוונטיים כדי לקבל את יומני הביצועים:
bazel clean
bazel --optional-flags build //your:target --execution_log_binary_file=/tmp/exec1.log
ב. יש להשוות בין יומני הביצוע בין שתי ההפעלות. מוודאים שהפעולות זהות בשני קובצי היומן. אי-התאמות מספקות מושג לגבי השינויים שהתרחשו בין הפעלות. יש לעדכן את ה-build כדי לבטל את הפערים האלה.
אם הצלחתם לפתור את בעיות השמירה במטמון ועכשיו ההפעלה החוזרת מפיקה את כל ההיטים במטמון, אפשר לדלג לקטע הבא.
אם מזהי הפעולות שלך זהים אבל אין היטים של מטמון, כנראה שמשהו בתצורה שלך מונע שמירה במטמון. המשיכו בקטע הזה כדי לבדוק אם יש בעיות נפוצות.
אם אין לך צורך להשוות יומני ביצוע, אפשר להשתמש בסימון
--execution_log_json_file
הקריא אנושי. אי אפשר להשתמש בה לצורך דיפציה יציבה כי היא כוללת זמן הפעלה ואינה מבטיחה הזמנה.יש לבדוק שכל הפעולות ביומן הביצוע מופיעות כ-
cacheable
כ-True. אםcacheable
לא מופיע ביומן הביצוע של פעולת אישור, פירוש הדבר הוא שהכלל התואם עשוי להכיל תגno-cache
בהגדרה שלו בקובץBUILD
הנתונים. כדי לראות מאיפה הפעולה מגיעות, אפשר לבדוק את השדהprogress_message
הקריא לבני אדם.אם הפעולות זהות ו-
cacheable
אין התאמות למטמון, ייתכן ששורת הפקודה כוללת--noremote_accept_cached
. הפעולה הזו תשבית את חיפושי המטמון במטמון ב-build.אם קשה להבין את שורת הפקודה בפועל, השתמשו בשורת הפקודה הקנונית מ- Build לפרוטוקול אירוע כך:
א. יש להוסיף את
--build_event_text_file=/tmp/bep.txt
לפקודת Bazel כדי לקבל את גרסת הטקסט של היומן.ב. יש לפתוח את גרסת הטקסט של היומן ולחפש את ההודעה
structured_command_line
במכשיר שלcommand_line_label: "canonical"
. תוצג בה כל האפשרויות אחרי ההרחבה.ג. יש לחפש את
remote_accept_cached
ולבדוק אם הוא מוגדרfalse
.ד. אם הערך של
remote_accept_cached
הואfalse
, יש לקבוע היכן הוא מוגדר ל-false
: בשורת הפקודה או בקובץ bazelrc.
שמירה במטמון של מכשירים שונים
אחרי שהיטים של מטמון מתרחשים כמצופה באותו מחשב, מריצים את אותם מבנים/בדיקות במכשיר אחר. אם אתם חושדים ששמירה במטמון לא מתרחשת בכמה מחשבים, אתם יכולים:
מבצעים שינוי קטן ב-build כדי להימנע מפגיעה במטמון הקיים.
הפעלת ה-build במכונה הראשונה:
bazel clean
bazel ... build ... --execution_log_binary_file=/tmp/exec1.log
מריצים את ה-build במכונה השנייה, כדי לוודא שהשינוי משלב 1 כולל:
bazel clean
bazel ... build ... --execution_log_binary_file=/tmp/exec2.log
משווים בין יומני הביצוע של שתי ההפעלה. אם היומנים לא זהים, יש לבדוק את הגדרות ה-build של אי-ההתאמות וגם את המאפיינים מסביבת המארח להדלפה של אחד מה-builds.
השוואת יומני הביצוע
יומני ביצוע מכילים רשומות של כל הפעולות שבוצעו במהלך ה-build. לכל פעולה יש רכיב SpawnExec שמכיל את כל המידע ממפתח הפעולות, ולכן אם היומנים זהים, כך המטמון עם מפתחות.
כדי להשוות בין יומנים של שתי גרסאות build שלא שיתפו היטים שהתקבלו במטמון, יש לבצע את הפעולות הבאות:
קבלת יומני הביצוע מכל build ואחסון שלהם כ-
/tmp/exec1.log
ו-/tmp/exec2.log
.מורידים את קוד המקור של Bazel ומנווטים לתיקייה Bazel באמצעות הפקודה הבאה. יש צורך בקוד המקור כדי לנתח את יומני הביצועים באמצעות מנתח הניתוח.
git clone https://github.com/bazelbuild/bazel.git cd bazel
בעזרת הכלי לניתוח יומני ביצוע אפשר להמיר את היומנים לטקסט. ההפעלה הבאה גם ממיינת את הפעולות ביומן השני כך שיתאימו לסדר הפעולות ביומן הראשון, כדי שיהיה קל להשוות.
bazel build src/tools/execlog:parser bazel-bin/src/tools/execlog/parser \ --log_path=/tmp/exec1.log \ --log_path=/tmp/exec2.log \ --output_path=/tmp/exec1.log.txt \ --output_path=/tmp/exec2.log.txt
יש להשתמש בטקסט המועדף כדי להבדיל בין
/tmp/exec1.log.txt
לבין/tmp/exec2.log.txt
.