1-- 2-- Copyright 2024 The Android Open Source Project 3-- 4-- Licensed under the Apache License, Version 2.0 (the "License"); 5-- you may not use this file except in compliance with the License. 6-- You may obtain a copy of the License at 7-- 8-- https://www.apache.org/licenses/LICENSE-2.0 9-- 10-- Unless required by applicable law or agreed to in writing, software 11-- distributed under the License is distributed on an "AS IS" BASIS, 12-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13-- See the License for the specific language governing permissions and 14-- limitations under the License. 15-- 16INCLUDE PERFETTO MODULE android.oom_adjuster; 17 18DROP VIEW IF EXISTS android_oom_adj_intervals_with_detailed_bucket_name; 19CREATE PERFETTO VIEW android_oom_adj_intervals_with_detailed_bucket_name ( 20 -- Timestamp the oom_adj score of the process changed 21 ts INT, 22 -- Duration until the next oom_adj score change of the process. 23 dur INT, 24 -- oom_adj score of the process. 25 score INT, 26 -- oom_adj bucket of the process. 27 bucket STRING, 28 -- Upid of the process having an oom_adj update. 29 upid INT, 30 -- Name of the process having an oom_adj update. 31 process_name STRING, 32 -- Slice id of the latest oom_adj update in the system_server. 33 oom_adj_id INT, 34 -- Timestamp of the latest oom_adj update in the system_server. 35 oom_adj_ts INT, 36 -- Duration of the latest oom_adj update in the system_server. 37 oom_adj_dur INT, 38 -- Track id of the latest oom_adj update in the system_server 39 oom_adj_track_id INT, 40 -- Thread name of the latest oom_adj update in the system_server. 41 oom_adj_thread_name STRING, 42 -- Reason for the latest oom_adj update in the system_server. 43 oom_adj_reason STRING, 44 -- Trigger for the latest oom_adj update in the system_server. 45 oom_adj_trigger STRING 46 ) AS 47SELECT 48 ts, 49 dur, 50 score, 51 android_oom_adj_score_to_detailed_bucket_name(score, android_appid) AS bucket, 52 upid, 53 process_name, 54 oom_adj_id, 55 oom_adj_ts, 56 oom_adj_dur, 57 oom_adj_track_id, 58 oom_adj_thread_name, 59 oom_adj_reason, 60 oom_adj_trigger 61FROM _oom_adjuster_intervals; 62 63DROP TABLE IF EXISTS _oom_adj_events_with_src_bucket; 64CREATE PERFETTO TABLE _oom_adj_events_with_src_bucket 65AS 66SELECT 67 LAG(bucket) OVER (PARTITION BY upid ORDER BY ts) AS src_bucket, 68 ts, 69 bucket, 70 process_name, 71 oom_adj_reason 72FROM android_oom_adj_intervals_with_detailed_bucket_name; 73 74DROP VIEW IF EXISTS oom_adj_events_by_process_name; 75CREATE PERFETTO VIEW oom_adj_events_by_process_name AS 76SELECT 77 src_bucket, 78 bucket, 79 count(ts) as count, 80 process_name 81FROM _oom_adj_events_with_src_bucket 82GROUP BY process_name, bucket, src_bucket; 83 84DROP VIEW IF EXISTS oom_adj_events_global_by_bucket; 85CREATE PERFETTO VIEW oom_adj_events_global_by_bucket AS 86SELECT 87 src_bucket, 88 bucket, 89 count(ts) as count, 90 NULL as name 91FROM _oom_adj_events_with_src_bucket 92GROUP BY bucket, src_bucket; 93 94DROP VIEW IF EXISTS oom_adj_events_by_oom_adj_reason; 95CREATE PERFETTO VIEW oom_adj_events_by_oom_adj_reason AS 96SELECT 97 src_bucket, 98 bucket, 99 count(ts) as count, 100 oom_adj_reason as name 101FROM _oom_adj_events_with_src_bucket 102GROUP BY bucket, src_bucket, oom_adj_reason; 103 104DROP VIEW IF EXISTS android_oom_adjuster_output; 105CREATE PERFETTO VIEW android_oom_adjuster_output AS 106SELECT AndroidOomAdjusterMetric( 107 'oom_adjuster_transition_counts_by_process', ( 108 SELECT RepeatedField( 109 AndroidOomAdjusterMetric_OomAdjusterTransitionCounts( 110 'name', process_name, 111 'src_bucket', src_bucket, 112 'dest_bucket', bucket, 113 'count', count 114 ) 115 ) FROM oom_adj_events_by_process_name 116 ), 117 'oom_adjuster_transition_counts_global', ( 118 SELECT RepeatedField( 119 AndroidOomAdjusterMetric_OomAdjusterTransitionCounts( 120 'name', name, 121 'src_bucket', src_bucket, 122 'dest_bucket', bucket, 123 'count', count 124 ) 125 ) 126 FROM oom_adj_events_global_by_bucket 127 ), 128 'oom_adjuster_transition_counts_by_oom_adj_reason',( 129 SELECT RepeatedField( 130 AndroidOomAdjusterMetric_OomAdjusterTransitionCounts( 131 'name', name, 132 'src_bucket', src_bucket, 133 'dest_bucket', bucket, 134 'count', count 135 ) 136 ) 137 FROM oom_adj_events_by_oom_adj_reason 138 ), 139 'oom_adj_bucket_duration_agg_global',(SELECT RepeatedField( 140 AndroidOomAdjusterMetric_OomAdjBucketDurationAggregation( 141 'name', name, 142 'bucket', bucket, 143 'total_dur', total_dur 144 ) 145 ) 146 FROM ( 147 SELECT NULL as name, bucket, SUM(dur) as total_dur 148 FROM android_oom_adj_intervals_with_detailed_bucket_name GROUP BY bucket 149 ) 150 ), 151 'oom_adj_bucket_duration_agg_by_process',(SELECT RepeatedField( 152 AndroidOomAdjusterMetric_OomAdjBucketDurationAggregation( 153 'name', name, 154 'bucket', bucket, 155 'total_dur', total_dur 156 ) 157 ) 158 FROM ( 159 SELECT process_name as name, bucket, SUM(dur) as total_dur 160 FROM android_oom_adj_intervals_with_detailed_bucket_name 161 WHERE process_name IS NOT NULL 162 GROUP BY process_name, bucket 163 ) 164 ), 165 'oom_adj_duration_agg', (SELECT RepeatedField( 166 AndroidOomAdjusterMetric_OomAdjDurationAggregation( 167 'min_oom_adj_dur', min_oom_adj_dur, 168 'max_oom_adj_dur', max_oom_adj_dur, 169 'avg_oom_adj_dur', avg_oom_adj_dur, 170 'oom_adj_event_count', oom_adj_event_count, 171 'oom_adj_reason', oom_adj_reason 172 ) 173 ) 174 FROM ( 175 SELECT 176 MIN(oom_adj_dur) as min_oom_adj_dur, 177 MAX(oom_adj_dur) as max_oom_adj_dur, 178 AVG(oom_adj_dur) as avg_oom_adj_dur, 179 COUNT(DISTINCT(oom_adj_id)) oom_adj_event_count, 180 oom_adj_reason 181 FROM android_oom_adj_intervals_with_detailed_bucket_name GROUP BY oom_adj_reason 182 ) 183 ) 184); 185