• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1--
2-- Copyright 2019 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--
16
17SELECT RUN_METRIC('android/process_oom_score.sql');
18
19-- All LMK events ordered by timestamp
20DROP TABLE IF EXISTS lmk_events;
21CREATE TABLE lmk_events AS
22WITH raw_events AS (
23  SELECT ref AS upid, MIN(ts) AS ts
24  FROM instants
25  WHERE name = 'mem.lmk' AND ref_type = 'upid'
26  GROUP BY 1
27)
28SELECT
29  raw_events.ts,
30  raw_events.upid,
31  oom_scores.oom_score_val AS score
32FROM raw_events
33LEFT JOIN oom_score_span oom_scores
34  ON (raw_events.upid = oom_scores.upid AND
35      raw_events.ts >= oom_scores.ts AND
36      raw_events.ts < oom_scores.ts + oom_scores.dur)
37ORDER BY 1;
38
39DROP VIEW IF EXISTS android_lmk_event;
40CREATE VIEW android_lmk_event AS
41WITH raw_events AS (
42  SELECT
43      ts,
44      LEAD(ts) OVER (ORDER BY ts) - ts AS dur,
45      CAST(value AS INTEGER) AS pid
46    FROM counter c
47    JOIN counter_track t ON t.id = c.track_id
48    WHERE t.name = 'kill_one_process'
49  UNION ALL
50  SELECT
51      slice.ts,
52      slice.dur,
53      CAST(STR_SPLIT(slice.name, ",", 1) AS INTEGER) AS pid
54    FROM slice
55    WHERE slice.name GLOB 'lmk,*'
56),
57lmks_with_proc_name AS (
58  SELECT
59    *,
60    process.name as process_name
61  FROM raw_events
62  LEFT JOIN process ON
63    process.pid = raw_events.pid
64    AND (raw_events.ts >= process.start_ts OR process.start_ts IS NULL)
65    AND (raw_events.ts < process.end_ts OR process.end_ts IS NULL)
66  WHERE raw_events.pid != 0
67)
68SELECT
69  'slice' as track_type,
70  'Low Memory Kills (LMKs)' as track_name,
71  ts,
72  dur,
73  CASE
74    WHEN process_name IS NULL THEN printf('Process %d', lmk.pid)
75    ELSE printf('%s (pid: %d)', process_name, lmk.pid)
76  END AS slice_name
77FROM lmks_with_proc_name as lmk;
78
79DROP VIEW IF EXISTS android_lmk_output;
80CREATE VIEW android_lmk_output AS
81WITH lmk_counts AS (
82  SELECT score, COUNT(1) AS count
83  FROM lmk_events
84  GROUP BY score
85)
86SELECT AndroidLmkMetric(
87  'total_count', (SELECT COUNT(1) FROM lmk_events),
88  'by_oom_score', (
89    SELECT
90      RepeatedField(AndroidLmkMetric_ByOomScore(
91        'oom_score_adj', score,
92        'count', count
93      ))
94    FROM lmk_counts
95    WHERE score IS NOT NULL
96  ),
97  'oom_victim_count', (
98    SELECT COUNT(1) FROM instants WHERE name = 'mem.oom_kill'
99  )
100);
101