วิเคราะห์การติดตามแบบเป็นกลุ่ม

เมื่อคุณรวบรวมการติดตามหลายรายการโดยใช้ ProfilingManager แล้ว การสำรวจการติดตามแต่ละรายการเพื่อค้นหาปัญหาด้านประสิทธิภาพจะทำได้ยาก การวิเคราะห์การติดตามแบบกลุ่มช่วยให้คุณค้นหาชุดข้อมูลของการติดตามพร้อมกันเพื่อทำสิ่งต่อไปนี้ได้

  • ระบุการถดถอยของประสิทธิภาพที่พบบ่อย
  • คำนวณการแจกแจงทางสถิติ (เช่น เวลาในการตอบสนอง P50, P90, P99)
  • ค้นหารูปแบบในการติดตามหลายรายการ
  • ค้นหาการติดตามที่ผิดปกติเพื่อทำความเข้าใจและแก้ไขข้อบกพร่องด้านประสิทธิภาพ

ส่วนนี้จะสาธิตวิธีใช้ Batch Trace Processor ของ Perfetto Python เพื่อวิเคราะห์เมตริกการเริ่มต้นระบบในชุดการติดตามที่จัดเก็บไว้ในเครื่อง และค้นหาการติดตามที่ผิดปกติเพื่อการวิเคราะห์ที่ละเอียดยิ่งขึ้น

ออกแบบการค้นหา

