blob: 010092795f27b0968687fd7c791742853378e077 [file] [log] [blame]
--
-- Copyright 2021 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.
DROP VIEW IF EXISTS rx_packets;
CREATE VIEW rx_packets AS
SELECT
ts,
REPLACE(name, " Received KB", "") AS dev,
EXTRACT_ARG(arg_set_id, 'cpu') AS cpu,
EXTRACT_ARG(arg_set_id, 'len') AS len
FROM counter c
LEFT JOIN counter_track t
ON c.track_id = t.id
WHERE name GLOB "* Received KB"
ORDER BY ts DESC;
DROP VIEW IF EXISTS gro_rx_packet_count;
CREATE VIEW gro_rx_packet_count AS
SELECT
s.name AS dev,
COUNT(1) AS cnt
FROM slice s
LEFT JOIN track t
ON s.track_id = t.id
WHERE t.name GLOB "Napi Gro Cpu *"
GROUP BY s.name;
DROP VIEW IF EXISTS tx_packets;
CREATE VIEW tx_packets AS
SELECT
ts,
REPLACE(name, " Transmitted KB", "") AS dev,
EXTRACT_ARG(arg_set_id, 'cpu') AS cpu,
EXTRACT_ARG(arg_set_id, 'len') AS len
FROM counter c
LEFT JOIN counter_track t
ON c.track_id = t.id
WHERE name GLOB "* Transmitted KB"
ORDER BY ts DESC;
DROP VIEW IF EXISTS net_devices;
CREATE VIEW net_devices AS
SELECT DISTINCT dev
FROM tx_packets
UNION
SELECT DISTINCT dev
FROM rx_packets;
DROP VIEW IF EXISTS tcp_retransmitted_count;
CREATE VIEW tcp_retransmitted_count AS
SELECT
COUNT(1) AS cnt
FROM slice s
LEFT JOIN track t
ON s.track_id = t.id
WHERE
t.name = "TCP Retransmit Skb";
DROP VIEW IF EXISTS kfree_skb_count;
CREATE VIEW kfree_skb_count AS
SELECT
MAX(value) AS cnt
FROM counter c
LEFT JOIN track t
ON c.track_id = t.id
WHERE
t.name = "Kfree Skb IP Prot";
DROP VIEW IF EXISTS device_per_core_ingress_traffic;
CREATE VIEW device_per_core_ingress_traffic AS
SELECT
dev,
AndroidNetworkMetric_CorePacketStatistic(
'id', cpu,
'packet_statistic', AndroidNetworkMetric_PacketStatistic(
'packets', COUNT(1),
'bytes', SUM(len),
'first_packet_timestamp_ns', MIN(ts),
'last_packet_timestamp_ns', MAX(ts),
'interval_ns', IIF((MAX(ts) - MIN(ts)) > 10000000, MAX(ts) - MIN(ts), 10000000),
'data_rate_kbps', (SUM(len) * 8) / (IIF((MAX(ts) - MIN(ts)) > 10000000, MAX(ts) - MIN(ts), 10000000) / 1e9) / 1024
)
) AS proto
FROM rx_packets
GROUP BY dev, cpu;
DROP VIEW IF EXISTS device_per_core_egress_traffic;
CREATE VIEW device_per_core_egress_traffic AS
SELECT
dev,
AndroidNetworkMetric_CorePacketStatistic(
'id', cpu,
'packet_statistic', AndroidNetworkMetric_PacketStatistic(
'packets', COUNT(1),
'bytes', SUM(len),
'first_packet_timestamp_ns', MIN(ts),
'last_packet_timestamp_ns', MAX(ts),
'interval_ns', IIF((MAX(ts) - MIN(ts)) > 10000000, MAX(ts) - MIN(ts), 10000000),
'data_rate_kbps', (SUM(len) * 8) / (IIF((MAX(ts) - MIN(ts)) > 10000000, MAX(ts) - MIN(ts), 10000000) / 1e9) / 1024
)
) AS proto
FROM tx_packets
GROUP BY dev, cpu;
DROP VIEW IF EXISTS device_total_ingress_traffic;
CREATE VIEW device_total_ingress_traffic AS
SELECT
dev,
MIN(ts) AS start_ts,
MAX(ts) AS end_ts,
IIF((MAX(ts) - MIN(ts)) > 10000000, MAX(ts) - MIN(ts), 10000000) AS interval,
COUNT(1) AS packets,
SUM(len) AS bytes
FROM rx_packets
GROUP BY dev;
DROP VIEW IF EXISTS device_total_egress_traffic;
CREATE VIEW device_total_egress_traffic AS
SELECT
dev,
MIN(ts) AS start_ts,
MAX(ts) AS end_ts,
IIF((MAX(ts) - MIN(ts)) > 10000000, MAX(ts) - MIN(ts), 10000000) AS interval,
COUNT(1) AS packets,
SUM(len) AS bytes
FROM tx_packets
GROUP BY dev;
DROP VIEW IF EXISTS device_traffic_statistic;
CREATE VIEW device_traffic_statistic AS
SELECT
AndroidNetworkMetric_NetDevice(
'name', net_devices.dev,
'rx', (
SELECT
AndroidNetworkMetric_Rx(
'total', AndroidNetworkMetric_PacketStatistic(
'packets', packets,
'bytes', bytes,
'first_packet_timestamp_ns', start_ts,
'last_packet_timestamp_ns', end_ts,
'interval_ns', interval,
'data_rate_kbps', (bytes * 8) / (interval / 1e9) / 1024
),
'core', (
SELECT
RepeatedField(proto)
FROM device_per_core_ingress_traffic
WHERE device_per_core_ingress_traffic.dev = device_total_ingress_traffic.dev
),
'gro_aggregation_ratio', (
SELECT
CASE
WHEN packets > 0 THEN '1:' || CAST((cnt * 1.0 / packets) AS text)
ELSE '0:' || cnt
END
FROM gro_rx_packet_count
WHERE gro_rx_packet_count.dev = net_devices.dev
)
)
FROM device_total_ingress_traffic
WHERE device_total_ingress_traffic.dev = net_devices.dev
),
'tx', (
SELECT
AndroidNetworkMetric_Tx(
'total', AndroidNetworkMetric_PacketStatistic(
'packets', packets,
'bytes', bytes,
'first_packet_timestamp_ns', start_ts,
'last_packet_timestamp_ns', end_ts,
'interval_ns', interval,
'data_rate_kbps', (bytes * 8) / (interval / 1e9) / 1024
),
'core', (
SELECT
RepeatedField(proto)
FROM device_per_core_egress_traffic
WHERE device_per_core_egress_traffic.dev = device_total_egress_traffic.dev
)
)
FROM device_total_egress_traffic
WHERE device_total_egress_traffic.dev = net_devices.dev
)
) AS proto
FROM net_devices
ORDER BY dev;
DROP VIEW IF EXISTS net_rx_actions;
CREATE VIEW net_rx_actions AS
SELECT
s.ts,
s.dur,
CAST(SUBSTR(t.name, 13, 1) AS int) AS cpu
FROM slice s
LEFT JOIN track t
ON s.track_id = t.id
WHERE s.name = "NET_RX";
DROP VIEW IF EXISTS net_tx_actions;
CREATE VIEW net_tx_actions AS
SELECT
s.ts,
s.dur,
CAST(SUBSTR(t.name, 13, 1) AS int) AS cpu
FROM slice s
LEFT JOIN track t
ON s.track_id = t.id
WHERE s.name = "NET_TX";
DROP VIEW IF EXISTS ipi_actions;
CREATE VIEW ipi_actions AS
SELECT
s.ts,
s.dur,
CAST(SUBSTR(t.name, 13, 1) AS int) AS cpu
FROM slice s
LEFT JOIN track t
ON s.track_id = t.id
WHERE s.name = "IRQ (IPI)";
DROP VIEW IF EXISTS cpu_freq_view;
CREATE VIEW cpu_freq_view AS
SELECT
cpu,
ts,
LEAD(ts, 1, (SELECT end_ts FROM trace_bounds))
OVER (PARTITION BY cpu ORDER BY ts) - ts AS dur,
CAST(value AS INT) AS freq_khz
FROM counter
JOIN cpu_counter_track ON counter.track_id = cpu_counter_track.id
WHERE name = 'cpufreq';
DROP TABLE IF EXISTS cpu_freq_net_rx_action_per_core;
CREATE VIRTUAL TABLE cpu_freq_net_rx_action_per_core
USING SPAN_LEFT_JOIN(net_rx_actions PARTITIONED cpu, cpu_freq_view PARTITIONED cpu);
DROP TABLE IF EXISTS cpu_freq_net_tx_action_per_core;
CREATE VIRTUAL TABLE cpu_freq_net_tx_action_per_core
USING SPAN_LEFT_JOIN(net_tx_actions PARTITIONED cpu, cpu_freq_view PARTITIONED cpu);
DROP VIEW IF EXISTS total_net_rx_action_statistic;
CREATE VIEW total_net_rx_action_statistic AS
SELECT
COUNT(1) AS times,
SUM(dur) AS runtime,
AVG(dur) AS avg_runtime,
(SELECT COUNT(1) FROM rx_packets) AS total_packet
FROM net_rx_actions;
DROP VIEW IF EXISTS total_net_tx_action_statistic;
CREATE VIEW total_net_tx_action_statistic AS
SELECT
COUNT(1) AS times,
SUM(dur) AS runtime,
AVG(dur) AS avg_runtime
FROM net_tx_actions;
DROP VIEW IF EXISTS total_ipi_action_statistic;
CREATE VIEW total_ipi_action_statistic AS
SELECT
COUNT(1) AS times,
SUM(dur) AS runtime,
AVG(dur) AS avg_runtime
FROM ipi_actions;
DROP VIEW IF EXISTS activated_cores_net_rx;
CREATE VIEW activated_cores_net_rx AS
SELECT DISTINCT
cpu
FROM net_rx_actions;
DROP VIEW IF EXISTS activated_cores_net_tx;
CREATE VIEW activated_cores_net_tx AS
SELECT DISTINCT
cpu
FROM net_tx_actions;
DROP VIEW IF EXISTS per_core_net_rx_action_statistic;
CREATE VIEW per_core_net_rx_action_statistic AS
SELECT
AndroidNetworkMetric_CoreNetRxActionStatistic(
'id', cpu,
'net_rx_action_statistic', AndroidNetworkMetric_NetRxActionStatistic(
'count', (SELECT COUNT(1) FROM net_rx_actions AS na WHERE na.cpu = ac.cpu),
'runtime_ms', (SELECT SUM(dur) / 1e6 FROM net_rx_actions AS na WHERE na.cpu = ac.cpu),
'avg_runtime_ms', (SELECT AVG(dur) / 1e6 FROM net_rx_actions AS na WHERE na.cpu = ac.cpu),
'avg_freq_khz', (SELECT SUM(dur * freq_khz) / SUM(dur) FROM cpu_freq_net_rx_action_per_core AS cc WHERE cc.cpu = ac.cpu),
'mcycles', (SELECT CAST(SUM(dur * freq_khz / 1000) / 1e9 AS INT) FROM cpu_freq_net_rx_action_per_core AS cc WHERE cc.cpu = ac.cpu)
)
) AS proto
FROM activated_cores_net_rx AS ac;
DROP VIEW IF EXISTS per_core_net_tx_action_statistic;
CREATE VIEW per_core_net_tx_action_statistic AS
SELECT
AndroidNetworkMetric_CoreNetTxActionStatistic(
'id', cpu,
'net_tx_action_statistic', AndroidNetworkMetric_NetTxActionStatistic(
'count', (SELECT COUNT(1) FROM net_tx_actions AS na WHERE na.cpu = ac.cpu),
'runtime_ms', (SELECT SUM(dur) / 1e6 FROM net_tx_actions AS na WHERE na.cpu = ac.cpu),
'avg_runtime_ms', (SELECT AVG(dur) / 1e6 FROM net_tx_actions AS na WHERE na.cpu = ac.cpu),
'avg_freq_khz', (SELECT SUM(dur * freq_khz) / SUM(dur) FROM cpu_freq_net_tx_action_per_core AS cc WHERE cc.cpu = ac.cpu),
'mcycles', (SELECT CAST(SUM(dur * freq_khz / 1000) / 1e9 AS INT) FROM cpu_freq_net_tx_action_per_core AS cc WHERE cc.cpu = ac.cpu)
)
) AS proto
FROM activated_cores_net_tx AS ac;
DROP VIEW IF EXISTS android_netperf_output;
CREATE VIEW android_netperf_output AS
SELECT AndroidNetworkMetric(
'net_devices', (
SELECT
RepeatedField(proto)
FROM device_traffic_statistic
),
'net_rx_action', AndroidNetworkMetric_NetRxAction(
'total', AndroidNetworkMetric_NetRxActionStatistic(
'count', (SELECT times FROM total_net_rx_action_statistic),
'runtime_ms', (SELECT runtime / 1e6 FROM total_net_rx_action_statistic),
'avg_runtime_ms', (SELECT avg_runtime / 1e6 FROM total_net_rx_action_statistic),
'avg_freq_khz', (SELECT SUM(dur * freq_khz) / SUM(dur) FROM cpu_freq_net_rx_action_per_core),
'mcycles', (SELECT CAST(SUM(dur * freq_khz / 1000) / 1e9 AS INT) FROM cpu_freq_net_rx_action_per_core)
),
'core', (
SELECT
RepeatedField(proto)
FROM per_core_net_rx_action_statistic
),
'avg_interstack_latency_ms', (
SELECT
runtime / total_packet / 1e6
FROM total_net_rx_action_statistic
)
),
'retransmission_rate', (
SELECT
(SELECT cnt FROM tcp_retransmitted_count) * 100.0 / COUNT(1)
FROM tx_packets
),
'kfree_skb_rate', (
SELECT
cnt * 100.0 / ((SELECT count(1) FROM rx_packets) + (SELECT count(1) FROM tx_packets))
FROM kfree_skb_count
),
'net_tx_action', AndroidNetworkMetric_NetTxAction(
'total', AndroidNetworkMetric_NetTxActionStatistic(
'count', (SELECT times FROM total_net_tx_action_statistic),
'runtime_ms', (SELECT runtime / 1e6 FROM total_net_tx_action_statistic),
'avg_runtime_ms', (SELECT avg_runtime / 1e6 FROM total_net_tx_action_statistic),
'avg_freq_khz', (SELECT SUM(dur * freq_khz) / SUM(dur) FROM cpu_freq_net_tx_action_per_core),
'mcycles', (SELECT CAST(SUM(dur * freq_khz / 1000) / 1e9 AS INT) FROM cpu_freq_net_tx_action_per_core)
),
'core', (
SELECT
RepeatedField(proto)
FROM per_core_net_tx_action_statistic
)
),
'ipi_action', AndroidNetworkMetric_IpiAction(
'total', AndroidNetworkMetric_IpiActionStatistic(
'count', (SELECT times FROM total_ipi_action_statistic),
'runtime_ms', (SELECT runtime / 1e6 FROM total_ipi_action_statistic),
'avg_runtime_ms', (SELECT avg_runtime / 1e6 FROM total_ipi_action_statistic)
)
)
);