איסוף עקבות וצפייה בהם

בדף הזה מפורטות ההוראות לאיסוף עקבות של Perfetto לשימוש עם Wattson ולניתוח נתוני ההספק שמתקבלים בממשק המשתמש של Perfetto.

יש הרבה דרכים לאסוף נתוני מעקב ב-Perfetto, אבל בדף הזה מפורטות השיטות שכוללות את הדרישות ותהליכי העבודה הספציפיים ליצירת נתוני מעקב שתואמים ל-Wattson.

דרישות מינימליות לבנייה

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

מכשיר דרישת מינימום לבנייה: הערכת מעבד דרישת מינימום לבנייה: הערכת GPU
Pixel Watch 2 אין דרישה מינימלית לגבי הגרסה לא נתמך
Pixel Watch 3 25Q2 לא נתמך
Pixel 6 אין דרישה מינימלית לגבי הגרסה 25Q2
Pixel 9 25Q2 לא נתמך
Pixel 10 25Q2 לא נתמך
Galaxy XR (SXR2230P) אין דרישה מינימלית לגבי הגרסה לא נתמך

איסוף נתוני מעקב של Perfetto משורת הפקודה

בקטע הזה מוצגת דוגמה לתהליך עבודה לאיסוף עקבות של Perfetto לשימוש עם Wattson. כל הפקודות שמפורטות בשלבים הבאים מיועדות להפעלה מהמארח של Android Debug Bridge ‏ (adb).

  1. כדי להגדיר ולהתחיל את התיעוד, צריך ליצור קובץ הגדרה של Perfetto במכשיר. דוגמה להגדרה אפשר למצוא בכתובת wattson.cfg בעץ המקור.

    ההגדרה המינימלית צריכה לכלול את אירועי המעקב הבאים:

    # Polls CPU freq/idle state at the start of trace
    data_sources: {
       config {
          name: "linux.sys_stats"
          sys_stats_config {
             # Large period so polling doesn't happen continuously
             # Intent is just to poll once upfront
             cpufreq_period_ms: 100000000
             cpuidle_period_ms: 100000000
          }
       }
    }
    data_sources: {
       config {
          name: "linux.ftrace"
          ftrace_config {
             ftrace_events: "devfreq/devfreq_frequency"
             ftrace_events: "cpuhp/cpuhp_enter"
             ftrace_events: "cpuhp/cpuhp_exit"
             ftrace_events: "cpuhp/cpuhp_multi_enter"
             ftrace_events: "power/cpu_frequency"
             ftrace_events: "power/cpu_idle"
             ftrace_events: "power/suspend_resume"
          }
       }
    }
    
  2. כדי להפעיל את האומדנים של צריכת האנרגיה של מטמון L3, מפעילים את האירוע fttrace/print:

    adb shell perfetto --txt -c /data/misc/perfetto-configs/wattson.cfg --background-wait -o /data/misc/perfetto-traces/trace
    
    # Optional
    adb shell simpleperf stat -a -e arm_dsu_0/l3d_cache/,arm_dsu_0/bus_access/ --interval 10
    
  3. (אופציונלי) מגדירים את ההתחלה של חלון Wattson, סמן שמוטמע ב-Perfetto trace ומציין את תחילת ההקלטה. הסמן הזה מוסיף דיוק למדידה של וואטסון.

    # Optional
    adb shell "echo 'I|0|wattson_start' >/sys/kernel/tracing/trace_marker"
    
  4. מריצים את עומס העבודה הרצוי.

  5. (אופציונלי) מפעילים את ftrace/print trace event to set the end of the Wattson window:

    # Optional
    adb shell "echo 'I|0|wattson_stop' >/sys/kernel/tracing/trace_marker"
    
  6. מרוקנים את מאגרי הנתונים של פרטי ההעברה ומורידים את קובץ פרטי ההעברה של Perfetto:

    adb shell killall -w perfetto
    adb pull /data/misc/perfetto-traces/trace my_perfetto_trace.pb
    

