Phân tích dấu vết hàng loạt

Sau khi thu thập nhiều dấu vết bằng ProfilingManager, việc khám phá từng dấu vết để tìm ra vấn đề về hiệu suất sẽ không còn thực tế nữa. Tính năng phân tích dấu vết hàng loạt cho phép bạn truy vấn đồng thời một tập dữ liệu dấu vết để:

  • Xác định các lỗi hồi quy hiệu suất thường gặp.
  • Tính toán mức phân phối thống kê (ví dụ: độ trễ P50, P90, P99).
  • Tìm mẫu trên nhiều dấu vết.
  • Tìm dấu vết ngoại lệ để hiểu và gỡ lỗi các vấn đề về hiệu suất.

Phần này minh hoạ cách sử dụng Trình xử lý dấu vết theo lô Perfetto Python để phân tích các chỉ số khởi động trên một tập hợp dấu vết được lưu trữ cục bộ và tìm dấu vết ngoại lai để phân tích sâu hơn.

Thiết kế truy vấn

Trước tiên, hãy tạo một truy vấn PerfettoSQL để trích xuất chỉ số mà bạn muốn so sánh. Ví dụ sau đây đo lường độ trễ khởi động do ứng dụng kiểm soát từ activityStart đến khung hình đầu tiên được kết xuất (Choreographer#doFrame), như minh hoạ trong Hình 1.

Chế độ xem dòng thời gian của một dấu vết, làm nổi bật khoảng thời gian từ sự kiện activityStart đến sự kiện Choreographer#doFrame đầu tiên.
Hình 1. Phần theo dõi từ activityStart đến khung hình đầu tiên được tạo.
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)

Bạn có thể thực thi truy vấn trong giao diện người dùng Perfetto, sau đó sử dụng kết quả truy vấn để tạo một bản theo dõi gỡ lỗi (Hình 2) và trực quan hoá bản theo dõi đó trong dòng thời gian (Hình 3).

Bảng điều khiển kết quả truy vấn trên giao diện người dùng Perfetto cho thấy cách tạo một kênh gỡ lỗi cho truy vấn khởi động.
Hình 2. Tạo một kênh gỡ lỗi cho truy vấn khởi động.
Chế độ xem dòng thời gian trong giao diện người dùng Perfetto cho thấy một kênh gỡ lỗi được tạo cho một truy vấn khởi động.
Hình 3. Đã tạo bản âm thanh gỡ lỗi cho một truy vấn khởi động.

Thiết lập môi trường Python

Cài đặt Python trên máy cục bộ và các thư viện cần thiết:

pip install perfetto pandas plotly

Tạo tập lệnh phân tích dấu vết hàng loạt

Đoạn mã mẫu sau đây thực thi truy vấn trong nhiều dấu vết bằng cách sử dụng Python BatchTraceProcessor của 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()

Tìm hiểu về tập lệnh

Khi bạn chạy tập lệnh Python, tập lệnh này sẽ thực hiện các thao tác sau:

  1. Tập lệnh này tìm kiếm trong thư mục cục bộ của bạn tất cả dấu vết Perfetto có hậu tố .perfetto-trace và sử dụng các dấu vết đó làm dấu vết nguồn để phân tích.
  2. Thao tác này chạy một truy vấn theo dõi hàng loạt để tính toán một phần thời gian khởi động tương ứng với thời gian từ lát cắt theo dõi activityStart đến khung hình đầu tiên do ứng dụng tạo ra.
  3. Biểu đồ này biểu thị độ trễ tính bằng mili giây bằng biểu đồ violin để trực quan hoá việc phân phối thời gian khởi động.

Diễn giải kết quả

Biểu đồ violin cho thấy mức phân phối độ trễ khởi động được truy vấn.
Hình 4. Biểu đồ violin về độ trễ khởi động được truy vấn.

Khi chạy tập lệnh, bạn sẽ tạo ra một biểu đồ violin cho thấy sự phân phối hai phương thức với hai đỉnh độ trễ riêng biệt (Hình 4). Di chuột qua từng điểm dữ liệu trong biểu đồ để kiểm tra tên tệp _path và so sánh dấu vết từ mỗi đỉnh (Hình 5):

  • Dấu vết có độ trễ cao (đỉnh bên phải): Khi mở một dấu vết từ nhóm này trong Giao diện người dùng Perfetto, bạn sẽ thấy một lát cắt MyFlaggedFeature bổ sung chạy trong quá trình khởi động (Hình 6).
  • Dấu vết có độ trễ thấp (đỉnh bên trái): Việc mở một dấu vết từ nhóm nhanh hơn sẽ xác nhận rằng MyFlaggedFeature không có mặt (Hình 7), cho biết rằng cờ tính năng được bật cho một nhóm nhỏ người dùng đã gây ra sự hồi quy khởi động.
Một biểu đồ làm nổi bật dấu vết có độ trễ cao.
Hình 5. Điểm dữ liệu có độ trễ cao trong biểu đồ violin.
Một dấu vết làm nổi bật quá trình khởi động có độ trễ cao do lát cắt MyFlaggedFeature.
Hình 6. Dấu vết khởi động có độ trễ cao với một lát cắt MyFlaggedFeature bổ sung.
Một dấu vết làm nổi bật quá trình khởi động có độ trễ thấp mà không có lát cắt MyFlaggedFeature.
Hình 7. Khởi động theo dõi có độ trễ thấp.

Ví dụ này minh hoạ một trong nhiều cách bạn có thể sử dụng tính năng phân tích dấu vết hàng loạt. Các trường hợp sử dụng khác bao gồm trích xuất số liệu thống kê từ trường để đánh giá mức độ tác động, phát hiện hồi quy, v.v.