Skip to content

Commit d84e933

Browse files
authored
Introduce heap_graph_stats stdlib module, dmabuf support and rebase the metric (#3907)
Bug: 457430078
1 parent b7b5581 commit d84e933

File tree

14 files changed

+208
-146
lines changed

14 files changed

+208
-146
lines changed

Android.bp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15323,13 +15323,15 @@ genrule {
1532315323
"src/trace_processor/perfetto_sql/stdlib/android/job_scheduler_states.sql",
1532415324
"src/trace_processor/perfetto_sql/stdlib/android/kernel_wakelocks.sql",
1532515325
"src/trace_processor/perfetto_sql/stdlib/android/memory/dmabuf.sql",
15326+
"src/trace_processor/perfetto_sql/stdlib/android/memory/dmabuf_spans.sql",
1532615327
"src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/class_relationship.sql",
1532715328
"src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/class_summary_tree.sql",
1532815329
"src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/class_tree.sql",
1532915330
"src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/dominator_class_tree.sql",
1533015331
"src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/dominator_tree.sql",
1533115332
"src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/excluded_refs.sql",
1533215333
"src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/heap_graph_class_aggregation.sql",
15334+
"src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/heap_graph_stats.sql",
1533315335
"src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/helpers.sql",
1533415336
"src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/raw_dominator_tree.sql",
1533515337
"src/trace_processor/perfetto_sql/stdlib/android/memory/heap_profile/callstacks.sql",

BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3359,6 +3359,7 @@ perfetto_filegroup(
33593359
"src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/dominator_tree.sql",
33603360
"src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/excluded_refs.sql",
33613361
"src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/heap_graph_class_aggregation.sql",
3362+
"src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/heap_graph_stats.sql",
33623363
"src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/helpers.sql",
33633364
"src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/raw_dominator_tree.sql",
33643365
],
@@ -3378,6 +3379,7 @@ perfetto_filegroup(
33783379
name = "src_trace_processor_perfetto_sql_stdlib_android_memory_memory",
33793380
srcs = [
33803381
"src/trace_processor/perfetto_sql/stdlib/android/memory/dmabuf.sql",
3382+
"src/trace_processor/perfetto_sql/stdlib/android/memory/dmabuf_spans.sql",
33813383
"src/trace_processor/perfetto_sql/stdlib/android/memory/lmk.sql",
33823384
"src/trace_processor/perfetto_sql/stdlib/android/memory/process.sql",
33833385
],

protos/perfetto/metrics/android/java_heap_stats.proto

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,10 @@ package perfetto.protos;
2020
import "protos/perfetto/metrics/android/process_metadata.proto";
2121

2222
message JavaHeapStats {
23-
message HeapRoots {
24-
optional string root_type = 1;
25-
optional string type_name = 2;
26-
optional int64 obj_count = 3;
27-
}
23+
// Was repeated HeapRoots roots = 7;
24+
reserved 7;
2825

29-
// Next id: 12
26+
// Next id: 13
3027
message Sample {
3128
optional int64 ts = 1;
3229
// Size of the Java heap in bytes
@@ -42,9 +39,8 @@ message JavaHeapStats {
4239
optional int64 reachable_obj_count = 5;
4340
// Sum of anonymous RSS + swap pages in bytes.
4441
optional int64 anon_rss_and_swap_size = 6;
42+
optional int64 dmabuf_rss_size = 12;
4543

46-
// ART root objects
47-
repeated HeapRoots roots = 7;
4844
// OOM adjustment score
4945
optional int64 oom_score_adj = 10;
5046
// Process uptime in millis at the time of the heap dump

protos/perfetto/metrics/perfetto_merged_metrics.proto

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1897,13 +1897,10 @@ message JavaHeapHistogram {
18971897
// Begin of protos/perfetto/metrics/android/java_heap_stats.proto
18981898

18991899
message JavaHeapStats {
1900-
message HeapRoots {
1901-
optional string root_type = 1;
1902-
optional string type_name = 2;
1903-
optional int64 obj_count = 3;
1904-
}
1900+
// Was repeated HeapRoots roots = 7;
1901+
reserved 7;
19051902

1906-
// Next id: 12
1903+
// Next id: 13
19071904
message Sample {
19081905
optional int64 ts = 1;
19091906
// Size of the Java heap in bytes
@@ -1919,9 +1916,8 @@ message JavaHeapStats {
19191916
optional int64 reachable_obj_count = 5;
19201917
// Sum of anonymous RSS + swap pages in bytes.
19211918
optional int64 anon_rss_and_swap_size = 6;
1919+
optional int64 dmabuf_rss_size = 12;
19221920

1923-
// ART root objects
1924-
repeated HeapRoots roots = 7;
19251921
// OOM adjustment score
19261922
optional int64 oom_score_adj = 10;
19271923
// Process uptime in millis at the time of the heap dump

python/perfetto/trace_processor/metrics.descriptor

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -870,14 +870,10 @@ type_count ( 2-.perfetto.protos.JavaHeapClassStats.TypeCountR typeCount
870870
upid (RupidA
871871
process ( 2'.perfetto.protos.AndroidProcessMetadataRprocessD
872872
samples ( 2*.perfetto.protos.JavaHeapClassStats.SampleRsamples
873-

874-
5protos/perfetto/metrics/android/java_heap_stats.protoperfetto.protos6protos/perfetto/metrics/android/process_metadata.proto"�
873+

874+
5protos/perfetto/metrics/android/java_heap_stats.protoperfetto.protos6protos/perfetto/metrics/android/process_metadata.proto"�
875875
JavaHeapStatsS
876-
instance_stats ( 2,.perfetto.protos.JavaHeapStats.InstanceStatsRinstanceStatsb
877-
HeapRoots
878-
root_type ( RrootType
879-
type_name ( RtypeName
880-
obj_count (RobjCount�
876+
instance_stats ( 2,.perfetto.protos.JavaHeapStats.InstanceStatsRinstanceStats�
881877
Sample
882878
ts (Rts
883879
heap_size (RheapSize(
@@ -886,15 +882,15 @@ type_count ( 2-.perfetto.protos.JavaHeapClassStats.TypeCountR typeCount
886882
reachable_heap_size (RreachableHeapSize;
887883
reachable_heap_native_size (RreachableHeapNativeSize.
888884
reachable_obj_count (RreachableObjCount2
889-
anon_rss_and_swap_size (RanonRssAndSwapSize>
890-
roots ( 2(.perfetto.protos.JavaHeapStats.HeapRootsRroots"
885+
anon_rss_and_swap_size (RanonRssAndSwapSize&
886+
dmabuf_rss_size (RdmabufRssSize"
891887
oom_score_adj
892888
(R oomScoreAdj*
893889
process_uptime_ms (RprocessUptimeMs�
894890
InstanceStats
895891
upid (RupidA
896892
process ( 2'.perfetto.protos.AndroidProcessMetadataRprocess?
897-
samples ( 2%.perfetto.protos.JavaHeapStats.SampleRsamples
893+
samples ( 2%.perfetto.protos.JavaHeapStats.SampleRsamplesJ
898894
�
899895
0protos/perfetto/metrics/android/lmk_metric.protoperfetto.protos"�
900896
AndroidLmkMetric

src/trace_processor/metrics/sql/android/java_heap_stats.sql

Lines changed: 11 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -14,119 +14,30 @@
1414
-- limitations under the License.
1515
--
1616

17+
INCLUDE PERFETTO MODULE android.memory.heap_graph.heap_graph_stats;
1718
SELECT RUN_METRIC('android/process_metadata.sql');
18-
SELECT RUN_METRIC('android/process_mem.sql');
1919

2020
DROP VIEW IF EXISTS java_heap_stats_output;
2121
CREATE PERFETTO VIEW java_heap_stats_output AS
2222
WITH
23-
-- Base view
24-
base_stat_counts AS (
25-
SELECT
26-
upid,
27-
graph_sample_ts,
28-
SUM(self_size) AS total_size,
29-
SUM(native_size) AS total_native_size,
30-
COUNT(1) AS total_obj_count,
31-
SUM(IIF(reachable, self_size, 0)) AS reachable_size,
32-
SUM(IIF(reachable, native_size, 0)) AS reachable_native_size,
33-
SUM(IIF(reachable, 1, 0)) AS reachable_obj_count
34-
FROM heap_graph_object
35-
GROUP BY 1, 2
36-
),
37-
heap_roots AS (
38-
SELECT
39-
upid,
40-
graph_sample_ts,
41-
root_type,
42-
IFNULL(t.deobfuscated_name, t.name) AS type_name,
43-
COUNT(1) AS obj_count
44-
FROM heap_graph_object o
45-
JOIN heap_graph_class t ON o.type_id = t.id
46-
-- Classes are going to be particularly spammy and uninteresting
47-
-- from a memory analysis perspective (compared e.g. to local jni roots)
48-
WHERE root_type IS NOT NULL AND root_type != 'ROOT_STICKY_CLASS'
49-
GROUP BY 1, 2, 3, 4
50-
ORDER BY obj_count DESC
51-
),
52-
heap_roots_proto AS (
53-
SELECT
54-
upid,
55-
graph_sample_ts,
56-
RepeatedField(JavaHeapStats_HeapRoots(
57-
'root_type', root_type,
58-
'type_name', type_name,
59-
'obj_count', obj_count
60-
)) AS roots
61-
FROM heap_roots
62-
GROUP BY 1, 2
63-
),
64-
base_stats AS (
65-
SELECT * FROM base_stat_counts JOIN heap_roots_proto USING (upid, graph_sample_ts)
66-
),
67-
-- Find closest value
68-
closest_anon_swap_oom AS (
69-
SELECT
70-
upid,
71-
graph_sample_ts,
72-
(
73-
SELECT anon_swap_val
74-
FROM (
75-
SELECT
76-
ts, dur,
77-
CAST(anon_and_swap_val AS INTEGER) AS anon_swap_val,
78-
ABS(ts - base_stats.graph_sample_ts) AS diff
79-
FROM anon_and_swap_span
80-
WHERE upid = base_stats.upid)
81-
WHERE
82-
(graph_sample_ts >= ts AND graph_sample_ts < ts + dur)
83-
-- If the first memory sample for the UPID comes *after* the heap profile
84-
-- accept it if close (500ms)
85-
OR (graph_sample_ts < ts AND diff <= 500 * 1e6)
86-
ORDER BY diff LIMIT 1
87-
) AS anon_swap_val,
88-
(
89-
SELECT oom_score_val
90-
FROM (
91-
SELECT
92-
ts, dur,
93-
oom_score_val,
94-
ABS(ts - base_stats.graph_sample_ts) AS diff
95-
FROM oom_score_span
96-
WHERE upid = base_stats.upid)
97-
WHERE
98-
(graph_sample_ts >= ts AND graph_sample_ts < ts + dur)
99-
-- If the first memory sample for the UPID comes *after* the heap profile
100-
-- accept it if close (500ms)
101-
OR (graph_sample_ts < ts AND diff <= 500 * 1e6)
102-
ORDER BY diff LIMIT 1
103-
) AS oom_score_val
104-
FROM base_stats
105-
),
10623
-- Group by upid
10724
heap_graph_sample_protos AS (
10825
SELECT
109-
base_stats.upid,
26+
upid,
11027
RepeatedField(JavaHeapStats_Sample(
11128
'ts', graph_sample_ts,
112-
'process_uptime_ms',
113-
CASE WHEN process.start_ts IS NOT NULL
114-
THEN (graph_sample_ts - process.start_ts) / 1000000
115-
ELSE NULL
116-
END,
117-
'heap_size', total_size,
118-
'heap_native_size', total_native_size,
29+
'process_uptime_ms', process_uptime / 1e6,
30+
'heap_size', total_heap_size,
31+
'heap_native_size', total_native_alloc_registry_size,
11932
'obj_count', total_obj_count,
120-
'reachable_heap_size', reachable_size,
121-
'reachable_heap_native_size', reachable_native_size,
33+
'reachable_heap_size', reachable_heap_size,
34+
'reachable_heap_native_size', reachable_native_alloc_registry_size,
12235
'reachable_obj_count', reachable_obj_count,
123-
'roots', roots,
124-
'anon_rss_and_swap_size', closest_anon_swap_oom.anon_swap_val,
125-
'oom_score_adj', closest_anon_swap_oom.oom_score_val
36+
'oom_score_adj', oom_score_adj,
37+
'anon_rss_and_swap_size', anon_rss_and_swap_size,
38+
'dmabuf_rss_size', dmabuf_rss_size
12639
)) AS sample_protos
127-
FROM base_stats
128-
JOIN process USING (upid)
129-
LEFT JOIN closest_anon_swap_oom USING (upid, graph_sample_ts)
40+
FROM android_heap_graph_stats
13041
GROUP BY 1
13142
)
13243
SELECT JavaHeapStats(

src/trace_processor/perfetto_sql/stdlib/android/memory/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ perfetto_sql_source_set("memory") {
2121
]
2222
sources = [
2323
"dmabuf.sql",
24+
"dmabuf_spans.sql",
2425
"lmk.sql",
2526
"process.sql",
2627
]
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
--
2+
-- Copyright 2025 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+
17+
INCLUDE PERFETTO MODULE counters.intervals;
18+
19+
CREATE PERFETTO TABLE _dmabuf_spans AS
20+
WITH
21+
dmabuf_track AS (
22+
SELECT
23+
counter.*
24+
FROM counter
25+
JOIN counter_track AS track
26+
ON track.id = counter.track_id AND track.name = 'mem.dmabuf_rss'
27+
)
28+
SELECT
29+
upid,
30+
ts,
31+
dur,
32+
CAST(value AS INTEGER) AS dmabuf_rss
33+
FROM counter_leading_intervals!(dmabuf_track) AS dmabuf_counter
34+
JOIN process_counter_track
35+
ON dmabuf_counter.track_id = process_counter_track.id;

src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ perfetto_sql_source_set("heap_graph") {
2323
"dominator_tree.sql",
2424
"excluded_refs.sql",
2525
"heap_graph_class_aggregation.sql",
26+
"heap_graph_stats.sql",
2627
"helpers.sql",
2728
"raw_dominator_tree.sql",
2829
]

0 commit comments

Comments
 (0)