| -- |
| -- 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) |
| ) |
| ) |
| ); |