איסוף נתוני מעקב של Perfetto באמצעות ממשק המשתמש של Perfetto

כדי לאסוף נתוני מעקב באמצעות ממשק המשתמש של Perfetto, צריך להפעיל הגדרות ספציפיות ב-Wattson. כשמקליטים טרייס חדש בממשק המשתמש של Perfetto, מפעילים את המתגים Scheduling details (פרטי התזמון) ו-CPU frequency and idle states (תדירות המעבד ומצבי חוסר פעילות):

פרטי התזמון ומתגים של תדירות המעבד ומצבי חוסר פעילות

איור 1. פרטי התזמון ומתגים של תדירות המעבד ומצבי חוסר פעילות.

במכשירי Pixel 9, בהגדרות Ftrace, מסמנים את תיבת הסימון devfreq כדי להפעיל את איסוף התדרים של המכשיר:

הפעלת תדירות המכשיר

איור 2. הפעלת תדירות המכשיר.

צפייה בפירוט של כל מסילה

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

כדי ליצור אינטראקציה עם Wattson ב-Perfetto:

  1. פותחים מעקב ב-Perfetto.

    אם המכשיר נתמך על ידי Wattson, העקבות של Wattson מופיעים אוטומטית:

    הצגת נתוני מעקב של Wattson ב-Perfetto

    איור 3. הצגת נתוני מעקב של Wattson ב-Perfetto.

  2. לוחצים על Wattson כדי להרחיב את התצוגה ולראות את הפירוט של כל מסילה וירטואלית:

    • כל הגרפים של המסילות מותאמים אוטומטית לאותו ערך כדי להציג את היחס בין המסילות.

    • הנתונים הסטטיסטיים נוצרים עבור כל אזור שהמשתמש בוחר (או מסמן).

    • כדי למיין את טבלת הנתונים הסטטיסטיים, לוחצים על שם של עמודה.

    • הסכומים המשוערים מוצגים ישירות מתחת לכותרות העמודות.

    אומדנים לגבי נסיעות ברכבת

    איור 4. הערכות לגבי רכבות.

צפייה ב-Trace לפי שרשור, תהליך או שיוך חבילה

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

  1. ב-Perfetto, בוחרים אזור של פרוסות שרשור.
  2. אפשר לראות את הפירוט של השרשור, התהליך או החבילה.

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

ניתוח פירוט ברמת השרשור

בנוסף לדרישות המינימליות להערכת צריכת חשמל בסיסית, צריך להוסיף את ההגדרה הבאה לקטע linux.ftrace ב-wattson.cfg כדי להגדיר שיוך של צריכת חשמל ברמת השרשור:

data_sources: {
    config {
        name: "linux.ftrace"
        ftrace_config {
            ftrace_events: "sched/sched_switch"
        }
    }
}

פירוטים ברמת השרשור

איור 5. פירוטים ברמת השרשור.

פירוט ברמת התהליך

כדי להשתמש בשיוך ברמת התהליך, צריך להפעיל את process_states בנתונים שנאספו ב-Perfetto trace. מפעילים את מקור הנתונים הבא בקובץ ההגדרות wattson.cfg:

data_sources: {
    config {
        name: "linux.process_stats"
        target_buffer: 1
        process_stats_config {
            scan_all_processes_on_start: true
        }
    }
}

לפי פירוט התהליך

איור 6. לפי פירוט התהליך.

פירוט ברמת החבילה

כדי להשתמש בשיוך ברמת החבילה, צריך להפעיל את האפשרות android.packages_list בנתונים שנאספים במעקב Perfetto. מפעילים את מקור הנתונים הבא בקובץ ההגדרות wattson.cfg:

data_sources {
  config {
    name: "android.packages_list"
    target_buffer: 1
  }
}

בדומה לשיוך ברמת ה-thread וברמת התהליך, כשבוחרים טווח של פרוסות thread, צריך לבדוק את הפירוט ברמת החבילה.

פירוט ברמת השרשור

איור 7. פירוט ברמת השרשור.

אומדן צריכת החשמל של ה-GPU

