Emit global handles size in memory dump and add UKM/UMA metrics
Add accounting for global handles in memory dumps. Add UKM/UMA metrics for them as well to help uncover regressions and get some statistics. Privacy review doc: https://goo.gl/X5eYHh New metric: Memory.Experimental.Renderer2.V8.Main.GlobalHandles Change-Id: I5fba506fe9ce7f8b676f676f10f52f81f7a62639 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2084594 Reviewed-by: ssid <ssid@chromium.org> Reviewed-by: Ross McIlroy <rmcilroy@chromium.org> Reviewed-by: Robert Kaplow <rkaplow@chromium.org> Reviewed-by: Ulan Degenbaev <ulan@chromium.org> Commit-Queue: Dominik Inführ <dinfuehr@chromium.org> Cr-Commit-Position: refs/heads/master@{#748388}
This commit is contained in:

committed by
Commit Bot

parent
0aa7ca7cf8
commit
e35b641ca4
base/trace_event
chrome/browser/metrics
gin
tools/metrics
@ -283,6 +283,7 @@ const char* const kAllocatorDumpNameWhitelist[] = {
|
||||
"v8/main/code_stats",
|
||||
"v8/main/contexts/detached_context",
|
||||
"v8/main/contexts/native_context",
|
||||
"v8/main/global_handles",
|
||||
"v8/main/heap/code_space",
|
||||
"v8/main/heap/code_stats",
|
||||
"v8/main/heap/code_large_object_space",
|
||||
|
@ -248,6 +248,9 @@ const Metric kAllocatorDumpNamesForMetrics[] = {
|
||||
{"v8/main", "V8.Main.AllocatedObjects", MetricSize::kLarge,
|
||||
kAllocatedObjectsSize, EmitTo::kSizeInUkmAndUma,
|
||||
&Memory_Experimental::SetV8_Main_AllocatedObjects},
|
||||
{"v8/main/global_handles", "V8.Main.GlobalHandles", MetricSize::kSmall,
|
||||
kEffectiveSize, EmitTo::kSizeInUkmAndUma,
|
||||
&Memory_Experimental::SetV8_Main_GlobalHandles},
|
||||
{"v8/main/heap", "V8.Main.Heap", MetricSize::kLarge, kEffectiveSize,
|
||||
EmitTo::kSizeInUkmAndUma, &Memory_Experimental::SetV8_Main_Heap},
|
||||
{"v8/main/heap", "V8.Main.Heap.AllocatedObjects", MetricSize::kLarge,
|
||||
|
@ -209,6 +209,9 @@ void PopulateRendererMetrics(GlobalMemoryDumpPtr& global_dump,
|
||||
SetAllocatorDumpMetric(
|
||||
pmd, "v8/main", "allocated_objects_size",
|
||||
metrics_mb_or_count["V8.Main.AllocatedObjects"] * 1024 * 1024);
|
||||
SetAllocatorDumpMetric(
|
||||
pmd, "v8/main/global_handles", "effective_size",
|
||||
metrics_mb_or_count["V8.Main.GlobalHandles"] * 1024 * 1024);
|
||||
|
||||
SetAllocatorDumpMetric(pmd, "v8/main/heap", "effective_size",
|
||||
metrics_mb_or_count["V8.Main.Heap"] * 1024 * 1024);
|
||||
@ -341,44 +344,43 @@ constexpr base::ProcessId kTestRendererPid202 = 202;
|
||||
constexpr base::ProcessId kTestRendererPid203 = 203;
|
||||
|
||||
MetricMap GetExpectedRendererMetrics() {
|
||||
return MetricMap(
|
||||
{
|
||||
{"ProcessType", static_cast<int64_t>(ProcessType::RENDERER)},
|
||||
return MetricMap({
|
||||
{"ProcessType", static_cast<int64_t>(ProcessType::RENDERER)},
|
||||
#if !defined(OS_MACOSX)
|
||||
{"Resident", kTestRendererResidentSet},
|
||||
{"Resident", kTestRendererResidentSet},
|
||||
#endif
|
||||
{"Malloc", 120},
|
||||
{"PrivateMemoryFootprint", kTestRendererPrivateMemoryFootprint},
|
||||
{"SharedMemoryFootprint", kTestRendererSharedMemoryFootprint},
|
||||
{"PartitionAlloc", 140}, {"BlinkGC", 150}, {"V8", 160},
|
||||
{"V8.AllocatedObjects", 70}, {"V8.Main", 100},
|
||||
{"V8.Main.AllocatedObjects", 30}, {"V8.Main.Heap", 98},
|
||||
{"V8.Main.Heap.AllocatedObjects", 28},
|
||||
{"V8.Main.Heap.CodeSpace", 11},
|
||||
{"V8.Main.Heap.CodeSpace.AllocatedObjects", 1},
|
||||
{"V8.Main.Heap.LargeObjectSpace", 12},
|
||||
{"V8.Main.Heap.LargeObjectSpace.AllocatedObjects", 2},
|
||||
{"V8.Main.Heap.MapSpace", 13},
|
||||
{"V8.Main.Heap.MapSpace.AllocatedObjects", 3},
|
||||
{"V8.Main.Heap.NewLargeObjectSpace", 14},
|
||||
{"V8.Main.Heap.NewLargeObjectSpace.AllocatedObjects", 4},
|
||||
{"V8.Main.Heap.NewSpace", 15},
|
||||
{"V8.Main.Heap.NewSpace.AllocatedObjects", 5},
|
||||
{"V8.Main.Heap.OldSpace", 16},
|
||||
{"V8.Main.Heap.NewSpace.AllocatedObjects", 6},
|
||||
{"V8.Main.Heap.ReadOnlySpace", 17},
|
||||
{"V8.Main.Heap.ReadOnlySpace.AllocatedObjects", 7},
|
||||
{"V8.Main.Malloc", 2}, {"V8.Workers", 60},
|
||||
{"V8.Workers.AllocatedObjects", 40}, {"NumberOfExtensions", 0},
|
||||
{"Uptime", 42},
|
||||
{"Malloc", 120},
|
||||
{"PrivateMemoryFootprint", kTestRendererPrivateMemoryFootprint},
|
||||
{"SharedMemoryFootprint", kTestRendererSharedMemoryFootprint},
|
||||
{"PartitionAlloc", 140}, {"BlinkGC", 150}, {"V8", 160},
|
||||
{"V8.AllocatedObjects", 70}, {"V8.Main", 100},
|
||||
{"V8.Main.AllocatedObjects", 30}, {"V8.Main.Heap", 98},
|
||||
{"V8.Main.GlobalHandles", 3}, {"V8.Main.Heap.AllocatedObjects", 28},
|
||||
{"V8.Main.Heap.CodeSpace", 11},
|
||||
{"V8.Main.Heap.CodeSpace.AllocatedObjects", 1},
|
||||
{"V8.Main.Heap.LargeObjectSpace", 12},
|
||||
{"V8.Main.Heap.LargeObjectSpace.AllocatedObjects", 2},
|
||||
{"V8.Main.Heap.MapSpace", 13},
|
||||
{"V8.Main.Heap.MapSpace.AllocatedObjects", 3},
|
||||
{"V8.Main.Heap.NewLargeObjectSpace", 14},
|
||||
{"V8.Main.Heap.NewLargeObjectSpace.AllocatedObjects", 4},
|
||||
{"V8.Main.Heap.NewSpace", 15},
|
||||
{"V8.Main.Heap.NewSpace.AllocatedObjects", 5},
|
||||
{"V8.Main.Heap.OldSpace", 16},
|
||||
{"V8.Main.Heap.NewSpace.AllocatedObjects", 6},
|
||||
{"V8.Main.Heap.ReadOnlySpace", 17},
|
||||
{"V8.Main.Heap.ReadOnlySpace.AllocatedObjects", 7},
|
||||
{"V8.Main.Malloc", 2}, {"V8.Workers", 60},
|
||||
{"V8.Workers.AllocatedObjects", 40}, {"NumberOfExtensions", 0},
|
||||
{"Uptime", 42},
|
||||
#if defined(OS_LINUX) || defined(OS_ANDROID)
|
||||
{"PrivateSwapFootprint", 50},
|
||||
{"PrivateSwapFootprint", 50},
|
||||
#endif
|
||||
{"NumberOfAdSubframes", 28}, {"NumberOfDetachedScriptStates", 11},
|
||||
{"NumberOfDocuments", 1}, {"NumberOfFrames", 2},
|
||||
{"NumberOfLayoutObjects", 5}, {"NumberOfNodes", 3},
|
||||
{"PartitionAlloc.Partitions.ArrayBuffer", 10},
|
||||
});
|
||||
{"NumberOfAdSubframes", 28}, {"NumberOfDetachedScriptStates", 11},
|
||||
{"NumberOfDocuments", 1}, {"NumberOfFrames", 2},
|
||||
{"NumberOfLayoutObjects", 5}, {"NumberOfNodes", 3},
|
||||
{"PartitionAlloc.Partitions.ArrayBuffer", 10},
|
||||
});
|
||||
}
|
||||
|
||||
void AddPageMetrics(MetricMap& expected_metrics) {
|
||||
|
@ -253,6 +253,14 @@ void V8IsolateMemoryDumpProvider::DumpHeapStatistics(
|
||||
// Dump statistics related to code and bytecode if requested.
|
||||
DumpCodeStatistics(code_stats_dump, isolate_holder_);
|
||||
|
||||
// Dump statistics for global handles.
|
||||
auto* global_handles_dump = process_memory_dump->CreateAllocatorDump(
|
||||
dump_base_name + "/global_handles" + dump_name_suffix);
|
||||
global_handles_dump->AddScalar(
|
||||
base::trace_event::MemoryAllocatorDump::kNameSize,
|
||||
base::trace_event::MemoryAllocatorDump::kUnitsBytes,
|
||||
heap_statistics.total_global_handles_size());
|
||||
|
||||
// Dump object statistics only for detailed dumps.
|
||||
if (args.level_of_detail !=
|
||||
base::trace_event::MemoryDumpLevelOfDetail::DETAILED) {
|
||||
|
@ -64,6 +64,27 @@ TEST_F(V8MemoryDumpProviderTest, DumpStatistics) {
|
||||
ASSERT_TRUE(did_dump_objects_stats);
|
||||
}
|
||||
|
||||
TEST_F(V8MemoryDumpProviderTest, DumpGlobalHandlesSize) {
|
||||
base::trace_event::MemoryDumpArgs dump_args = {
|
||||
base::trace_event::MemoryDumpLevelOfDetail::BACKGROUND};
|
||||
std::unique_ptr<base::trace_event::ProcessMemoryDump> process_memory_dump(
|
||||
new base::trace_event::ProcessMemoryDump(dump_args));
|
||||
instance_->isolate_memory_dump_provider_for_testing()->OnMemoryDump(
|
||||
dump_args, process_memory_dump.get());
|
||||
const base::trace_event::ProcessMemoryDump::AllocatorDumpsMap&
|
||||
allocator_dumps = process_memory_dump->allocator_dumps();
|
||||
|
||||
bool did_dump_global_handles = false;
|
||||
for (const auto& name_dump : allocator_dumps) {
|
||||
const std::string& name = name_dump.first;
|
||||
if (name.find("v8/main/global_handles") != std::string::npos) {
|
||||
did_dump_global_handles = true;
|
||||
}
|
||||
}
|
||||
|
||||
ASSERT_TRUE(did_dump_global_handles);
|
||||
}
|
||||
|
||||
TEST_F(V8MemoryDumpProviderTest, DumpContextStatistics) {
|
||||
base::trace_event::MemoryDumpArgs dump_args = {
|
||||
base::trace_event::MemoryDumpLevelOfDetail::LIGHT};
|
||||
|
@ -193377,6 +193377,8 @@ regressions. -->
|
||||
<suffix name="V8" label="Only counting memory used by V8 javascript engine."/>
|
||||
<suffix name="V8.AllocatedObjects"
|
||||
label="Only counting objects allocated by V8 javascript engine."/>
|
||||
<suffix name="V8.Main.GlobalHandles"
|
||||
label="Memory used by V8 global handles in the main isolate."/>
|
||||
<affected-histogram name="Memory.Experimental.Browser2"/>
|
||||
<affected-histogram name="Memory.Experimental.Extension2"/>
|
||||
<affected-histogram name="Memory.Experimental.Gpu2"/>
|
||||
|
@ -6079,6 +6079,11 @@ be describing additional metrics about the same event.
|
||||
Measure of memory consumed by live objects in the main isolate of V8.
|
||||
</summary>
|
||||
</metric>
|
||||
<metric name="V8.Main.GlobalHandles">
|
||||
<summary>
|
||||
Measure of memory consumed by global handles in V8.
|
||||
</summary>
|
||||
</metric>
|
||||
<metric name="V8.Main.Heap">
|
||||
<summary>
|
||||
Measure of memory consumed by the main heap of V8.
|
||||
|
Reference in New Issue
Block a user