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.
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).
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:
- 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-tracevà sử dụng các dấu vết đó làm dấu vết nguồn để phân tích. - 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. - 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ả
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
MyFlaggedFeaturebổ 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
MyFlaggedFeaturekhô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.
MyFlaggedFeature bổ sung.
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.