Adds protos for memory dump.
Adds memory_graph.proto and extends process_stats.proto, smaps.proto to serialize data needed due to Memory-infra migration to Perfetto. See crbug.com/1098746 for more details.
Bug: 1098746
Change-Id: I6c395b485f7fadd27e6d933e928db18a9ac2177b
diff --git a/Android.bp b/Android.bp
index a682da4..8297abb 100644
--- a/Android.bp
+++ b/Android.bp
@@ -4626,6 +4626,7 @@
name: "perfetto_protos_perfetto_trace_non_minimal_cpp_gen",
srcs: [
"protos/perfetto/trace/extension_descriptor.proto",
+ "protos/perfetto/trace/memory_graph.proto",
"protos/perfetto/trace/test_event.proto",
"protos/perfetto/trace/trace.proto",
"protos/perfetto/trace/trace_packet.proto",
@@ -4638,6 +4639,7 @@
cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --plugin=protoc-gen-plugin=$(location perfetto_src_protozero_protoc_plugin_cppgen_plugin) --plugin_out=wrapper_namespace=gen:$(genDir)/external/perfetto/ $(in)",
out: [
"external/perfetto/protos/perfetto/trace/extension_descriptor.gen.cc",
+ "external/perfetto/protos/perfetto/trace/memory_graph.gen.cc",
"external/perfetto/protos/perfetto/trace/test_event.gen.cc",
"external/perfetto/protos/perfetto/trace/trace.gen.cc",
"external/perfetto/protos/perfetto/trace/trace_packet.gen.cc",
@@ -4650,6 +4652,7 @@
name: "perfetto_protos_perfetto_trace_non_minimal_cpp_gen_headers",
srcs: [
"protos/perfetto/trace/extension_descriptor.proto",
+ "protos/perfetto/trace/memory_graph.proto",
"protos/perfetto/trace/test_event.proto",
"protos/perfetto/trace/trace.proto",
"protos/perfetto/trace/trace_packet.proto",
@@ -4662,6 +4665,7 @@
cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --plugin=protoc-gen-plugin=$(location perfetto_src_protozero_protoc_plugin_cppgen_plugin) --plugin_out=wrapper_namespace=gen:$(genDir)/external/perfetto/ $(in)",
out: [
"external/perfetto/protos/perfetto/trace/extension_descriptor.gen.h",
+ "external/perfetto/protos/perfetto/trace/memory_graph.gen.h",
"external/perfetto/protos/perfetto/trace/test_event.gen.h",
"external/perfetto/protos/perfetto/trace/trace.gen.h",
"external/perfetto/protos/perfetto/trace/trace_packet.gen.h",
@@ -4678,6 +4682,7 @@
name: "perfetto_protos_perfetto_trace_non_minimal_lite_gen",
srcs: [
"protos/perfetto/trace/extension_descriptor.proto",
+ "protos/perfetto/trace/memory_graph.proto",
"protos/perfetto/trace/test_event.proto",
"protos/perfetto/trace/trace.proto",
"protos/perfetto/trace/trace_packet.proto",
@@ -4689,6 +4694,7 @@
cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --cpp_out=lite=true:$(genDir)/external/perfetto/ $(in)",
out: [
"external/perfetto/protos/perfetto/trace/extension_descriptor.pb.cc",
+ "external/perfetto/protos/perfetto/trace/memory_graph.pb.cc",
"external/perfetto/protos/perfetto/trace/test_event.pb.cc",
"external/perfetto/protos/perfetto/trace/trace.pb.cc",
"external/perfetto/protos/perfetto/trace/trace_packet.pb.cc",
@@ -4701,6 +4707,7 @@
name: "perfetto_protos_perfetto_trace_non_minimal_lite_gen_headers",
srcs: [
"protos/perfetto/trace/extension_descriptor.proto",
+ "protos/perfetto/trace/memory_graph.proto",
"protos/perfetto/trace/test_event.proto",
"protos/perfetto/trace/trace.proto",
"protos/perfetto/trace/trace_packet.proto",
@@ -4712,6 +4719,7 @@
cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --cpp_out=lite=true:$(genDir)/external/perfetto/ $(in)",
out: [
"external/perfetto/protos/perfetto/trace/extension_descriptor.pb.h",
+ "external/perfetto/protos/perfetto/trace/memory_graph.pb.h",
"external/perfetto/protos/perfetto/trace/test_event.pb.h",
"external/perfetto/protos/perfetto/trace/trace.pb.h",
"external/perfetto/protos/perfetto/trace/trace_packet.pb.h",
@@ -4728,6 +4736,7 @@
name: "perfetto_protos_perfetto_trace_non_minimal_zero_gen",
srcs: [
"protos/perfetto/trace/extension_descriptor.proto",
+ "protos/perfetto/trace/memory_graph.proto",
"protos/perfetto/trace/test_event.proto",
"protos/perfetto/trace/trace.proto",
"protos/perfetto/trace/trace_packet.proto",
@@ -4740,6 +4749,7 @@
cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --plugin=protoc-gen-plugin=$(location protozero_plugin) --plugin_out=wrapper_namespace=pbzero:$(genDir)/external/perfetto/ $(in)",
out: [
"external/perfetto/protos/perfetto/trace/extension_descriptor.pbzero.cc",
+ "external/perfetto/protos/perfetto/trace/memory_graph.pbzero.cc",
"external/perfetto/protos/perfetto/trace/test_event.pbzero.cc",
"external/perfetto/protos/perfetto/trace/trace.pbzero.cc",
"external/perfetto/protos/perfetto/trace/trace_packet.pbzero.cc",
@@ -4752,6 +4762,7 @@
name: "perfetto_protos_perfetto_trace_non_minimal_zero_gen_headers",
srcs: [
"protos/perfetto/trace/extension_descriptor.proto",
+ "protos/perfetto/trace/memory_graph.proto",
"protos/perfetto/trace/test_event.proto",
"protos/perfetto/trace/trace.proto",
"protos/perfetto/trace/trace_packet.proto",
@@ -4764,6 +4775,7 @@
cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --plugin=protoc-gen-plugin=$(location protozero_plugin) --plugin_out=wrapper_namespace=pbzero:$(genDir)/external/perfetto/ $(in)",
out: [
"external/perfetto/protos/perfetto/trace/extension_descriptor.pbzero.h",
+ "external/perfetto/protos/perfetto/trace/memory_graph.pbzero.h",
"external/perfetto/protos/perfetto/trace/test_event.pbzero.h",
"external/perfetto/protos/perfetto/trace/trace.pbzero.h",
"external/perfetto/protos/perfetto/trace/trace_packet.pbzero.h",
diff --git a/BUILD b/BUILD
index d4b4045..1ad5aea 100644
--- a/BUILD
+++ b/BUILD
@@ -2372,6 +2372,7 @@
name = "protos_perfetto_trace_non_minimal_protos",
srcs = [
"protos/perfetto/trace/extension_descriptor.proto",
+ "protos/perfetto/trace/memory_graph.proto",
"protos/perfetto/trace/test_event.proto",
"protos/perfetto/trace/trace.proto",
"protos/perfetto/trace/trace_packet.proto",
diff --git a/protos/perfetto/trace/BUILD.gn b/protos/perfetto/trace/BUILD.gn
index 07ee972..0c39d63 100644
--- a/protos/perfetto/trace/BUILD.gn
+++ b/protos/perfetto/trace/BUILD.gn
@@ -32,6 +32,7 @@
"trace_packet.proto",
"trace.proto",
"extension_descriptor.proto",
+ "memory_graph.proto",
]
proto_sources_minimal = [
diff --git a/protos/perfetto/trace/memory_graph.proto b/protos/perfetto/trace/memory_graph.proto
new file mode 100644
index 0000000..2799c9b
--- /dev/null
+++ b/protos/perfetto/trace/memory_graph.proto
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2020 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
+ *
+ * http://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.
+ */
+
+syntax = "proto2";
+
+package perfetto.protos;
+
+message MemoryTrackerSnapshot {
+ // Memory snapshot of a process. The snapshot contains memory data that is
+ // from 2 different sources, namely system stats and instrumentation stats.
+ // The system memory usage stats come from the OS based on standard API
+ // available in the platform to query memory usage. The instrumentation stats
+ // are added by instrumenting specific piece of code which tracks memory
+ // allocations and deallocations made by a small sub-system within the
+ // application.
+ // The system stats of the global memory snapshot are recorded as part of
+ // ProcessStats and SmapsPacket fields in trace packet with the same
+ // timestamp.
+ message ProcessSnapshot {
+ // Process ID of the process
+ optional uint64 pid = 1;
+
+ // Memory dumps are represented as a graph of memory nodes which contain
+ // statistics. To avoid double counting the same memory across different
+ // nodes, edges are used to mark nodes that account for the same memory. See
+ // this doc for examples of the usage:
+ // https://docs.google.com/document/d/1WGQRJ1sjJrfVkNcgPVY6frm64UqPc94tsxUOXImZUZI
+
+ // A single node in the memory graph.
+ message MemoryNode {
+ // Unique ID of the node across all processes involved in the global
+ // memory dump. The ID is only unique within this particular global dump
+ // identified by GlobalMemoryDumpPacket.global_dump_id.
+ optional uint64 id = 1;
+
+ // Absolute name is a unique name for the memory node within the process
+ // with ProcessMemoryDump.pid. The name can contain multiple parts
+ // separated by '/', which traces the edges of the node from the root
+ // node.
+ // Eg: "partition_allocator/array_buffers/buffer1" refers to the child
+ // node "buffer1" in a graph structure of:
+ // root -> partition_allocator -> array_buffers -> buffer1.
+ optional string absolute_name = 2;
+
+ // A weak node means that the instrumentation that added the current node
+ // is unsure about the existence of the actual memory. Unless a "strong"
+ // (non-weak is default) node that has an edge to the current node exists
+ // in the current global dump, the current node will be discarded.
+ optional bool weak = 3;
+
+ // Entries in the memory node that contain statistics and additional
+ // debuggable information about the memory. The default entry is "size"
+ // which is used to compute the effective size of the nodes without double
+ // counting.
+ message MemoryNodeEntry {
+ optional string name = 1;
+
+ enum Units {
+ UNSPECIFIED = 0;
+ BYTES = 1;
+ COUNT = 2;
+ }
+ optional Units units = 2;
+
+ // Contains either one of uint64 or string value.
+ optional uint64 value_uint64 = 3;
+ optional string value_string = 4;
+ }
+ repeated MemoryNodeEntry entries = 4;
+ }
+ repeated MemoryNode allocator_dumps = 2;
+
+ // A directed edge that connects any 2 nodes in the graph above. These are
+ // in addition to the inherent edges added due to the tree structure of the
+ // node's absolute names.
+ // Node with id |source_id| owns the node with id |target_id|, and has the
+ // effect of attributing the memory usage of target to source. |importance|
+ // is optional and relevant only for the cases of co-ownership, where it
+ // acts as a z-index: the owner with the highest importance will be
+ // attributed target's memory.
+ message MemoryEdge {
+ optional uint64 source_id = 1;
+ optional uint64 target_id = 2;
+ optional uint32 importance = 3;
+ optional bool overridable = 4;
+ }
+ repeated MemoryEdge memory_edges = 3;
+ }
+
+ // Unique ID that represents the global memory dump.
+ optional uint64 global_dump_id = 1;
+
+ enum LevelOfDetail {
+ DETAIL_FULL = 0;
+ DETAIL_LIGHT = 1;
+ DETAIL_BACKGROUND = 2;
+ }
+ optional LevelOfDetail level_of_detail = 2;
+
+ repeated ProcessSnapshot process_memory_dumps = 3;
+}
diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto
index af6af01..22ce867 100644
--- a/protos/perfetto/trace/perfetto_trace.proto
+++ b/protos/perfetto/trace/perfetto_trace.proto
@@ -6315,6 +6315,105 @@
// End of protos/perfetto/trace/interned_data/interned_data.proto
+// Begin of protos/perfetto/trace/memory_graph.proto
+
+message MemoryTrackerSnapshot {
+ // Memory snapshot of a process. The snapshot contains memory data that is
+ // from 2 different sources, namely system stats and instrumentation stats.
+ // The system memory usage stats come from the OS based on standard API
+ // available in the platform to query memory usage. The instrumentation stats
+ // are added by instrumenting specific piece of code which tracks memory
+ // allocations and deallocations made by a small sub-system within the
+ // application.
+ // The system stats of the global memory snapshot are recorded as part of
+ // ProcessStats and SmapsPacket fields in trace packet with the same
+ // timestamp.
+ message ProcessSnapshot {
+ // Process ID of the process
+ optional uint64 pid = 1;
+
+ // Memory dumps are represented as a graph of memory nodes which contain
+ // statistics. To avoid double counting the same memory across different
+ // nodes, edges are used to mark nodes that account for the same memory. See
+ // this doc for examples of the usage:
+ // https://docs.google.com/document/d/1WGQRJ1sjJrfVkNcgPVY6frm64UqPc94tsxUOXImZUZI
+
+ // A single node in the memory graph.
+ message MemoryNode {
+ // Unique ID of the node across all processes involved in the global
+ // memory dump. The ID is only unique within this particular global dump
+ // identified by GlobalMemoryDumpPacket.global_dump_id.
+ optional uint64 id = 1;
+
+ // Absolute name is a unique name for the memory node within the process
+ // with ProcessMemoryDump.pid. The name can contain multiple parts
+ // separated by '/', which traces the edges of the node from the root
+ // node.
+ // Eg: "partition_allocator/array_buffers/buffer1" refers to the child
+ // node "buffer1" in a graph structure of:
+ // root -> partition_allocator -> array_buffers -> buffer1.
+ optional string absolute_name = 2;
+
+ // A weak node means that the instrumentation that added the current node
+ // is unsure about the existence of the actual memory. Unless a "strong"
+ // (non-weak is default) node that has an edge to the current node exists
+ // in the current global dump, the current node will be discarded.
+ optional bool weak = 3;
+
+ // Entries in the memory node that contain statistics and additional
+ // debuggable information about the memory. The default entry is "size"
+ // which is used to compute the effective size of the nodes without double
+ // counting.
+ message MemoryNodeEntry {
+ optional string name = 1;
+
+ enum Units {
+ UNSPECIFIED = 0;
+ BYTES = 1;
+ COUNT = 2;
+ }
+ optional Units units = 2;
+
+ // Contains either one of uint64 or string value.
+ optional uint64 value_uint64 = 3;
+ optional string value_string = 4;
+ }
+ repeated MemoryNodeEntry entries = 4;
+ }
+ repeated MemoryNode allocator_dumps = 2;
+
+ // A directed edge that connects any 2 nodes in the graph above. These are
+ // in addition to the inherent edges added due to the tree structure of the
+ // node's absolute names.
+ // Node with id |source_id| owns the node with id |target_id|, and has the
+ // effect of attributing the memory usage of target to source. |importance|
+ // is optional and relevant only for the cases of co-ownership, where it
+ // acts as a z-index: the owner with the highest importance will be
+ // attributed target's memory.
+ message MemoryEdge {
+ optional uint64 source_id = 1;
+ optional uint64 target_id = 2;
+ optional uint32 importance = 3;
+ optional bool overridable = 4;
+ }
+ repeated MemoryEdge memory_edges = 3;
+ }
+
+ // Unique ID that represents the global memory dump.
+ optional uint64 global_dump_id = 1;
+
+ enum LevelOfDetail {
+ DETAIL_FULL = 0;
+ DETAIL_LIGHT = 1;
+ DETAIL_BACKGROUND = 2;
+ }
+ optional LevelOfDetail level_of_detail = 2;
+
+ repeated ProcessSnapshot process_memory_dumps = 3;
+}
+
+// End of protos/perfetto/trace/memory_graph.proto
+
// Begin of protos/perfetto/trace/perfetto/perfetto_metatrace.proto
// Used to trace the execution of perfetto itself.
@@ -6784,6 +6883,22 @@
optional uint64 size_kb = 2;
optional uint64 private_dirty_kb = 3;
optional uint64 swap_kb = 4;
+
+ // for field upload (instead of path).
+ optional string file_name = 5;
+
+ // TODO(crbug.com/1098746): Consider encoding this as incremental values.
+ optional uint64 start_address = 6;
+ optional uint64 module_timestamp = 7;
+ optional string module_debugid = 8;
+ optional string module_debug_path = 9;
+ optional uint32 protection_flags = 10;
+
+ optional uint64 private_clean_resident_kb = 11;
+ optional uint64 shared_dirty_resident_kb = 12;
+ optional uint64 shared_clean_resident_kb = 13;
+ optional uint64 locked_kb = 14;
+ optional uint64 proportional_resident_kb = 15;
};
message SmapsPacket {
@@ -6839,6 +6954,17 @@
optional int64 oom_score_adj = 10;
repeated Thread threads = 11;
+
+ // The peak resident set size is resettable in newer Posix kernels.
+ // This field specifies if reset is supported and if the writer had reset
+ // the peaks after each process stats recording.
+ optional bool is_peak_rss_resettable = 12;
+
+ // Private, shared and swap footprint of the process as measured by
+ // Chrome. To know more about these metrics refer to:
+ // https://docs.google.com/document/d/1_WmgE1F5WUrhwkPqJis3dWyOiUmQKvpXp5cd4w86TvA
+ optional uint32 chrome_private_footprint_kb = 13;
+ optional uint32 chrome_peak_resident_set_kb = 14;
}
repeated Process processes = 1;
@@ -7416,7 +7542,7 @@
// See the [Buffers and Dataflow](/docs/concepts/buffers.md) doc for details.
//
// Next reserved id: 13 (up to 15).
-// Next id: 73.
+// Next id: 74.
message TracePacket {
// The timestamp of the TracePacket.
// By default this timestamps refers to the trace clock (CLOCK_BOOTTIME on
@@ -7472,6 +7598,7 @@
TracingServiceEvent service_event = 69;
InitialDisplayState initial_display_state = 70;
GpuMemTotalEvent gpu_mem_total_event = 71;
+ MemoryTrackerSnapshot memory_tracker_snapshot = 73;
// Only used in profile packets.
ProfiledFrameSymbols profiled_frame_symbols = 55;
diff --git a/protos/perfetto/trace/profiling/smaps.proto b/protos/perfetto/trace/profiling/smaps.proto
index ec8ec2e..92521c3 100644
--- a/protos/perfetto/trace/profiling/smaps.proto
+++ b/protos/perfetto/trace/profiling/smaps.proto
@@ -23,6 +23,22 @@
optional uint64 size_kb = 2;
optional uint64 private_dirty_kb = 3;
optional uint64 swap_kb = 4;
+
+ // for field upload (instead of path).
+ optional string file_name = 5;
+
+ // TODO(crbug.com/1098746): Consider encoding this as incremental values.
+ optional uint64 start_address = 6;
+ optional uint64 module_timestamp = 7;
+ optional string module_debugid = 8;
+ optional string module_debug_path = 9;
+ optional uint32 protection_flags = 10;
+
+ optional uint64 private_clean_resident_kb = 11;
+ optional uint64 shared_dirty_resident_kb = 12;
+ optional uint64 shared_clean_resident_kb = 13;
+ optional uint64 locked_kb = 14;
+ optional uint64 proportional_resident_kb = 15;
};
message SmapsPacket {
diff --git a/protos/perfetto/trace/ps/process_stats.proto b/protos/perfetto/trace/ps/process_stats.proto
index 9c1b1aa..df82c75 100644
--- a/protos/perfetto/trace/ps/process_stats.proto
+++ b/protos/perfetto/trace/ps/process_stats.proto
@@ -61,6 +61,17 @@
optional int64 oom_score_adj = 10;
repeated Thread threads = 11;
+
+ // The peak resident set size is resettable in newer Posix kernels.
+ // This field specifies if reset is supported and if the writer had reset
+ // the peaks after each process stats recording.
+ optional bool is_peak_rss_resettable = 12;
+
+ // Private, shared and swap footprint of the process as measured by
+ // Chrome. To know more about these metrics refer to:
+ // https://docs.google.com/document/d/1_WmgE1F5WUrhwkPqJis3dWyOiUmQKvpXp5cd4w86TvA
+ optional uint32 chrome_private_footprint_kb = 13;
+ optional uint32 chrome_peak_resident_set_kb = 14;
}
repeated Process processes = 1;
diff --git a/protos/perfetto/trace/trace_packet.proto b/protos/perfetto/trace/trace_packet.proto
index 431ad4f..972460a 100644
--- a/protos/perfetto/trace/trace_packet.proto
+++ b/protos/perfetto/trace/trace_packet.proto
@@ -37,6 +37,7 @@
import "protos/perfetto/trace/gpu/vulkan_memory_event.proto";
import "protos/perfetto/trace/gpu/vulkan_api_event.proto";
import "protos/perfetto/trace/interned_data/interned_data.proto";
+import "protos/perfetto/trace/memory_graph.proto";
import "protos/perfetto/trace/perfetto/perfetto_metatrace.proto";
import "protos/perfetto/trace/perfetto/tracing_service_event.proto";
import "protos/perfetto/trace/power/battery_counters.proto";
@@ -80,7 +81,7 @@
// See the [Buffers and Dataflow](/docs/concepts/buffers.md) doc for details.
//
// Next reserved id: 13 (up to 15).
-// Next id: 73.
+// Next id: 74.
message TracePacket {
// The timestamp of the TracePacket.
// By default this timestamps refers to the trace clock (CLOCK_BOOTTIME on
@@ -136,6 +137,7 @@
TracingServiceEvent service_event = 69;
InitialDisplayState initial_display_state = 70;
GpuMemTotalEvent gpu_mem_total_event = 71;
+ MemoryTrackerSnapshot memory_tracker_snapshot = 73;
// Only used in profile packets.
ProfiledFrameSymbols profiled_frame_symbols = 55;