הערכת עוצמת המעבד הגרפי נתמכת ב-Pixel 6,‏ Pixel 6 Pro ו-Pixel 6a. כדי להפעיל את ההערכה של צריכת החשמל של ה-GPU, מפעילים את מקור הנתונים הבא בקובץ ההגדרות wattson.cfg:

data_sources: {
  config {
    name: "linux.ftrace"
    ftrace_config {
      ftrace_events: "mali/gpu_power_state"
      ftrace_events: "power/gpu_frequency"

      # [Optional] Enable GPU Work Period (not used by Wattson, but useful for debugging)
      ftrace_events: "power/gpu_work_period"
    }
  }
}

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

הערכת צריכת החשמל של ה-GPU

איור 8. אומדן של עוצמת ה-GPU.

שאלות נפוצות

ריכזנו כאן תשובות לכמה שאלות נפוצות בנושא Wattson.

האם הפלט של Wattson צפוי להיות זהה לפלט של חומרה למדידת הספק במעבדה?

ברוב עומסי העבודה, האומדן של Wattson תואם למדידות של חומרת החשמל במעבדה. עם זאת, זה לא תמיד המצב, וזו לא הכוונה של Wattson.

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

איך Wattson שימושי יותר מבדיקה של זמן המעבד או מחזורי המעבד?

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

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

האם הנתונים ב-Wattson מדויקים בהשוואה לפתרונות חומרה?

השווינו את Wattson לחומרה למדידת צריכת חשמל במעבדה בכמה תרחישי שימוש שסופקו על ידי כמה צוותים. השגיאה הממוצעת ב-Wattson היא 1% והסטייה התקנית היא 1.5%. רמת המתאם הזו נשמרת בבדיקות שנמשכות 10 שניות וגם בבדיקות שנמשכות 4 שעות. לכן אין זחילה של שגיאות או הסתרה של שגיאות שמושפעות מהזמן.

ניסויים בהגדרת ליבת המערכת ב-Pixel 6

הנה כמה ניסויים בסיסיים של פירוטים טיפוסיים של וואטסון באמצעות Pixel 6:

Watts.cfg

בקטע הזה מוסבר איך בדרך כלל מפעילים את Wattson ב-Perfetto:

  write_into_file: true
  flush_period_ms: 30000
  file_write_period_ms: 30000

  buffers: {
      size_kb: 2048
      fill_policy: RING_BUFFER
  }
  buffers: {
      size_kb: 200000
      fill_policy: RING_BUFFER
  }

  # Needed for process level power attribution
  data_sources: {
      config {
          name: "linux.process_stats"
          target_buffer: 0
          process_stats_config {
              scan_all_processes_on_start: true
          }
      }
  }

  # Needed for package level power attribution
  data_sources: {
      config {
          name: "android.packages_list"
          target_buffer: 0
      }
  }

  # Needed for determining CPU freq/idle initial state
  data_sources: {
      config {
          name: "linux.sys_stats"
          sys_stats_config {
              cpufreq_period_ms: 100000000
              cpuidle_period_ms: 100000000
          }
      }
  }

  # Needed for estimating power and thread level power attribution
  data_sources: {
      config {
          name: "linux.ftrace"
          target_buffer: 1
          ftrace_config {
              # Minimum data sources for estimating power
              ftrace_events: "power/cpu_frequency"
              ftrace_events: "power/cpu_idle"
              ftrace_events: "power/suspend_resume"
              ftrace_events: "cpuhp/cpuhp_enter"
              ftrace_events: "cpuhp/cpuhp_exit"
              ftrace_events: "cpuhp/cpuhp_multi_enter"
              ftrace_events: "devfreq/devfreq_frequency"

              # Needed for Wattson start/stop markers
              ftrace_events: "ftrace/print"

              # Needed for thread level power attribution
              ftrace_events: "sched/sched_switch"

              # Needed for process level power attribution
              ftrace_events: "sched/sched_process_free"
              ftrace_events: "task/task_newtask"
              ftrace_events: "task/task_rename"
          }
      }
  }