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 khả thi. 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 vấn đề thường gặp về hiệu suất.
- 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
Bước đầu tiên để thực hiện phân tích hàng loạt là tạo một truy vấn PerfettoSQL.
Trong phần này, chúng tôi trình bày một truy vấn mẫu đo lường độ trễ khi khởi động ứng dụng.
Cụ thể, bạn có thể đo lường khoảng thời gian từ activityStart đến khung hình đầu tiên được tạo (lần xuất hiện đầu tiên của lát cắt Choreographer#doFrame) để đo lường độ trễ khởi động ứng dụng trong tầm kiểm soát của ứng dụng. Hình 1 cho thấy
phần cần truy vấn.
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
Tập lệnh mẫu sau đây thực thi truy vấn trong nhiều dấu vết bằng cách sử dụng 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. - Công 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 nhỏ 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 của bạn 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ả
Sau khi bạn thực thi tập lệnh, tập lệnh sẽ tạo một biểu đồ. Trong trường hợp này, biểu đồ cho thấy một phân phối hai đỉnh với hai đỉnh riêng biệt (Hình 4).
Tiếp theo, hãy tìm sự khác biệt giữa hai nhóm người dùng. Điều này giúp bạn kiểm tra từng dấu vết một cách chi tiết hơn. Trong ví dụ này, biểu đồ được thiết lập sao cho khi di chuột qua các điểm dữ liệu (độ trễ), bạn có thể xác định tên tệp theo dõi. Sau đó, bạn có thể mở một trong các dấu vết thuộc nhóm có độ trễ cao.
Khi mở một dấu vết từ nhóm có độ trễ cao (Hình 5), bạn sẽ thấy một lát cắt bổ sung có tên là MyFlaggedFeature đang chạy trong quá trình khởi động (Hình 6).
Ngược lại, việc chọn một dấu vết từ tập hợp có độ trễ thấp hơn (đỉnh ngoài cùng bên trái) sẽ xác nhận không có cùng một lát cắt đó (Hình 7). Kết quả so sánh này cho thấy một cờ tính năng cụ thể (được bật cho một nhóm nhỏ người dùng) đã kích hoạt sự hồi quy.
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á tác động, phát hiện hồi quy, v.v.