diff options
author | Marcin Oczeretko <marcinoc@google.com> | 2021-03-02 22:24:18 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-03-02 22:24:18 +0000 |
commit | 7306d6b22e676d8c10fa7a634beec40ceb505cff (patch) | |
tree | 992d19539caf01e9c3ef0f9ce3e9e4d704bfa269 | |
parent | 8a009930c7a14ae71d1053feaa8efa2c651d98de (diff) | |
parent | dfac4b6f0b1cc406d13f55569a9c30a579a91b87 (diff) | |
download | perfetto-7306d6b22e676d8c10fa7a634beec40ceb505cff.tar.gz |
Merge "Extract non-app jank causes in android_sysui_cuj metric" am: dfac4b6f0b
Original change: https://android-review.googlesource.com/c/platform/external/perfetto/+/1611686
MUST ONLY BE SUBMITTED BY AUTOMERGER
Change-Id: I6fa822ba74592bb6a2d3fc13c34def4903eb95d4
4 files changed, 63 insertions, 33 deletions
diff --git a/src/trace_processor/metrics/android/android_sysui_cuj.sql b/src/trace_processor/metrics/android/android_sysui_cuj.sql index e0ec44318..72fb15424 100644 --- a/src/trace_processor/metrics/android/android_sysui_cuj.sql +++ b/src/trace_processor/metrics/android/android_sysui_cuj.sql @@ -75,7 +75,8 @@ CREATE TABLE android_sysui_cuj_frame_timeline_events AS expected.layer_name as layer_name, actual.ts as ts_actual, actual.dur as dur_actual, - actual.jank_type LIKE '%App Deadline Missed%' as app_missed + actual.jank_type LIKE '%App Deadline Missed%' as app_missed, + actual.jank_type FROM expected_frame_timeline_slice expected JOIN android_sysui_cuj_last_cuj cuj ON expected.upid = cuj.upid @@ -84,7 +85,9 @@ CREATE TABLE android_sysui_cuj_frame_timeline_events AS JOIN actual_frame_timeline_slice actual ON expected.surface_frame_token = actual.surface_frame_token AND expected.upid = actual.upid - AND expected.layer_name = actual.layer_name; + AND expected.layer_name = actual.layer_name + WHERE actual.jank_type <> 'None' + AND actual.on_time_finish = 0; DROP TABLE IF EXISTS android_sysui_cuj_frames; CREATE TABLE android_sysui_cuj_frames AS @@ -141,28 +144,30 @@ CREATE TABLE android_sysui_cuj_frames AS GROUP BY f.mts_ts HAVING gpu_completions >= 1; +-- TODO(marcinoc): This matching does not work well. Fix by using VSYNC id. +DROP TABLE IF EXISTS android_sysui_cuj_frame_timeline_match; +CREATE TABLE android_sysui_cuj_frame_timeline_match AS + SELECT f.frame_number, MAX(fte.ts_actual) as ts_actual_match + FROM android_sysui_cuj_frames f + JOIN android_sysui_cuj_frame_timeline_events fte + ON f.ts_main_thread_start >= fte.ts_actual + GROUP BY f.frame_number; + DROP TABLE IF EXISTS android_sysui_cuj_missed_frames; CREATE TABLE android_sysui_cuj_missed_frames AS - WITH frame_timeline_match AS ( - SELECT f.frame_number, MAX(fte.ts_actual) as ts_actual_match - FROM android_sysui_cuj_frames f - JOIN android_sysui_cuj_frame_timeline_events fte - ON f.ts_main_thread_start >= fte.ts_actual - AND f.ts_frame_end <= fte.ts_actual + fte.dur_actual - GROUP BY f.frame_number) SELECT f.*, (SELECT MAX(fte.app_missed) FROM android_sysui_cuj_frame_timeline_events fte WHERE match.ts_actual_match = fte.ts_actual) as app_missed FROM android_sysui_cuj_frames f - JOIN frame_timeline_match match USING (frame_number) - WHERE app_missed; + JOIN android_sysui_cuj_frame_timeline_match match USING (frame_number); DROP VIEW IF EXISTS android_sysui_cuj_frame_main_thread_bounds; CREATE VIEW android_sysui_cuj_frame_main_thread_bounds AS SELECT frame_number, ts_main_thread_start as ts, dur_main_thread as dur -FROM android_sysui_cuj_missed_frames; +FROM android_sysui_cuj_missed_frames +WHERE app_missed; DROP VIEW IF EXISTS android_sysui_cuj_main_thread_state_data; CREATE VIEW android_sysui_cuj_main_thread_state_data AS @@ -187,7 +192,8 @@ CREATE TABLE android_sysui_cuj_main_thread_state AS DROP VIEW IF EXISTS android_sysui_cuj_frame_render_thread_bounds; CREATE VIEW android_sysui_cuj_frame_render_thread_bounds AS SELECT frame_number, ts_render_thread_start as ts, dur_render_thread as dur -FROM android_sysui_cuj_missed_frames; +FROM android_sysui_cuj_missed_frames +WHERE app_missed; DROP VIEW IF EXISTS android_sysui_cuj_render_thread_state_data; CREATE VIEW android_sysui_cuj_render_thread_state_data AS @@ -219,8 +225,26 @@ CREATE TABLE android_sysui_cuj_main_thread_binder AS JOIN android_sysui_cuj_main_thread_slices_in_cuj mts ON mts.ts >= f.ts_main_thread_start AND mts.ts < f.ts_main_thread_end WHERE mts.name = 'binder transaction' + AND f.app_missed GROUP BY f.frame_number; +DROP TABLE IF EXISTS android_sysui_cuj_sf_jank_causes; +CREATE TABLE android_sysui_cuj_sf_jank_causes AS + WITH RECURSIVE split_jank_type(frame_number, jank_cause, remainder) AS ( + SELECT match.frame_number, "", fte.jank_type || "," + FROM android_sysui_cuj_frame_timeline_match match + JOIN android_sysui_cuj_frame_timeline_events fte ON match.ts_actual_match = fte.ts_actual + UNION ALL SELECT + frame_number, + STR_SPLIT(remainder, ",", 0) AS jank_cause, + TRIM(SUBSTR(remainder, INSTR(remainder, ",") + 1)) AS remainder + FROM split_jank_type + WHERE remainder <> "") + SELECT frame_number, jank_cause + FROM split_jank_type + WHERE jank_cause <> '' AND jank_cause <> 'App Deadline Missed' + ORDER BY frame_number ASC; + DROP TABLE IF EXISTS android_sysui_cuj_jank_causes; CREATE TABLE android_sysui_cuj_jank_causes AS SELECT @@ -230,6 +254,7 @@ CREATE TABLE android_sysui_cuj_jank_causes AS JOIN android_sysui_cuj_render_thread_slices_in_cuj rts ON rts.ts >= f.ts_render_thread_start AND rts.ts < f.ts_render_thread_end WHERE rts.name = 'shader_compile' + AND f.app_missed AND rts.dur > 8000000 UNION ALL @@ -241,6 +266,7 @@ CREATE TABLE android_sysui_cuj_jank_causes AS ON rts.ts >= f.ts_render_thread_start AND rts.ts < f.ts_render_thread_end WHERE rts.name = 'flush layers' AND rts.dur > 8000000 + AND f.app_missed UNION ALL SELECT @@ -302,6 +328,7 @@ CREATE TABLE android_sysui_cuj_jank_causes AS 'GPU completion - long completion time' AS jank_cause FROM android_sysui_cuj_missed_frames f WHERE dur_gcs > 8000000 + AND app_missed UNION ALL SELECT @@ -312,7 +339,11 @@ CREATE TABLE android_sysui_cuj_jank_causes AS WHERE mts.state = 'Running' AND rts.state = 'Running' - AND mts.dur + rts.dur > 15000000; + AND mts.dur + rts.dur > 15000000 + + UNION ALL + SELECT frame_number, jank_cause FROM android_sysui_cuj_sf_jank_causes + GROUP BY frame_number, jank_cause; -- TODO(b/175098682): Switch to use async slices DROP VIEW IF EXISTS android_sysui_cuj_event; diff --git a/test/trace_processor/graphics/android_sysui_cuj.out b/test/trace_processor/graphics/android_sysui_cuj.out index b69b01650..1e9410997 100644 --- a/test/trace_processor/graphics/android_sysui_cuj.out +++ b/test/trace_processor/graphics/android_sysui_cuj.out @@ -16,6 +16,7 @@ android_sysui_cuj { ts: 8000000 dur: 27000000 jank_cause: "MainThread - binder transaction time" + jank_cause: "SurfaceFlinger Scheduling" } frames { number: 3 @@ -47,5 +48,7 @@ android_sysui_cuj { number: 7 ts: 200000000 dur: 10000000 + jank_cause: "SurfaceFlinger GPU Deadline Missed" + jank_cause: "SurfaceFlinger Scheduling" } }
\ No newline at end of file diff --git a/test/trace_processor/graphics/android_sysui_cuj.py b/test/trace_processor/graphics/android_sysui_cuj.py index 5d74dc87b..3526b0dd3 100644 --- a/test/trace_processor/graphics/android_sysui_cuj.py +++ b/test/trace_processor/graphics/android_sysui_cuj.py @@ -46,10 +46,10 @@ def add_frame(trace, ts_do_frame, ts_end_do_frame, ts_draw_frame, "waiting for GPU completion 123") -def add_display_frame_events(ts, dur, token_start, has_jank): - jank_type = 64 if has_jank else 1 - present_type = 2 if has_jank else 1 - on_time_finish = 1 if has_jank else 0 +def add_display_frame_events(ts, dur, token_start, jank=None): + jank_type = jank if jank is not None else 1 + present_type = 2 if jank is not None else 1 + on_time_finish = 1 if jank is None else 0 trace.add_expected_display_frame_start_event( ts=ts, cookie=token_start, token=token_start, pid=PID) trace.add_frame_end_event(ts=ts + 20_500_000, cookie=token_start) @@ -248,22 +248,17 @@ add_frame( ts_gpu=1_400_000_000, ts_end_gpu=1_500_000_000) -add_display_frame_events(ts=0, dur=16_000_000, token_start=10, has_jank=False) +add_display_frame_events(ts=0, dur=16_000_000, token_start=10) +add_display_frame_events(ts=8_000_000, dur=28_000_000, token_start=20, jank=66) +add_display_frame_events(ts=30_000_000, dur=25_000_000, token_start=30, jank=64) +add_display_frame_events(ts=40_000_000, dur=40_000_000, token_start=40, jank=64) +add_display_frame_events(ts=70_000_000, dur=20_000_000, token_start=50, jank=64) add_display_frame_events( - ts=8_000_000, dur=28_000_000, token_start=20, has_jank=True) + ts=100_000_000, dur=23_000_000, token_start=60, jank=64) add_display_frame_events( - ts=30_000_000, dur=25_000_000, token_start=30, has_jank=True) + ts=200_000_000, dur=12_000_000, token_start=70, jank=34) +add_display_frame_events(ts=300_000_000, dur=61_000_000, token_start=80) add_display_frame_events( - ts=40_000_000, dur=40_000_000, token_start=40, has_jank=True) -add_display_frame_events( - ts=70_000_000, dur=20_000_000, token_start=50, has_jank=True) -add_display_frame_events( - ts=100_000_000, dur=23_000_000, token_start=60, has_jank=True) -add_display_frame_events( - ts=200_000_000, dur=12_000_000, token_start=70, has_jank=False) -add_display_frame_events( - ts=300_000_000, dur=11_000_000, token_start=80, has_jank=False) -add_display_frame_events( - ts=1_100_000_000, dur=500_000_000, token_start=100, has_jank=True) + ts=1_100_000_000, dur=500_000_000, token_start=100, jank=64) sys.stdout.buffer.write(trace.trace.SerializeToString()) diff --git a/test/trace_processor/graphics/android_sysui_cuj_event.out b/test/trace_processor/graphics/android_sysui_cuj_event.out index ae6b52a83..056a002d6 100644 --- a/test/trace_processor/graphics/android_sysui_cuj_event.out +++ b/test/trace_processor/graphics/android_sysui_cuj_event.out @@ -1,7 +1,8 @@ "track_type","track_name","ts","dur","slice_name" -"slice","SHADE_ROW_EXPAND - jank cause",8000000,15000000,"MainThread - binder transaction time" +"slice","SHADE_ROW_EXPAND - jank cause",8000000,15000000,"MainThread - binder transaction time,SurfaceFlinger Scheduling" "slice","SHADE_ROW_EXPAND - jank cause",30000000,3000000,"MainThread - binder calls count,RenderThread - long flush layers" "slice","SHADE_ROW_EXPAND - jank cause",40000000,13000000,"GPU completion - long completion time,Long running time" "slice","SHADE_ROW_EXPAND - jank cause",70000000,10000000,"RenderThread - scheduler" "slice","SHADE_ROW_EXPAND - jank cause",100000000,15000000,"GPU completion - long completion time" +"slice","SHADE_ROW_EXPAND - jank cause",200000000,15000000,"SurfaceFlinger GPU Deadline Missed,SurfaceFlinger Scheduling" |