ก่อนอื่น ให้สร้างการค้นหา PerfettoSQL ที่ดึงข้อมูลเมตริกที่ต้องการเปรียบเทียบ ตัวอย่างต่อไปนี้วัดเวลาในการตอบสนองเริ่มต้นที่ควบคุมโดยแอปตั้งแต่ activityStart จนถึงเฟรมแรกที่แสดงผล (Choreographer#doFrame) ดังที่แสดงในรูปที่ 1

มุมมองไทม์ไลน์ของการติดตาม โดยไฮไลต์ระยะเวลาจากเหตุการณ์ activityStart ไปยัง Choreographer#doFrame เหตุการณ์แรก
รูปที่ 1 ส่วนการติดตามจาก activityStart ไปยังเฟรมแรกที่สร้างขึ้น
CREATE OR REPLACE PERFETTO FUNCTION find_slices(pattern STRING) RETURNS
TABLE (name STRING, ts LONG, dur LONG) AS
SELECT name,ts,dur FROM slice WHERE name GLOB $pattern;

CREATE OR REPLACE PERFETTO FUNCTION generate_start_to_end_slices(startSlicePattern STRING, endSlicePattern STRING, inclusive BOOL) RETURNS
TABLE(name STRING, ts LONG, dur LONG) AS
SELECT name, ts, MIN(startToEndDur) as dur
FROM
  (SELECT S.name as name, S.ts as ts, E.ts + IIF($inclusive, E.dur, 0) - S.ts as startToEndDur
  FROM find_slices($startSlicePattern) as S CROSS JOIN find_slices($endSlicePattern) as E
  WHERE startToEndDur > 0)
GROUP BY name, ts;

SELECT ts,name,dur from generate_start_to_end_slices('activityStart','*Choreographer#doFrame [0-9]*', true)

คุณสามารถเรียกใช้การค้นหาภายใน Perfetto UI แล้วใช้ผลการค้นหาเพื่อสร้างแทร็กการแก้ไขข้อบกพร่อง (รูปที่ 2) และแสดงภาพภายในไทม์ไลน์ (รูปที่ 3)

แผงผลการค้นหา UI ของ Perfetto แสดงวิธีสร้างแทร็กการแก้ไขข้อบกพร่องสำหรับการค้นหาการเริ่มต้น
รูปที่ 2 สร้างแทร็กการแก้ไขข้อบกพร่องสำหรับการค้นหาการเริ่มต้น
มุมมองไทม์ไลน์ใน UI ของ Perfetto แสดงแทร็กการแก้ไขข้อบกพร่องที่สร้างขึ้นสำหรับการค้นหาการเริ่มต้น
รูปที่ 3 สร้างแทร็กการแก้ไขข้อบกพร่องสำหรับการค้นหาการเริ่มต้น

ตั้งค่าสภาพแวดล้อม Python

ติดตั้ง Python ในเครื่องของคุณและไลบรารีที่จำเป็น ดังนี้

pip install perfetto pandas plotly

สร้างสคริปต์วิเคราะห์การติดตามแบบเป็นกลุ่ม

สคริปต์ตัวอย่างต่อไปนี้จะเรียกใช้การค้นหาในการติดตามหลายรายการโดยใช้ BatchTraceProcessor ของ Perfetto

from perfetto.batch_trace_processor import BatchTraceProcessor
import glob
import plotly.express as px

# Collect all trace files in the local directory
traces = glob.glob('*.perfetto-trace')

if not traces:
    print("No .perfetto-trace files found in the current directory.")
    exit(1)

if __name__ == '__main__':
    # Process all traces in parallel to aggregate metrics across runs
    with BatchTraceProcessor(traces) as btp:
        query = """
        CREATE OR REPLACE PERFETTO FUNCTION find_slices(pattern STRING) RETURNS
        TABLE (name STRING, ts LONG, dur LONG) AS
        SELECT name,ts,dur FROM slice WHERE name GLOB $pattern;

        CREATE OR REPLACE PERFETTO FUNCTION generate_start_to_end_slices(startSlicePattern STRING, endSlicePattern STRING, inclusive BOOL) RETURNS
        TABLE(name STRING, ts LONG, dur LONG) AS
        SELECT name, ts, MIN(startToEndDur) as dur
        FROM
          (SELECT S.name as name, S.ts as ts, E.ts + IIF($inclusive, E.dur, 0) - S.ts as startToEndDur
          FROM find_slices($startSlicePattern) as S CROSS JOIN find_slices($endSlicePattern) as E
          WHERE startToEndDur > 0)
        GROUP BY name, ts;

        SELECT ts,name,dur / 1000000 as dur_ms from generate_start_to_end_slices('activityStart','*Choreographer#doFrame [0-9]*', true)
        """
        df = btp.query_and_flatten(query)
        # Plot the distribution of startup times, tracking trace file paths on
        # hover
        violin = px.violin(df, x='dur_ms', hover_data='_path', title='startup time', points='all')
        violin.show()

ทำความเข้าใจสคริปต์

เมื่อเรียกใช้สคริปต์ Python สคริปต์จะดำเนินการต่อไปนี้

  1. สคริปต์จะค้นหาในไดเรกทอรีในเครื่องเพื่อหาการติดตามใน Perfetto ทั้งหมดที่ลงท้ายด้วย .perfetto-trace และใช้การติดตามเหล่านั้นเป็นต้นทางสำหรับการวิเคราะห์
  2. โดยจะเรียกใช้การค้นหาการติดตามแบบกลุ่มซึ่งคำนวณชุดย่อยของเวลาเริ่มต้นที่สอดคล้องกับเวลาจาก Slice การติดตาม activityStart ไปยังเฟรมแรกที่แอปสร้างขึ้น
  3. โดยจะพล็อตเวลาในการตอบสนองเป็นมิลลิวินาทีโดยใช้กราฟไวโอลิน เพื่อแสดงภาพการกระจายของเวลาที่ใช้ในการเริ่มต้น

ตีความผลลัพธ์

กราฟไวโอลินแสดงการกระจายตัวของเวลาในการตอบสนองสำหรับการเริ่มต้นที่ค้นหา
รูปที่ 4 กราฟไวโอลินของเวลาในการตอบสนองสำหรับการเริ่มต้นที่ค้นหา

การเรียกใช้สคริปต์จะสร้างกราฟไวโอลินที่แสดงการกระจายแบบ 2 ยอด โดยมีจุดสูงสุดของเวลาในการตอบสนองที่แยกจากกันอย่างชัดเจน 2 จุด (รูปที่ 4) วางเมาส์เหนือจุดข้อมูลแต่ละจุดในผังเพื่อตรวจสอบชื่อไฟล์ _path และเปรียบเทียบการติดตามจากแต่ละจุดสูงสุด (รูปที่ 5)

  • การติดตามที่มีเวลาในการตอบสนองสูง (ยอดสูงสุดด้านขวา): การเปิดการติดตามจากกลุ่มนี้ใน Perfetto UI จะแสดง Slice MyFlaggedFeature เพิ่มเติมที่ทำงานระหว่างการเริ่มต้น (รูปที่ 6)
  • การติดตามที่มีเวลาในการตอบสนองต่ำ (จุดสูงสุดทางซ้าย): การเปิดการติดตามจากกลุ่มที่เร็วกว่ายืนยันว่าไม่มี MyFlaggedFeature (รูปที่ 7) ซึ่งบ่งชี้ว่าแฟล็กฟีเจอร์ที่เปิดใช้สำหรับผู้ใช้บางกลุ่มทำให้เกิดการถดถอยของการเริ่มต้นระบบ
กราฟที่ไฮไลต์การติดตามที่มีเวลาในการตอบสนองสูง
รูปที่ 5 จุดข้อมูลที่มีเวลาในการตอบสนองสูงในกราฟไวโอลิน
การติดตามที่ไฮไลต์การเริ่มต้นที่มีเวลาในการตอบสนองสูงเนื่องจาก Slice MyFlaggedFeature
รูปที่ 6 เริ่มต้นการติดตามที่มีเวลาในการตอบสนองสูงด้วย Slice MyFlaggedFeature เพิ่มเติม
การติดตามที่ไฮไลต์การเริ่มต้นที่มีเวลาในการตอบสนองต่ำโดยไม่มี Slice MyFlaggedFeature
รูปที่ 7 การติดตามการเริ่มต้นที่มีเวลาในการตอบสนองต่ำ

ตัวอย่างนี้แสดงให้เห็นวิธีหนึ่งจากหลายวิธีที่คุณสามารถใช้การวิเคราะห์การติดตามแบบเป็นกลุ่ม กรณีการใช้งานอื่นๆ ได้แก่ การดึงสถิติจากภาคสนามเพื่อวัดผลกระทบ การตรวจหาการถดถอย และอื่นๆ