blob: b47381edc365c0bc7a375c5f584aa14dd5cbb22a [file] [log] [blame]
--
-- Copyright 2022 The Android Open Source Project
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- https://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
--
SELECT IMPORT('android.startup.startups');
-- Create the base CPU span join table.
SELECT RUN_METRIC('android/android_cpu_agg.sql');
SELECT RUN_METRIC('android/cpu_info.sql');
-- Create a span join safe launches view; since both views
-- being span joined have an "id" column, we need to rename
-- the id column for launches to disambiguate the two.
DROP VIEW IF EXISTS android_launches_span_join_safe;
CREATE VIEW android_launches_span_join_safe AS
SELECT ts, dur, startup_id
FROM android_startups;
DROP VIEW IF EXISTS launches_span_join_safe;
CREATE VIEW launches_span_join_safe AS
SELECT startup_id AS launch_id, * FROM android_launches_span_join_safe;
-- Span join the CPU table with the launches table to get the
-- breakdown per-cpu.
DROP TABLE IF EXISTS cpu_freq_sched_per_thread_per_launch;
CREATE VIRTUAL TABLE cpu_freq_sched_per_thread_per_launch
USING SPAN_JOIN(
android_launches_span_join_safe,
cpu_freq_sched_per_thread PARTITIONED cpu
);
-- Materialized to avoid span-joining once per core type.
DROP TABLE IF EXISTS mcycles_per_core_type_per_launch;
CREATE TABLE mcycles_per_core_type_per_launch AS
SELECT
startup_id,
IFNULL(core_type_per_cpu.core_type, 'unknown') AS core_type,
CAST(SUM(dur * freq_khz / 1000) / 1e9 AS INT) AS mcycles
FROM cpu_freq_sched_per_thread_per_launch
LEFT JOIN core_type_per_cpu USING (cpu)
WHERE utid != 0
GROUP BY 1, 2;
-- Given a launch id and core type, returns the number of mcycles consumed
-- on CPUs of that core type during the launch.
SELECT CREATE_FUNCTION(
'MCYCLES_FOR_LAUNCH_AND_CORE_TYPE(startup_id INT, core_type STRING)',
'INT',
'
SELECT mcycles
FROM mcycles_per_core_type_per_launch m
WHERE m.startup_id = $startup_id AND m.core_type = $core_type
'
);
-- Contains the process using the most mcycles during the launch
-- *excluding the process being started*.
-- Materialized to avoid span-joining once per launch.
DROP TABLE IF EXISTS top_mcyles_process_excluding_started_per_launch;
CREATE TABLE top_mcyles_process_excluding_started_per_launch AS
WITH mcycles_per_launch_and_process AS MATERIALIZED (
SELECT
startup_id,
upid,
CAST(SUM(dur * freq_khz / 1000) / 1e9 AS INT) AS mcycles
FROM cpu_freq_sched_per_thread_per_launch c
JOIN thread USING (utid)
JOIN process USING (upid)
WHERE
utid != 0
AND upid NOT IN (
SELECT upid
FROM android_startup_processes l
)
GROUP BY startup_id, upid
)
SELECT *
FROM (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY startup_id ORDER BY mcycles DESC) AS mcycles_rank
FROM mcycles_per_launch_and_process
)
WHERE mcycles_rank <= 5;
-- Given a launch id, returns the name of the processes consuming the most
-- mcycles during the launch excluding the process being started.
SELECT CREATE_FUNCTION(
'N_MOST_ACTIVE_PROCESS_NAMES_FOR_LAUNCH(startup_id INT)',
'STRING',
'
SELECT RepeatedField(process_name)
FROM (
SELECT IFNULL(process.name, "[NULL]") AS process_name
FROM top_mcyles_process_excluding_started_per_launch
JOIN process USING (upid)
WHERE startup_id = $startup_id
ORDER BY mcycles DESC
);
'
);
-- Given a launch id, returns the most active process name.
SELECT CREATE_FUNCTION(
'MOST_ACTIVE_PROCESS_FOR_LAUNCH(startup_id INT)',
'STRING',
'
SELECT process.name AS process_name
FROM top_mcyles_process_excluding_started_per_launch
JOIN process USING (upid)
WHERE startup_id = $startup_id
ORDER BY mcycles DESC LIMIT 1;
'
);