xref: /aosp_15_r20/external/perfetto/ui/src/plugins/dev.perfetto.AndroidPerfTraceCounters/index.ts (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2023 The Android Open Source Project
2*6dbdd20aSAndroid Build Coastguard Worker//
3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*6dbdd20aSAndroid Build Coastguard Worker//
7*6dbdd20aSAndroid Build Coastguard Worker//      http://www.apache.org/licenses/LICENSE-2.0
8*6dbdd20aSAndroid Build Coastguard Worker//
9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License.
14*6dbdd20aSAndroid Build Coastguard Worker
15*6dbdd20aSAndroid Build Coastguard Workerimport {Trace} from '../../public/trace';
16*6dbdd20aSAndroid Build Coastguard Workerimport {PerfettoPlugin} from '../../public/plugin';
17*6dbdd20aSAndroid Build Coastguard Workerimport {addDebugSliceTrack} from '../../components/tracks/debug_tracks';
18*6dbdd20aSAndroid Build Coastguard Workerimport {addQueryResultsTab} from '../../components/query_table/query_result_tab';
19*6dbdd20aSAndroid Build Coastguard Worker
20*6dbdd20aSAndroid Build Coastguard Workerconst PERF_TRACE_COUNTERS_PRECONDITION = `
21*6dbdd20aSAndroid Build Coastguard Worker  SELECT
22*6dbdd20aSAndroid Build Coastguard Worker    str_value
23*6dbdd20aSAndroid Build Coastguard Worker  FROM metadata
24*6dbdd20aSAndroid Build Coastguard Worker  WHERE
25*6dbdd20aSAndroid Build Coastguard Worker    name = 'trace_config_pbtxt'
26*6dbdd20aSAndroid Build Coastguard Worker    AND str_value GLOB '*ftrace_events: "perf_trace_counters/sched_switch_with_ctrs"*'
27*6dbdd20aSAndroid Build Coastguard Worker`;
28*6dbdd20aSAndroid Build Coastguard Worker
29*6dbdd20aSAndroid Build Coastguard Workerexport default class implements PerfettoPlugin {
30*6dbdd20aSAndroid Build Coastguard Worker  static readonly id = 'dev.perfetto.AndroidPerfTraceCounters';
31*6dbdd20aSAndroid Build Coastguard Worker  async onTraceLoad(ctx: Trace): Promise<void> {
32*6dbdd20aSAndroid Build Coastguard Worker    const resp = await ctx.engine.query(PERF_TRACE_COUNTERS_PRECONDITION);
33*6dbdd20aSAndroid Build Coastguard Worker    if (resp.numRows() === 0) return;
34*6dbdd20aSAndroid Build Coastguard Worker    ctx.commands.registerCommand({
35*6dbdd20aSAndroid Build Coastguard Worker      id: 'dev.perfetto.AndroidPerfTraceCounters#ThreadRuntimeIPC',
36*6dbdd20aSAndroid Build Coastguard Worker      name: 'Add a track to show a thread runtime ipc',
37*6dbdd20aSAndroid Build Coastguard Worker      callback: async (tid) => {
38*6dbdd20aSAndroid Build Coastguard Worker        if (tid === undefined) {
39*6dbdd20aSAndroid Build Coastguard Worker          tid = prompt('Enter a thread tid', '');
40*6dbdd20aSAndroid Build Coastguard Worker          if (tid === null) return;
41*6dbdd20aSAndroid Build Coastguard Worker        }
42*6dbdd20aSAndroid Build Coastguard Worker        const sqlPrefix = `
43*6dbdd20aSAndroid Build Coastguard Worker          WITH
44*6dbdd20aSAndroid Build Coastguard Worker            sched_switch_ipc AS (
45*6dbdd20aSAndroid Build Coastguard Worker              SELECT
46*6dbdd20aSAndroid Build Coastguard Worker                ts,
47*6dbdd20aSAndroid Build Coastguard Worker                EXTRACT_ARG(arg_set_id, 'prev_pid') AS tid,
48*6dbdd20aSAndroid Build Coastguard Worker                EXTRACT_ARG(arg_set_id, 'prev_comm') AS thread_name,
49*6dbdd20aSAndroid Build Coastguard Worker                EXTRACT_ARG(arg_set_id, 'inst') / (EXTRACT_ARG(arg_set_id, 'cyc') * 1.0) AS ipc,
50*6dbdd20aSAndroid Build Coastguard Worker                EXTRACT_ARG(arg_set_id, 'inst') AS instruction,
51*6dbdd20aSAndroid Build Coastguard Worker                EXTRACT_ARG(arg_set_id, 'cyc') AS cycle,
52*6dbdd20aSAndroid Build Coastguard Worker                EXTRACT_ARG(arg_set_id, 'stallbm') AS stall_backend_mem,
53*6dbdd20aSAndroid Build Coastguard Worker                EXTRACT_ARG(arg_set_id, 'l3dm') AS l3_cache_miss
54*6dbdd20aSAndroid Build Coastguard Worker              FROM ftrace_event
55*6dbdd20aSAndroid Build Coastguard Worker              WHERE name = 'sched_switch_with_ctrs' AND tid = ${tid}
56*6dbdd20aSAndroid Build Coastguard Worker            ),
57*6dbdd20aSAndroid Build Coastguard Worker            target_thread_sched_slice AS (
58*6dbdd20aSAndroid Build Coastguard Worker              SELECT s.*, t.tid, t.name FROM sched s LEFT JOIN thread t USING (utid)
59*6dbdd20aSAndroid Build Coastguard Worker                WHERE t.tid = ${tid}
60*6dbdd20aSAndroid Build Coastguard Worker            ),
61*6dbdd20aSAndroid Build Coastguard Worker            target_thread_ipc_slice AS (
62*6dbdd20aSAndroid Build Coastguard Worker              SELECT
63*6dbdd20aSAndroid Build Coastguard Worker                (
64*6dbdd20aSAndroid Build Coastguard Worker                  SELECT
65*6dbdd20aSAndroid Build Coastguard Worker                    ts
66*6dbdd20aSAndroid Build Coastguard Worker                  FROM target_thread_sched_slice ts
67*6dbdd20aSAndroid Build Coastguard Worker                  WHERE ts.tid = ssi.tid AND ts.ts < ssi.ts
68*6dbdd20aSAndroid Build Coastguard Worker                  ORDER BY ts.ts DESC
69*6dbdd20aSAndroid Build Coastguard Worker                  LIMIT 1
70*6dbdd20aSAndroid Build Coastguard Worker                ) AS ts,
71*6dbdd20aSAndroid Build Coastguard Worker                (
72*6dbdd20aSAndroid Build Coastguard Worker                  SELECT
73*6dbdd20aSAndroid Build Coastguard Worker                    dur
74*6dbdd20aSAndroid Build Coastguard Worker                  FROM target_thread_sched_slice ts
75*6dbdd20aSAndroid Build Coastguard Worker                  WHERE ts.tid = ssi.tid AND ts.ts < ssi.ts
76*6dbdd20aSAndroid Build Coastguard Worker                  ORDER BY ts.ts DESC
77*6dbdd20aSAndroid Build Coastguard Worker                  LIMIT 1
78*6dbdd20aSAndroid Build Coastguard Worker                ) AS dur,
79*6dbdd20aSAndroid Build Coastguard Worker                ssi.ipc,
80*6dbdd20aSAndroid Build Coastguard Worker                ssi.instruction,
81*6dbdd20aSAndroid Build Coastguard Worker                ssi.cycle,
82*6dbdd20aSAndroid Build Coastguard Worker                ssi.stall_backend_mem,
83*6dbdd20aSAndroid Build Coastguard Worker                ssi.l3_cache_miss
84*6dbdd20aSAndroid Build Coastguard Worker              FROM sched_switch_ipc ssi
85*6dbdd20aSAndroid Build Coastguard Worker            )
86*6dbdd20aSAndroid Build Coastguard Worker        `;
87*6dbdd20aSAndroid Build Coastguard Worker
88*6dbdd20aSAndroid Build Coastguard Worker        await addDebugSliceTrack({
89*6dbdd20aSAndroid Build Coastguard Worker          trace: ctx,
90*6dbdd20aSAndroid Build Coastguard Worker          data: {
91*6dbdd20aSAndroid Build Coastguard Worker            sqlSource:
92*6dbdd20aSAndroid Build Coastguard Worker              sqlPrefix +
93*6dbdd20aSAndroid Build Coastguard Worker              `
94*6dbdd20aSAndroid Build Coastguard Worker              SELECT * FROM target_thread_ipc_slice WHERE ts IS NOT NULL`,
95*6dbdd20aSAndroid Build Coastguard Worker          },
96*6dbdd20aSAndroid Build Coastguard Worker          title: 'Rutime IPC:' + tid,
97*6dbdd20aSAndroid Build Coastguard Worker          columns: {ts: 'ts', dur: 'dur', name: 'ipc'},
98*6dbdd20aSAndroid Build Coastguard Worker          argColumns: [
99*6dbdd20aSAndroid Build Coastguard Worker            'instruction',
100*6dbdd20aSAndroid Build Coastguard Worker            'cycle',
101*6dbdd20aSAndroid Build Coastguard Worker            'stall_backend_mem',
102*6dbdd20aSAndroid Build Coastguard Worker            'l3_cache_miss',
103*6dbdd20aSAndroid Build Coastguard Worker          ],
104*6dbdd20aSAndroid Build Coastguard Worker        });
105*6dbdd20aSAndroid Build Coastguard Worker        addQueryResultsTab(ctx, {
106*6dbdd20aSAndroid Build Coastguard Worker          query:
107*6dbdd20aSAndroid Build Coastguard Worker            sqlPrefix +
108*6dbdd20aSAndroid Build Coastguard Worker            `
109*6dbdd20aSAndroid Build Coastguard Worker            SELECT
110*6dbdd20aSAndroid Build Coastguard Worker              (sum(instruction) * 1.0 / sum(cycle)*1.0) AS avg_ipc,
111*6dbdd20aSAndroid Build Coastguard Worker              sum(dur)/1e6 as total_runtime_ms,
112*6dbdd20aSAndroid Build Coastguard Worker              sum(instruction) AS total_instructions,
113*6dbdd20aSAndroid Build Coastguard Worker              sum(cycle) AS total_cycles,
114*6dbdd20aSAndroid Build Coastguard Worker              sum(stall_backend_mem) as total_stall_backend_mem,
115*6dbdd20aSAndroid Build Coastguard Worker              sum(l3_cache_miss) as total_l3_cache_miss
116*6dbdd20aSAndroid Build Coastguard Worker            FROM target_thread_ipc_slice WHERE ts IS NOT NULL`,
117*6dbdd20aSAndroid Build Coastguard Worker          title: 'target thread ipc statistic',
118*6dbdd20aSAndroid Build Coastguard Worker        });
119*6dbdd20aSAndroid Build Coastguard Worker      },
120*6dbdd20aSAndroid Build Coastguard Worker    });
121*6dbdd20aSAndroid Build Coastguard Worker  }
122*6dbdd20aSAndroid Build Coastguard Worker}
123