aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcin Oczeretko <marcinoc@google.com>2021-03-02 22:24:18 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-03-02 22:24:18 +0000
commit7306d6b22e676d8c10fa7a634beec40ceb505cff (patch)
tree992d19539caf01e9c3ef0f9ce3e9e4d704bfa269
parent8a009930c7a14ae71d1053feaa8efa2c651d98de (diff)
parentdfac4b6f0b1cc406d13f55569a9c30a579a91b87 (diff)
downloadperfetto-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
-rw-r--r--src/trace_processor/metrics/android/android_sysui_cuj.sql59
-rw-r--r--test/trace_processor/graphics/android_sysui_cuj.out3
-rw-r--r--test/trace_processor/graphics/android_sysui_cuj.py31
-rw-r--r--test/trace_processor/graphics/android_sysui_cuj_event.out3
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"