תרשימי להבות (flame graphs)

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

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

יצירת תרשים להבות

כדי ליצור תרשים להבות (flame graph) מעץ, מבצעים את השלבים שמוצגים בדיאגרמה הבאה:

יצירת תרשים להמחשת שימוש במעבד.

  1. מסירים מהעץ את החצים שמציינים קריאות לפונקציות.

  2. מחליפים כל צומת בעץ במסגרת.

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

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

    פסאודו קוד של פונקציה זמן CPU עצמי
    (שניות)
    זמן כולל של CPU (יחידת עיבוד מרכזית)
    (בשניות)
    func main():
         foo1()
         foo2()
         // CPU intensive work
         // for 2 seconds 
    2 ‫4 + 3 + 2 = 9
    func foo1():
         bar()
         // CPU intensive work
         // for 1.5 seconds 
    ‫1.5 ‫2.5 + 1.5 = 4
    func foo2():
         bar()
         // CPU intensive work
         // for 0.5 seconds 
    ‫0.5 ‫2.5 + 0.5 = 3
    func bar():
         // CPU intensive work
         // for 2.5 seconds
    2.5 2.5

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

    אחרי שמסירים רווחים מיותרים וצובעים את הפריימים לפי זמן ה-CPU העצמי, תרשים הלהבות נראה כך:

    תמונה מפורטת של תרשים הלהבות.

    שימו לב שסטאק הביצוע של foo1 ו-foo2 נשמרו, למרות שסטאק הביצוע שמתחיל ב-foo2 נמצא עכשיו ליד הפריים של foo1.

סיכום

הדוגמה הפשוטה הזו ממחישה את הנקודות הבאות:

  • תרשימי להבה הם ייצוג קומפקטי של עץ, ואפשר ליצור מחדש סטאק ביצוע על ידי מעקב אחר מסגרות מלמעלה למטה.
  • השם של פריים הוא שם של פונקציה, והרוחב של הפריים הוא המידה היחסית של הזמן הכולל של הפונקציה ב-CPU. בדוגמה הזו, הזמן הכולל של המעבד foo2 הוא שליש מהזמן הכולל של המעבד main, ולכן רוחב הפריים של foo2 הוא שליש מרוחב הפריים של main.
  • הרוחב של השטח הריק מתחת לפריים הוא המידה היחסית של זמן השימוש במעבד (CPU) של הפונקציה שמופיעה בפריים. לדוגמה, מתחת למסגרת foo1, יש 1.5 יחידות ריקות ו-2.5 יחידות תפוסות על ידי bar. לכן, זמן ה-CPU העצמי של foo1 הוא 37.5% מזמן ה-CPU הכולל שלו, כלומר 1.5 שניות.
  • כשעוקבים אחרי מחסנית קריאות, רוחב המסגרות קטן כי זמן ה-CPU הכולל של הפונקציה שנקראת אף פעם לא יכול להיות גדול מזמן ה-CPU הכולל של הפונקציה שקוראת. ההתנהגות הזו היא מה שיוצר את הצורה של הלהבה.

    בדוגמה, foo1 calls bar וזמן ה-CPU הכולל של foo1 מוגדרים כזמן ה-CPU הכולל של bar בתוספת זמן ה-CPU של foo1. לכן, זמן המעבד הכולל של bar לא יכול להיות גדול מזמן המעבד הכולל של foo1.

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