OLD | NEW |
(Empty) | |
| 1 <!DOCTYPE html> |
| 2 <!-- |
| 3 Copyright 2017 The Chromium Authors. All rights reserved. |
| 4 Use of this source code is governed by a BSD-style license that can be |
| 5 found in the LICENSE file. |
| 6 --> |
| 7 |
| 8 <link rel="import" href="/tracing/base/unit.html"> |
| 9 <link rel="import" href="/tracing/metrics/metric_registry.html"> |
| 10 <link rel="import" href="/tracing/metrics/system_health/utils.html"> |
| 11 <link rel="import" href="/tracing/value/histogram.html"> |
| 12 |
| 13 <script> |
| 14 'use strict'; |
| 15 |
| 16 tr.exportTo('tr.metrics.blink', function() { |
| 17 function leakDetectionMetric(histograms, model) { |
| 18 // Extract renderer pids. |
| 19 const modelHelper = model.getOrCreateHelper( |
| 20 tr.model.helpers.ChromeModelHelper); |
| 21 if (modelHelper === undefined) { |
| 22 throw new Error('Chrome is not present.'); |
| 23 } |
| 24 const rendererHelpers = modelHelper.rendererHelpers; |
| 25 if (Object.keys(rendererHelpers).length === 0) { |
| 26 throw new Error('Renderer process is not present.'); |
| 27 } |
| 28 const pids = Object.keys(rendererHelpers); |
| 29 |
| 30 // Get the dumps. |
| 31 const chromeDumps = tr.metrics.sh |
| 32 .splitGlobalDumpsByBrowserName(model, undefined).get('chrome'); |
| 33 |
| 34 const sumCounter = new Map(); |
| 35 // Add up counters for all the renderer processes. |
| 36 |
| 37 for (const pid of pids) { |
| 38 for (const [key, count] of countLeakedBlinkObjects(chromeDumps, pid)) { |
| 39 sumCounter.set(key, (sumCounter.get(key) || 0) + count); |
| 40 } |
| 41 } |
| 42 |
| 43 for (const [key, count] of sumCounter) { |
| 44 histograms.createHistogram('Leaked ' + key, |
| 45 tr.b.Unit.byName.count_smallerIsBetter, count); |
| 46 } |
| 47 } |
| 48 |
| 49 tr.metrics.MetricRegistry.register(leakDetectionMetric); |
| 50 |
| 51 function countLeakedBlinkObjects(dumps, pid) { |
| 52 if (dumps === undefined || dumps.length < 2) { |
| 53 throw new Error('Expected at least two memory dumps.'); |
| 54 } |
| 55 const firstCounter = countBlinkObjects(dumps[0], pid); |
| 56 const lastCounter = countBlinkObjects(dumps[dumps.length - 1], pid); |
| 57 const diffCounter = new Map(); |
| 58 for (const [key, lastCount] of lastCounter) { |
| 59 diffCounter.set(key, lastCount - firstCounter.get(key)); |
| 60 } |
| 61 return diffCounter; |
| 62 } |
| 63 |
| 64 function countBlinkObjects(dump, pid) { |
| 65 const counter = new Map(); |
| 66 const processesMemoryDumps = dump.processMemoryDumps; |
| 67 if (processesMemoryDumps[pid] === undefined) return counter; |
| 68 const blinkObjectsDump = processesMemoryDumps[pid].memoryAllocatorDumps |
| 69 .find(dump => dump.fullName === 'blink_objects'); |
| 70 for (const v of blinkObjectsDump.children) { |
| 71 counter.set(v.name, v.numerics.object_count.value); |
| 72 } |
| 73 return counter; |
| 74 } |
| 75 |
| 76 return { |
| 77 leakDetectionMetric, |
| 78 }; |
| 79 }); |
| 80 </script> |
OLD | NEW |