diff options
Diffstat (limited to 'chromium/third_party/catapult/tracing/tracing/metrics/system_health')
18 files changed, 0 insertions, 5236 deletions
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/clock_sync_latency_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/clock_sync_latency_metric.html deleted file mode 100644 index c30d0790d8c..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/clock_sync_latency_metric.html +++ /dev/null @@ -1,59 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright 2016 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<link rel="import" href="/tracing/metrics/metric_registry.html"> -<link rel="import" href="/tracing/metrics/system_health/utils.html"> -<link rel="import" href="/tracing/model/model.html"> -<link rel="import" href="/tracing/value/numeric.html"> -<link rel="import" href="/tracing/value/value.html"> - -<script> -'use strict'; - -tr.exportTo('tr.metrics.sh', function() { - - function syncIsComplete(markers) { - return markers.length === 2; - } - - function syncInvolvesTelemetry(markers) { - for (var marker of markers) - if (marker.domainId === tr.model.ClockDomainId.TELEMETRY) - return true; - - return false; - } - - function clockSyncLatencyMetric(values, model) { - for (var markers of model.clockSyncManager.markersBySyncId.values()) { - var latency = undefined; - var targetDomain = undefined; - if (!syncIsComplete(markers) || !syncInvolvesTelemetry(markers)) - continue; - for (var marker of markers) { - var domain = marker.domainId; - if (domain === tr.model.ClockDomainId.TELEMETRY) - latency = (marker.endTs - marker.startTs); - else - targetDomain = domain; - } - values.addValue(new tr.v.NumericValue( - 'clock_sync_latency_' + targetDomain, - new tr.v.ScalarNumeric( - tr.v.Unit.byName.timeDurationInMs_smallerIsBetter, - latency), - { description: 'Clock sync latency for domain ' + targetDomain })); - } - }; - - tr.metrics.MetricRegistry.register(clockSyncLatencyMetric); - - return { - clockSyncLatencyMetric: clockSyncLatencyMetric - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/clock_sync_latency_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/clock_sync_latency_metric_test.html deleted file mode 100644 index fe6a37d4819..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/clock_sync_latency_metric_test.html +++ /dev/null @@ -1,61 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright 2016 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<link rel="import" href="/tracing/core/test_utils.html"> -<link rel="import" href="/tracing/metrics/system_health/clock_sync_latency_metric.html"> -<link rel="import" href="/tracing/model/model.html"> -<link rel="import" href="/tracing/value/value_set.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - test('clockSyncLatencyMetric', function() { - var model = new tr.Model(); - model.clockSyncManager.addClockSyncMarker( - tr.model.ClockDomainId.TELEMETRY, 'ID01', 1.0, 4.0); - model.clockSyncManager.addClockSyncMarker( - tr.model.ClockDomainId.TELEMETRY, 'ID02', 2.0, 8.0); - model.clockSyncManager.addClockSyncMarker( - tr.model.ClockDomainId.BATTOR, 'ID01', 2.5); - model.clockSyncManager.addClockSyncMarker( - tr.model.ClockDomainId.WIN_QPC, 'ID02', 5.0); - - var battorName = 'clock_sync_latency_' + tr.model.ClockDomainId.BATTOR; - var winQpcName = 'clock_sync_latency_' + tr.model.ClockDomainId.WIN_QPC; - - var valueSet = new tr.v.ValueSet(); - tr.metrics.sh.clockSyncLatencyMetric(valueSet, model); - - var battorEntry = tr.b.getOnlyElement( - valueSet.valueDicts.filter( - (dict) => dict.name === battorName)); - - var winQpcEntry = tr.b.getOnlyElement( - valueSet.valueDicts.filter( - (dict) => dict.name === winQpcName)); - - assert.equal(battorEntry.numeric.value, 3.0); - assert.equal(winQpcEntry.numeric.value, 6.0); - }); - - test('clockSyncLatencyMetric_noTelemetry', function() { - var model = new tr.Model(); - model.clockSyncManager.addClockSyncMarker( - tr.model.ClockDomainId.TELEMETRY, 'ID01', 1.0, 4.0); - model.clockSyncManager.addClockSyncMarker( - tr.model.ClockDomainId.BATTOR, 'ID02', 2.5); - model.clockSyncManager.addClockSyncMarker( - tr.model.ClockDomainId.WIN_QPC, 'ID02', 5.0); - - var valueSet = new tr.v.ValueSet(); - tr.metrics.sh.clockSyncLatencyMetric(valueSet, model); - - assert.lengthOf(valueSet.valueDicts, 0); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/efficiency_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/efficiency_metric.html deleted file mode 100644 index 6274def9412..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/efficiency_metric.html +++ /dev/null @@ -1,78 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2015 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<link rel="import" href="/tracing/base/statistics.html"> -<link rel="import" href="/tracing/metrics/metric_registry.html"> -<link rel="import" href="/tracing/metrics/system_health/utils.html"> -<link rel="import" href="/tracing/model/user_model/animation_expectation.html"> -<link rel="import" href="/tracing/model/user_model/idle_expectation.html"> -<link rel="import" href="/tracing/value/numeric.html"> -<link rel="import" href="/tracing/value/value.html"> - -<script> -'use strict'; - -tr.exportTo('tr.metrics.sh', function() { - var UNIT = tr.v.Unit.byName.normalizedPercentage_biggerIsBetter; - - var DESCRIPTION = 'Normalized CPU budget consumption'; - - function efficiencyMetric(values, model) { - var scores = []; - - model.userModel.expectations.forEach(function(ue) { - var options = {}; - options.description = DESCRIPTION; - - var score = undefined; - - if ((ue.totalCpuMs === undefined) || - (ue.totalCpuMs == 0)) - return; - - var cpuFractionBudget = tr.b.Range.fromExplicitRange(0.5, 1.5); - - if (ue instanceof tr.model.um.IdleExpectation) { - cpuFractionBudget = tr.b.Range.fromExplicitRange(0.1, 1); - } else if (ue instanceof tr.model.um.AnimationExpectation) { - cpuFractionBudget = tr.b.Range.fromExplicitRange(1, 2); - } - - var cpuMsBudget = tr.b.Range.fromExplicitRange( - ue.duration * cpuFractionBudget.min, - ue.duration * cpuFractionBudget.max); - var normalizedCpu = tr.b.normalize( - ue.totalCpuMs, cpuMsBudget.min, cpuMsBudget.max); - score = 1 - tr.b.clamp(normalizedCpu, 0, 1); - - scores.push(score); - - values.addValue(new tr.v.NumericValue( - 'efficiency', new tr.v.ScalarNumeric(UNIT, score), options)); - }); - - // Manually reduce scores. - // https://github.com/catapult-project/catapult/issues/2036 - - var options = {}; - options.description = DESCRIPTION; - var overallScore = tr.b.Statistics.weightedMean( - scores, tr.metrics.sh.perceptualBlend); - if (overallScore === undefined) - return; - - values.addValue(new tr.v.NumericValue( - 'efficiency', new tr.v.ScalarNumeric(UNIT, overallScore), options)); - } - - tr.metrics.MetricRegistry.register(efficiencyMetric); - - return { - efficiencyMetric: efficiencyMetric - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/efficiency_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/efficiency_metric_test.html deleted file mode 100644 index 5fe0f1a4561..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/efficiency_metric_test.html +++ /dev/null @@ -1,56 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2015 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<link rel="import" href="/tracing/base/iteration_helpers.html"> -<link rel="import" href="/tracing/core/test_utils.html"> -<link rel="import" - href="/tracing/metrics/system_health/efficiency_metric.html"> -<link rel="import" href="/tracing/model/user_model/idle_expectation.html"> -<link rel="import" href="/tracing/value/value_set.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - function createModel() { - return tr.c.TestUtils.newModel(function(model) { - model.p1 = model.getOrCreateProcess(1); - model.t2 = model.p1.getOrCreateThread(2); - - var slice = tr.c.TestUtils.newSliceEx({ - title: 'foo', - start: 0, - end: 100, - type: tr.model.ThreadSlice - }); - slice.isTopLevel = true; - - var idle = new tr.model.um.IdleExpectation(model, 0, 100); - idle.associatedEvents.push(slice); - model.userModel.expectations.push(idle); - }); - } - - test('optimalEfficiency', function() { - var model = createModel(); - var exp = model.userModel.expectations[0]; - tr.b.getOnlyElement(exp.associatedEvents).cpuSelfTime = 10; - var values = new tr.v.ValueSet(); - tr.metrics.sh.efficiencyMetric(values, model); - assert.equal(1, values.valueDicts[0].numeric.value); - }); - - test('pessimalEfficiency', function() { - var model = createModel(); - var exp = model.userModel.expectations[0]; - tr.b.getOnlyElement(exp.associatedEvents).cpuSelfTime = 100; - var values = new tr.v.ValueSet(); - tr.metrics.sh.efficiencyMetric(values, model); - assert.equal(0, values.valueDicts[0].numeric.value); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/first_paint_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/first_paint_metric.html deleted file mode 100644 index bc1aa3828ca..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/first_paint_metric.html +++ /dev/null @@ -1,423 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright 2016 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<link rel="import" href="/tracing/base/statistics.html"> -<link rel="import" href="/tracing/metrics/metric_registry.html"> -<link rel="import" href="/tracing/metrics/system_health/utils.html"> -<link rel="import" href="/tracing/model/helpers/chrome_model_helper.html"> -<link rel="import" href="/tracing/model/timed_event.html"> -<link rel="import" href="/tracing/value/numeric.html"> -<link rel="import" href="/tracing/value/value.html"> - -<script> -'use strict'; - -tr.exportTo('tr.metrics.sh', function() { - var timeDurationInMs_smallerIsBetter = - tr.v.Unit.byName.timeDurationInMs_smallerIsBetter; - - function findTargetRendererHelper(chromeHelper) { - var largestPid = -1; - for (var pid in chromeHelper.rendererHelpers) { - var rendererHelper = chromeHelper.rendererHelpers[pid]; - if (rendererHelper.isChromeTracingUI) - continue; - if (pid > largestPid) - largestPid = pid; - } - - if (largestPid === -1) - return undefined; - - return chromeHelper.rendererHelpers[largestPid]; - } - - /** - * A utility class for finding navigationStart event for given frame and - * timestamp. - * @constructor - */ - function NavigationStartFinder(rendererHelper) { - this.navigationStartsForFrameId_ = {}; - for (var ev of rendererHelper.mainThread.sliceGroup.childEvents()) { - if (ev.category !== 'blink.user_timing' || - ev.title !== 'navigationStart') - continue; - var frameIdRef = ev.args['frame']; - var list = this.navigationStartsForFrameId_[frameIdRef]; - if (list === undefined) - this.navigationStartsForFrameId_[frameIdRef] = list = []; - list.unshift(ev); - } - } - - NavigationStartFinder.prototype = { - findNavigationStartEventForFrameBeforeTimestamp: function(frameIdRef, ts) { - var list = this.navigationStartsForFrameId_[frameIdRef]; - if (list === undefined) { - console.warn('No navigationStartEvent found for frame id "' + - frameIdRef + '"'); - return undefined; - } - var eventBeforeTimestamp; - for (var ev of list) { - if (ev.start > ts) - continue; - if (eventBeforeTimestamp === undefined) - eventBeforeTimestamp = ev; - } - if (eventBeforeTimestamp === undefined) { - console.warn('Failed to find navigationStartEvent.'); - return undefined; - } - return eventBeforeTimestamp; - } - }; - - /** - * A utility class for finding Paint event for given frame and timestamp. - * @constructor - */ - function PaintFinder(rendererHelper) { - this.paintsForFrameId_ = {}; - for (var ev of rendererHelper.mainThread.sliceGroup.childEvents()) { - if (ev.category !== 'devtools.timeline' || ev.title !== 'Paint') - continue; - var frameIdRef = ev.args['data']['frame']; - var list = this.paintsForFrameId_[frameIdRef]; - if (list === undefined) - this.paintsForFrameId_[frameIdRef] = list = []; - list.push(ev); - } - } - - PaintFinder.prototype = { - findPaintEventForFrameAfterTimestamp: function(frameIdRef, ts) { - var list = this.paintsForFrameId_[frameIdRef]; - if (list === undefined) - return undefined; - - var eventAfterTimestamp; - for (var ev of list) { - if (ev.start < ts) - continue; - if (eventAfterTimestamp === undefined) - eventAfterTimestamp = ev; - } - return eventAfterTimestamp; - } - }; - - var FIRST_PAINT_NUMERIC_BUILDER = - new tr.v.NumericBuilder(timeDurationInMs_smallerIsBetter, 0) - .addLinearBins(1000, 20) // 50ms step to 1s - .addLinearBins(3000, 20) // 100ms step to 3s - .addExponentialBins(20000, 20); - function createHistogram() { - var histogram = FIRST_PAINT_NUMERIC_BUILDER.build(); - histogram.customizeSummaryOptions({ - avg: true, - count: false, - max: true, - min: true, - std: true, - sum: false, - percentile: [0.90, 0.95, 0.99], - }); - return histogram; - } - - function findFrameLoaderSnapshotAt(rendererHelper, frameIdRef, ts) { - var snapshot; - - var objects = rendererHelper.process.objects; - var frameLoaderInstances = objects.instancesByTypeName_['FrameLoader']; - if (frameLoaderInstances === undefined) { - console.warn('Failed to find FrameLoader for frameId "' + frameIdRef + - '" at ts ' + ts + ', the trace maybe incomplete or from an old' + - 'Chrome.'); - return undefined; - } - - var snapshot; - for (var instance of frameLoaderInstances) { - if (!instance.isAliveAt(ts)) - continue; - var maybeSnapshot = instance.getSnapshotAt(ts); - if (frameIdRef !== maybeSnapshot.args['frame']['id_ref']) - continue; - snapshot = maybeSnapshot; - } - - return snapshot; - } - - function findAllUserTimingEvents(rendererHelper, title) { - var targetEvents = []; - - for (var ev of rendererHelper.process.getDescendantEvents()) { - if (ev.category !== 'blink.user_timing' || ev.title !== title) - continue; - targetEvents.push(ev); - } - - return targetEvents; - } - - function findAllLayoutEvents(rendererHelper) { - var isTelemetryInternalEvent = - prepareTelemetryInternalEventPredicate(rendererHelper); - var layoutsForFrameId = {}; - for (var ev of rendererHelper.process.getDescendantEvents()) { - if (ev.category !== - 'blink,benchmark,disabled-by-default-blink.debug.layout' || - ev.title !== 'FrameView::performLayout') - continue; - if (isTelemetryInternalEvent(ev)) - continue; - if (ev.args.counters === undefined) { - console.warn('Ignoring FrameView::performLayout event with no ' + - 'counters arg (END event is missing).'); - continue; - } - var frameIdRef = ev.args.counters['frame']; - if (frameIdRef === undefined) - continue; - var list = layoutsForFrameId[frameIdRef]; - if (list === undefined) - layoutsForFrameId[frameIdRef] = list = []; - list.push(ev); - } - return layoutsForFrameId; - } - - function prepareTelemetryInternalEventPredicate(rendererHelper) { - var ignoreRegions = []; - - var internalRegionStart; - for (var slice of - rendererHelper.mainThread.asyncSliceGroup.getDescendantEvents()) { - if (!!slice.title.match(/^telemetry\.internal\.[^.]*\.start$/)) - internalRegionStart = slice.start; - if (!!slice.title.match(/^telemetry\.internal\.[^.]*\.end$/)) { - var timedEvent = new tr.model.TimedEvent(internalRegionStart); - timedEvent.duration = slice.end - internalRegionStart; - ignoreRegions.push(timedEvent); - } - } - - return function isTelemetryInternalEvent(slice) { - for (var region of ignoreRegions) - if (region.bounds(slice)) - return true; - return false; - } - } - - var URL_BLACKLIST = [ - 'about:blank', - // Chrome on Android creates main frames with the below URL for plugins. - 'data:text/html,pluginplaceholderdata' - ]; - function shouldIgnoreURL(url) { - return URL_BLACKLIST.indexOf(url) >= 0; - } - - var METRICS = [ - { - valueName: 'firstContentfulPaint', - title: 'firstContentfulPaint', - description: 'time to first contentful paint' - }, - { - valueName: 'timeToOnload', - title: 'loadEventStart', - description: 'time to onload. ' + - 'This is temporary metric used for PCv1/v2 sanity checking' - }]; - - function firstContentfulPaintMetric(values, model) { - var chromeHelper = model.getOrCreateHelper( - tr.model.helpers.ChromeModelHelper); - var rendererHelper = findTargetRendererHelper(chromeHelper); - var isTelemetryInternalEvent = - prepareTelemetryInternalEventPredicate(rendererHelper); - var navigationStartFinder = new NavigationStartFinder(rendererHelper); - - for (var metric of METRICS) { - var histogram = createHistogram(); - var targetEvents = findAllUserTimingEvents(rendererHelper, metric.title); - for (var ev of targetEvents) { - if (isTelemetryInternalEvent(ev)) - continue; - var frameIdRef = ev.args['frame']; - var snapshot = - findFrameLoaderSnapshotAt(rendererHelper, frameIdRef, ev.start); - if (snapshot === undefined || !snapshot.args.isLoadingMainFrame) - continue; - var url = snapshot.args.documentLoaderURL; - if (shouldIgnoreURL(url)) - continue; - var navigationStartEvent = navigationStartFinder. - findNavigationStartEventForFrameBeforeTimestamp(frameIdRef, ev.start); - // Ignore layout w/o preceding navigationStart, as they are not - // attributed to any time-to-X metric. - if (navigationStartEvent === undefined) - continue; - - var timeToEvent = ev.start - navigationStartEvent.start; - histogram.add(timeToEvent, {url: url}); - } - values.addValue(new tr.v.NumericValue( - metric.valueName, histogram, - { description: metric.description })); - } - } - - /** - * Compute significance of given layout event. - * - * Significance of a layout is the number of layout objects newly added to the - * layout tree, weighted by page height (before and after the layout). - */ - function layoutSignificance(event) { - var newObjects = event.args.counters['LayoutObjectsThatHadNeverHadLayout']; - var visibleHeight = event.args['counters']['visibleHeight']; - if (!newObjects || !visibleHeight) - return 0; - - var heightBefore = event.args['contentsHeightBeforeLayout']; - var heightAfter = event.args['counters']['contentsHeightAfterLayout']; - var ratioBefore = Math.max(1, heightBefore / visibleHeight); - var ratioAfter = Math.max(1, heightAfter / visibleHeight); - return newObjects / ((ratioBefore + ratioAfter) / 2); - } - - /** - * If there are loading fonts when layout happened, the layout change - * accounting is postponed until the font is displayed. However, icon fonts - * shouldn't block first meaningful paint. We use a threshold that only web - * fonts that laid out more than 200 characters should block first meaningful - * paint. - */ - function hasTooManyBlankCharactersToBeMeaningful(event) { - var BLOCK_FIRST_MEANINGFUL_PAINT_IF_BLANK_CHARACTERS_MORE_THAN = 200; - return event.args['counters']['approximateBlankCharacterCount'] > - BLOCK_FIRST_MEANINGFUL_PAINT_IF_BLANK_CHARACTERS_MORE_THAN; - } - - /** - * Computes Time to first meaningful paint (TTFMP) from |model| and add it to - * |value|. - * - * TTFMP is computed from three types of events: NavigationStart, Layout, and - * Paint. Each Layout event has associated "significance" value, indicating - * how the layout was visually significant. - * - * TTFMP is the time between NavigationStart and Paint that follows the Layout - * with biggest significance value. - * - * Design doc: https://goo.gl/vpaxv6 - */ - function firstMeaningfulPaintMetric(values, model) { - var chromeHelper = model.getOrCreateHelper( - tr.model.helpers.ChromeModelHelper); - var rendererHelper = findTargetRendererHelper(chromeHelper); - var navigationStartFinder = new NavigationStartFinder(rendererHelper); - var paintFinder = new PaintFinder(rendererHelper); - var firstMeaningfulPaintHistogram = createHistogram(); - - function addFirstMeaningfulPaintSampleToHistogram( - frameIdRef, navigationStart, mostSignificantLayout) { - var snapshot = findFrameLoaderSnapshotAt( - rendererHelper, frameIdRef, mostSignificantLayout.start); - if (snapshot === undefined || !snapshot.args.isLoadingMainFrame) - return; - var url = snapshot.args.documentLoaderURL; - if (shouldIgnoreURL(url)) - return; - var paintEvent = paintFinder.findPaintEventForFrameAfterTimestamp( - frameIdRef, mostSignificantLayout.start); - if (paintEvent === undefined) { - console.warn('Failed to find paint event after the most significant ' + - 'layout for frameId "' + frameIdRef + '".'); - return; - } - var timeToFirstMeaningfulPaint = paintEvent.start - navigationStart.start; - firstMeaningfulPaintHistogram.add(timeToFirstMeaningfulPaint, {url: url}); - } - - var layoutsForFrameId = findAllLayoutEvents(rendererHelper); - - for (var frameIdRef in layoutsForFrameId) { - var navigationStart; - var mostSignificantLayout; - var maxSignificanceSoFar = 0; - var accumulatedSignificanceWhileHavingBlankText = 0; - - // Iterate over the layout events, remembering one with largest - // significance. - for (var ev of layoutsForFrameId[frameIdRef]) { - var navigationStartForThisLayout = navigationStartFinder. - findNavigationStartEventForFrameBeforeTimestamp(frameIdRef, ev.start); - // Ignore layout w/o preceding navigationStart, as they are not - // attributed to any TTFMP. - if (navigationStartForThisLayout === undefined) - continue; - - if (navigationStart !== navigationStartForThisLayout) { - // New navigation is found. Compute TTFMP for current navigation, and - // reset the state variables. - if (navigationStart !== undefined && - mostSignificantLayout !== undefined) - addFirstMeaningfulPaintSampleToHistogram( - frameIdRef, navigationStart, mostSignificantLayout); - navigationStart = navigationStartForThisLayout; - mostSignificantLayout = undefined; - maxSignificanceSoFar = 0; - accumulatedSignificanceWhileHavingBlankText = 0; - } - - // Check if |ev| has the largest significance. If the page has many - // blank characters, the significance value is accumulated until - // the text become visible. - var significance = layoutSignificance(ev); - if (hasTooManyBlankCharactersToBeMeaningful(ev)) { - accumulatedSignificanceWhileHavingBlankText += significance; - } else { - significance += accumulatedSignificanceWhileHavingBlankText; - accumulatedSignificanceWhileHavingBlankText = 0; - if (significance > maxSignificanceSoFar) { - maxSignificanceSoFar = significance; - mostSignificantLayout = ev; - } - } - } - - // Emit TTFMP for the last navigation. - if (mostSignificantLayout !== undefined) - addFirstMeaningfulPaintSampleToHistogram( - frameIdRef, navigationStart, mostSignificantLayout); - } - - values.addValue(new tr.v.NumericValue( - 'firstMeaningfulPaint', firstMeaningfulPaintHistogram, - { description: 'time to first meaningful paint' })); - } - - function firstPaintMetric(values, model) { - firstContentfulPaintMetric(values, model); - firstMeaningfulPaintMetric(values, model); - } - - tr.metrics.MetricRegistry.register(firstPaintMetric); - - return { - firstPaintMetric: firstPaintMetric - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/first_paint_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/first_paint_metric_test.html deleted file mode 100644 index be318aa3600..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/first_paint_metric_test.html +++ /dev/null @@ -1,235 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2016 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<link rel="import" href="/tracing/core/test_utils.html"> -<link rel="import" - href="/tracing/metrics/system_health/first_paint_metric.html"> -<link rel="import" href="/tracing/value/value_set.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - test('firstContentfulPaint', function() { - var model = tr.c.TestUtils.newModel(function(model) { - var rendererProcess = model.getOrCreateProcess(1); - var mainThread = rendererProcess.getOrCreateThread(2); - mainThread.name = 'CrRendererMain'; - mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - cat: 'blink.user_timing', - title: 'navigationStart', - start: 200, - duration: 0.0, - args: {frame: '0xdeadbeef'} - })); - rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300, - {isLoadingMainFrame: true, frame: {id_ref: '0xdeadbeef'}, - documentLoaderURL: 'http://example.com'}); - mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - cat: 'blink.user_timing', - title: 'firstContentfulPaint', - start: 1000, - duration: 0.0, - args: {frame: '0xdeadbeef'} - })); - }); - var values = new tr.v.ValueSet(); - tr.metrics.sh.firstPaintMetric(values, model); - var numeric = values.valueDicts[0].numeric; - assert.equal(1, numeric.running.count); - assert.equal(800, numeric.running.mean); - }); - - test('firstContentfulPaintIgnoringWarmCache', function() { - var model = tr.c.TestUtils.newModel(function(model) { - var rendererProcess = model.getOrCreateProcess(1); - var mainThread = rendererProcess.getOrCreateThread(2); - mainThread.name = 'CrRendererMain'; - - // warm cache navigation - mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - cat: 'blink.user_timing', - title: 'navigationStart', - start: 200, - duration: 0.0, - args: {frame: '0xdeadbeef'} - })); - mainThread.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceEx({ - cat: 'blink.console', - title: 'telemetry.internal.warmCache.start', - start: 250, - duration: 0.0 - })); - rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300, - {isLoadingMainFrame: true, frame: {id_ref: '0xdeadbeef'}, - documentLoaderURL: 'http://example.com'}); - mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - cat: 'blink.user_timing', - title: 'firstContentfulPaint', - start: 1000, - duration: 0.0, - args: {frame: '0xdeadbeef'} - })); - mainThread.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceEx({ - cat: 'blink.console', - title: 'telemetry.internal.warmCache.end', - start: 1250, - duration: 0.0 - })); - - // measurement navigation - mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - cat: 'blink.user_timing', - title: 'navigationStart', - start: 2000, - duration: 0.0, - args: {frame: '0xdeadbeef'} - })); - rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 2100, - {isLoadingMainFrame: true, frame: {id_ref: '0xdeadbeef'}, - documentLoaderURL: 'http://example.com'}); - mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - cat: 'blink.user_timing', - title: 'firstContentfulPaint', - start: 2400, - duration: 0.0, - args: {frame: '0xdeadbeef'} - })); - }); - var values = new tr.v.ValueSet(); - tr.metrics.sh.firstPaintMetric(values, model); - var numeric = values.valueDicts[0].numeric; - assert.equal(1, numeric.running.count); - assert.equal(400, numeric.running.mean); - }); - - test('firstMeaningfulPaint', function() { - var model = tr.c.TestUtils.newModel(function(model) { - var rendererProcess = model.getOrCreateProcess(1); - var mainThread = rendererProcess.getOrCreateThread(2); - mainThread.name = 'CrRendererMain'; - mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - cat: 'blink.user_timing', - title: 'navigationStart', - start: 200, - duration: 0.0, - args: {frame: '0xdeadbeef'} - })); - rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300, - {isLoadingMainFrame: true, frame: {id_ref: '0xdeadbeef'}, - documentLoaderURL: 'http://example.com'}); - mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - cat: 'blink,benchmark,disabled-by-default-blink.debug.layout', - title: 'FrameView::performLayout', - start: 500, - duration: 10.0, - args: { - counters: { - frame: '0xdeadbeef', - LayoutObjectsThatHadNeverHadLayout: 10, - contentsHeightAfterLayout: 800, - visibleHeight: 1000, - }, - contentsHeightBeforeLayout: 0 - } - })); - mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - cat: 'devtools.timeline', - title: 'Paint', - start: 600, - duration: 1.0, - args: {data: {frame: '0xdeadbeef'}} - })); - mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - cat: 'blink,benchmark,disabled-by-default-blink.debug.layout', - title: 'FrameView::performLayout', - start: 800, - duration: 10.0, - args: { - counters: { - frame: '0xdeadbeef', - LayoutObjectsThatHadNeverHadLayout: 100, - contentsHeightAfterLayout: 800, - visibleHeight: 1000 - }, - contentsHeightBeforeLayout: 800 - } - })); - mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - cat: 'devtools.timeline', - title: 'Paint', - start: 1000, - duration: 1.0, - args: {data: {frame: '0xdeadbeef'}} - })); - }); - var values = new tr.v.ValueSet(); - tr.metrics.sh.firstPaintMetric(values, model); - var fmpEntries = values.valueDicts.filter( - (dict) => dict.name === 'firstMeaningfulPaint'); - var numeric = fmpEntries[0].numeric; - assert.equal(1, numeric.running.count); - assert.equal(800, numeric.running.mean); - }); - - test('firstMeaningfulPaintWithInvalidLayoutCounters', function() { - var model = tr.c.TestUtils.newModel(function(model) { - var rendererProcess = model.getOrCreateProcess(1); - var mainThread = rendererProcess.getOrCreateThread(2); - mainThread.name = 'CrRendererMain'; - mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - cat: 'blink.user_timing', - title: 'navigationStart', - start: 200, - duration: 0.0, - args: {frame: '0xdeadbeef'} - })); - rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300, - {isLoadingMainFrame: true, frame: {id_ref: '0xdeadbeef'}, - documentLoaderURL: 'http://example.com'}); - - // FrameView::performLayout trace event does not have frame ID - // if blink.debug.layout category is not enabled. - mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - cat: 'blink,benchmark,disabled-by-default-blink.debug.layout', - title: 'FrameView::performLayout', - start: 500, - duration: 10.0, - args: { - counters: {}, - contentsHeightBeforeLayout: 0 - } - })); - - // Incomplete slice: counters argument is missing. - mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - cat: 'blink,benchmark,disabled-by-default-blink.debug.layout', - title: 'FrameView::performLayout', - start: 550, - duration: 10.0, - args: { - contentsHeightBeforeLayout: 0 - } - })); - - mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - cat: 'devtools.timeline', - title: 'Paint', - start: 600, - duration: 1.0, - args: {data: {frame: '0xdeadbeef'}} - })); - }); - var values = new tr.v.ValueSet(); - tr.metrics.sh.firstPaintMetric(values, model); - var fmpEntries = values.valueDicts.filter( - (dict) => dict.name === 'firstMeaningfulPaint'); - var numeric = fmpEntries[0].numeric; - assert.equal(0, numeric.running.count); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/hazard_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/hazard_metric.html deleted file mode 100644 index 96961779782..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/hazard_metric.html +++ /dev/null @@ -1,145 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2015 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<link rel="import" href="/tracing/metrics/metric_registry.html"> -<link rel="import" href="/tracing/metrics/system_health/long_tasks_metric.html"> -<link rel="import" href="/tracing/value/numeric.html"> -<link rel="import" href="/tracing/value/value.html"> - -<script> -'use strict'; - -tr.exportTo('tr.metrics.sh', function() { - var normalizedPercentage_smallerIsBetter = - tr.v.Unit.byName.normalizedPercentage_smallerIsBetter; - - // The following math is easier if the units are seconds rather than ms, - // so durations will be converted from ms to s. - var MS_PER_S = 1000; - - // https://www.desmos.com/calculator/ysabhcc42g - var RESPONSE_RISK = - tr.b.Statistics.LogNormalDistribution.fromMedianAndDiminishingReturns( - 100 / MS_PER_S, 50 / MS_PER_S); - - /** - * This helper function computes the risk that a task of the given duration - * would impact the responsiveness of a speculative input. - * - * @param {number} durationMs - * @return {number} task hazard - */ - function computeResponsivenessRisk(durationMs) { - // Returns 0 when the risk of impacting responsiveness is minimal. - // Returns 1 when it is maximal. - // durationMs is the duration of a long task. - // It is at least LONG_TASK_MS. - // The FAST_RESPONSE_HISTOGRAM was designed to permit both a 50ms task - // when a Scroll Response begins, plus 16ms latency between the task - // and the first frame of the scroll, without impacting the responsiveness - // score. - // Add 16ms to durationMs to simulate the standard (maximum ideal) scroll - // response latency, and use the FAST_RESPONSE_HISTOGRAM to punish every ms - // that the long task exceeds LONG_TASK_MS. - - durationMs += 16; - - // This returns a normalized percentage that - // represents the fraction of users that would be satisfied with a - // Scroll Response that takes durationMs to respond. - // The risk of impacting responsiveness is approximated as the long task's - // impact on a hypothetical Scroll Response that starts when the long task - // starts, and then takes the standard 16ms to respond after the long task - // finishes. - // We imagine a Scroll Response instead of a Load or another type of - // Response because the Scroll Response carries the strictest expectation. - // The risk of impacting responsiveness is framed as the fraction of users - // that would be *un*satisifed with the responsiveness of that hypothetical - // Scroll Response. The fraction of users who are unsatisfied with something - // is equal to 1 - the fraction of users who are satisfied with it. - return RESPONSE_RISK.computePercentile(durationMs / MS_PER_S); - } - - /** - * This weighting function is similar to tr.metrics.sh.perceptualBlend, - * but this version is appropriate for SmallerIsBetter metrics, whereas - * that version is for BiggerIsBetter metrics. - * (This would not be necessary if hazard were reframed as a BiggerIsBetter - * metric such as "input readiness".) - * Also, that version assumes that the 'ary' will be UserExpectations, whereas - * this version assumes that the 'ary' will be scores. - * - * @param {number} hazardScore - * @return {number} weight - */ - function perceptualBlendSmallerIsBetter(hazardScore) { - return Math.exp(hazardScore); - } - - /** - * Compute and return the normalized score for the risk that a speculative - * input's responsiveness would have been impacted by long tasks on the given - * thread in the given range. - * - * @param {tr.model.Thread} thread - * @param {tr.b.Range=} opt_range - * @return {number} hazard - */ - function computeHazardForLongTasksInRangeOnThread(thread, opt_range) { - var taskHazardScores = []; - tr.metrics.sh.iterateLongTopLevelTasksOnThreadInRange( - thread, opt_range, function(task) { - taskHazardScores.push(computeResponsivenessRisk(task.duration)); - }); - return tr.b.Statistics.weightedMean( - taskHazardScores, perceptualBlendSmallerIsBetter); - } - - /** - * Compute and return the normalized score for the risk that a speculative - * input's responsiveness would have been impacted by long tasks. - * - * @param {tr.model.Model} model The model. - * @return {number} hazard - */ - function computeHazardForLongTasks(model) { - var threadHazardScores = []; - tr.metrics.sh.iterateRendererMainThreads(model, function(thread) { - threadHazardScores.push(computeHazardForLongTasksInRangeOnThread( - thread)); - }); - return tr.b.Statistics.weightedMean( - threadHazardScores, perceptualBlendSmallerIsBetter); - } - - /** - * This EXPERIMENTAL metric computes a scalar normalized score that - * represents the risk that a speculative input's responsiveness would have - * been impacted by long tasks. - * This metric requires only the 'toplevel' tracing category. - */ - function hazardMetric(values, model) { - var overallHazard = computeHazardForLongTasks(model); - if (overallHazard === undefined) - overallHazard = 0; - - values.addValue(new tr.v.NumericValue( - 'hazard', new tr.v.ScalarNumeric( - normalizedPercentage_smallerIsBetter, overallHazard))); - } - - tr.metrics.MetricRegistry.register(hazardMetric); - - return { - hazardMetric: hazardMetric, - computeHazardForLongTasksInRangeOnThread: - computeHazardForLongTasksInRangeOnThread, - computeHazardForLongTasks: computeHazardForLongTasks, - computeResponsivenessRisk: computeResponsivenessRisk - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/hazard_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/hazard_metric_test.html deleted file mode 100644 index 629f608e942..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/hazard_metric_test.html +++ /dev/null @@ -1,88 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2015 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<link rel="import" href="/tracing/core/test_utils.html"> -<link rel="import" - href="/tracing/metrics/system_health/hazard_metric.html"> -<link rel="import" href="/tracing/value/value_set.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - function computeHazardValue(customizeModelCallback) { - var model = tr.c.TestUtils.newModel(function(model) { - model.rendererProcess = model.getOrCreateProcess(2); - model.rendererMain = model.rendererProcess.getOrCreateThread(3); - model.rendererMain.name = 'CrRendererMain'; - - customizeModelCallback(model); - }); - var values = new tr.v.ValueSet(); - tr.metrics.sh.hazardMetric(values, model); - var valueDicts = values.valueDicts; - assert.equal(1, valueDicts.length); - return valueDicts[0]; - } - - test('minimalHazard', function() { - var duration = 50 + 1e-4; - var value = computeHazardValue(function(model) { - model.rendererMain.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - type: tr.model.ThreadSlice, - isTopLevel: true, - start: 0, - duration: duration - })); - }); - assert.notEqual(0, value.numeric.value); - assert.closeTo(value.numeric.value, 0.1611, 1e-5); - }); - - test('maximalHazard', function() { - var value = computeHazardValue(function(model) { - model.rendererMain.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - type: tr.model.ThreadSlice, - isTopLevel: true, - start: 0, - duration: 2200 - })); - }); - assert.closeTo(value.numeric.value, 1, 1e-5); - }); - - test('blendedHazards', function() { - var value = computeHazardValue(function(model) { - model.rendererMain.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - type: tr.model.ThreadSlice, - isTopLevel: true, - start: 0, - duration: 100 - })); - model.rendererMain.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - type: tr.model.ThreadSlice, - isTopLevel: true, - start: 0, - duration: 200 - })); - model.rendererMain.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - type: tr.model.ThreadSlice, - isTopLevel: true, - start: 0, - duration: 300 - })); - model.rendererMain.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - type: tr.model.ThreadSlice, - isTopLevel: true, - start: 0, - duration: 400 - })); - }); - assert.closeTo(0.92144, value.numeric.value, 1e-4); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/long_tasks_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/long_tasks_metric.html deleted file mode 100644 index 1e2fea97a19..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/long_tasks_metric.html +++ /dev/null @@ -1,107 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright 2016 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<link rel="import" href="/tracing/metrics/metric_registry.html"> -<link rel="import" href="/tracing/model/helpers/chrome_model_helper.html"> -<link rel="import" href="/tracing/value/numeric.html"> -<link rel="import" href="/tracing/value/value.html"> - -<script> -'use strict'; - -tr.exportTo('tr.metrics.sh', function() { - var LONG_TASK_MS = 50; - - // Anything longer than this should be so rare that its length beyond this is - // uninteresting. - var LONGEST_TASK_MS = 1000; - - var timeDurationInMs_smallerIsBetter = - tr.v.Unit.byName.timeDurationInMs_smallerIsBetter; - - /** - * This helper function calls |cb| for each of the top-level tasks on the - * given thread in the given range whose duration is longer than LONG_TASK_MS. - * - * @param {tr.model.Thread} thread - * @param {tr.b.Range=} opt_range - * @param {function()} cb - * @param {Object=} opt_this - */ - function iterateLongTopLevelTasksOnThreadInRange( - thread, opt_range, cb, opt_this) { - thread.sliceGroup.topLevelSlices.forEach(function(slice) { - if (opt_range && - !opt_range.intersectsExplicitRangeExclusive(slice.start, slice.end)) - return; - - if (slice.duration < LONG_TASK_MS) - return; - - cb.call(opt_this, slice); - }); - } - - /** - * This helper function calls |cb| for each of the main renderer threads in - * the model. - * - * @param {tr.model.Model} model The model. - * @param {function()} cb Callback. - * @param {Object=} opt_this Context object. - */ - function iterateRendererMainThreads(model, cb, opt_this) { - var modelHelper = model.getOrCreateHelper( - tr.model.helpers.ChromeModelHelper); - tr.b.dictionaryValues(modelHelper.rendererHelpers).forEach( - function(rendererHelper) { - if (!rendererHelper.mainThread) - return; - cb.call(opt_this, rendererHelper.mainThread); - }); - } - - var LONG_TASK_NUMERIC_BUILDER = tr.v.NumericBuilder.createLinear( - tr.v.Unit.byName.timeDurationInMs_smallerIsBetter, - tr.b.Range.fromExplicitRange(LONG_TASK_MS, LONGEST_TASK_MS), 50); - - /** - * This metric directly measures long tasks on renderer main threads. - * This metric requires only the 'toplevel' tracing category. - * - * @param {!tr.v.ValueSet} values - * @param {!tr.model.Model} model - * @param {!Object=} opt_options - */ - function longTasksMetric(values, model, opt_options) { - var rangeOfInterest = opt_options ? opt_options.rangeOfInterest : undefined; - var longTaskNumeric = LONG_TASK_NUMERIC_BUILDER.build(); - iterateRendererMainThreads(model, function(thread) { - iterateLongTopLevelTasksOnThreadInRange( - thread, rangeOfInterest, function(task) { - longTaskNumeric.add(task.duration, task.stableId); - }); - }); - var options = {description: 'durations of long tasks'}; - values.addValue(new tr.v.NumericValue( - 'long tasks', longTaskNumeric, options)); - } - - tr.metrics.MetricRegistry.register(longTasksMetric, { - supportsRangeOfInterest: true - }); - - return { - longTasksMetric: longTasksMetric, - iterateLongTopLevelTasksOnThreadInRange: - iterateLongTopLevelTasksOnThreadInRange, - iterateRendererMainThreads: iterateRendererMainThreads, - LONG_TASK_MS: LONG_TASK_MS, - LONGEST_TASK_MS: LONGEST_TASK_MS - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/memory_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/memory_metric.html deleted file mode 100644 index 1aa81e05b2b..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/memory_metric.html +++ /dev/null @@ -1,1023 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright 2016 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<link rel="import" href="/tracing/base/iteration_helpers.html"> -<link rel="import" href="/tracing/base/multi_dimensional_view.html"> -<link rel="import" href="/tracing/base/range.html"> -<link rel="import" href="/tracing/metrics/metric_registry.html"> -<link rel="import" href="/tracing/model/container_memory_dump.html"> -<link rel="import" href="/tracing/model/helpers/chrome_model_helper.html"> -<link rel="import" href="/tracing/model/memory_allocator_dump.html"> -<link rel="import" href="/tracing/value/numeric.html"> -<link rel="import" href="/tracing/value/unit.html"> -<link rel="import" href="/tracing/value/value.html"> - -<script> -'use strict'; - -tr.exportTo('tr.metrics.sh', function() { - var LIGHT = tr.model.ContainerMemoryDump.LevelOfDetail.LIGHT; - var DETAILED = tr.model.ContainerMemoryDump.LevelOfDetail.DETAILED; - var ScalarNumeric = tr.v.ScalarNumeric; - var sizeInBytes_smallerIsBetter = - tr.v.Unit.byName.sizeInBytes_smallerIsBetter; - var unitlessNumber_smallerIsBetter = - tr.v.Unit.byName.unitlessNumber_smallerIsBetter; - var DISPLAYED_SIZE_NUMERIC_NAME = - tr.model.MemoryAllocatorDump.DISPLAYED_SIZE_NUMERIC_NAME; - - var LEVEL_OF_DETAIL_NAMES = new Map(); - LEVEL_OF_DETAIL_NAMES.set(LIGHT, 'light'); - LEVEL_OF_DETAIL_NAMES.set(DETAILED, 'detailed'); - - var MEMORY_NUMERIC_BUILDER_MAP = new WeakMap(); - // For unitless numerics (process counts), we use 20 linearly scaled bins - // from 0 to 20. - MEMORY_NUMERIC_BUILDER_MAP.set(unitlessNumber_smallerIsBetter, - tr.v.NumericBuilder.createLinear( - tr.v.Unit.byName.unitlessNumber_smallerIsBetter, - tr.b.Range.fromExplicitRange(0, 20), 20)); - // For size numerics (subsystem and vm stats), we use 1 bin from 0 B to - // 1 KiB and 4*24 exponentially scaled bins from 1 KiB to 16 GiB (=2^24 KiB). - MEMORY_NUMERIC_BUILDER_MAP.set(sizeInBytes_smallerIsBetter, - new tr.v.NumericBuilder(sizeInBytes_smallerIsBetter, 0) - .addBinBoundary(1024 /* 1 KiB */) - .addExponentialBins(16 * 1024 * 1024 * 1024 /* 16 GiB */, 4 * 24)); - - function memoryMetric(values, model) { - var browserNameToGlobalDumps = splitGlobalDumpsByBrowserName(model); - addGeneralMemoryDumpValues(browserNameToGlobalDumps, values); - addDetailedMemoryDumpValues(browserNameToGlobalDumps, values); - addMemoryDumpCountValues(browserNameToGlobalDumps, values); - } - - /** - * Splits the global memory dumps in |model| by browser name. - * - * @param {!tr.Model} model The trace model from which the global dumps - * should be extracted. - * @return {!Map<string, !Array<!tr.model.GlobalMemoryDump>} A map from - * browser names to the associated global memory dumps. - */ - function splitGlobalDumpsByBrowserName(model) { - var chromeModelHelper = - model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper); - var browserNameToGlobalDumps = new Map(); - var globalDumpToBrowserHelper = new WeakMap(); - - // 1. For each browser process in the model, add its global memory dumps to - // |browserNameToGlobalDumps|. |chromeModelHelper| can be undefined if - // it fails to find any browser, renderer or GPU process (see - // tr.model.helpers.ChromeModelHelper.supportsModel). - if (chromeModelHelper) { - chromeModelHelper.browserHelpers.forEach(function(helper) { - // Retrieve the associated global memory dumps and check that they - // haven't been classified as belonging to another browser process. - var globalDumps = helper.process.memoryDumps.map( - d => d.globalMemoryDump); - globalDumps.forEach(function(globalDump) { - var existingHelper = globalDumpToBrowserHelper.get(globalDump); - if (existingHelper !== undefined) { - throw new Error('Memory dump ID clash across multiple browsers ' + - 'with PIDs: ' + existingHelper.pid + ' and ' + helper.pid); - } - globalDumpToBrowserHelper.set(globalDump, helper); - }); - - makeKeyUniqueAndSet(browserNameToGlobalDumps, - canonicalizeName(helper.browserName), globalDumps); - }); - } - - // 2. If any global memory dump does not have any associated browser - // process for some reason, associate it with an 'unknown_browser' browser - // so that we don't lose the data. - var unclassifiedGlobalDumps = - model.globalMemoryDumps.filter(g => !globalDumpToBrowserHelper.has(g)); - if (unclassifiedGlobalDumps.length > 0) { - makeKeyUniqueAndSet( - browserNameToGlobalDumps, 'unknown_browser', unclassifiedGlobalDumps); - } - - return browserNameToGlobalDumps; - } - - function canonicalizeName(name) { - return name.toLowerCase().replace(' ', '_'); - }; - - var USER_FRIENDLY_BROWSER_NAMES = { - 'chrome': 'Chrome', - 'webview': 'WebView', - 'unknown_browser': 'an unknown browser' - }; - - /** - * Convert a canonical browser name used in value names to a user-friendly - * name used in value descriptions. - * - * Examples: - * - * CANONICAL BROWSER NAME -> USER-FRIENDLY NAME - * chrome -> Chrome - * unknown_browser -> an unknown browser - * webview2 -> WebView(2) - * unexpected -> 'unexpected' browser - */ - function convertBrowserNameToUserFriendlyName(browserName) { - for (var baseName in USER_FRIENDLY_BROWSER_NAMES) { - if (!browserName.startsWith(baseName)) - continue; - var userFriendlyBaseName = USER_FRIENDLY_BROWSER_NAMES[baseName]; - var suffix = browserName.substring(baseName.length); - if (suffix.length === 0) - return userFriendlyBaseName; - else if (/^\d+$/.test(suffix)) - return userFriendlyBaseName + '(' + suffix + ')'; - } - return '\'' + browserName + '\' browser'; - } - - function canonicalizeProcessName(rawProcessName) { - if (!rawProcessName) - return 'unknown_processes'; - var baseCanonicalName = canonicalizeName(rawProcessName); - switch (baseCanonicalName) { - case 'renderer': - return 'renderer_processes'; // Intentionally plural. - case 'browser': - return 'browser_process'; - default: - return baseCanonicalName; - } - } - - /** - * Convert a canonical process name used in value names to a user-friendly - * name used in value descriptions. - */ - function convertProcessNameToUserFriendlyName(processName, - opt_requirePlural) { - switch (processName) { - case 'browser_process': - return opt_requirePlural ? 'browser processes' : 'the browser process'; - case 'renderer_processes': - return 'renderer processes'; - case 'gpu_process': - return opt_requirePlural ? 'GPU processes' : 'the GPU process'; - case 'ppapi_process': - return opt_requirePlural ? 'PPAPI processes' : 'the PPAPI process'; - case 'all_processes': - return 'all processes'; - case 'unknown_processes': - return 'unknown processes'; - default: - return '\'' + processName + '\' processes'; - } - } - - /** - * Function for adding entries with duplicate keys to a map without - * overriding existing entries. - * - * This is achieved by appending numeric indices (2, 3, 4, ...) to duplicate - * keys. Example: - * - * var map = new Map(); - * // map = Map {}. - * - * makeKeyUniqueAndSet(map, 'key', 'a'); - * // map = Map {"key" => "a"}. - * - * makeKeyUniqueAndSet(map, 'key', 'b'); - * // map = Map {"key" => "a", "key2" => "b"}. - * ^^^^ - * makeKeyUniqueAndSet(map, 'key', 'c'); - * // map = Map {"key" => "a", "key2" => "b", "key3" => "c"}. - * ^^^^ ^^^^ - */ - function makeKeyUniqueAndSet(map, key, value) { - var uniqueKey = key; - var nextIndex = 2; - while (map.has(uniqueKey)) { - uniqueKey = key + nextIndex; - nextIndex++; - } - map.set(uniqueKey, value); - } - - /** - * Add general memory dump values calculated from all global memory dumps to - * |values|. In particular, this function adds the following values: - * - * * PROCESS COUNTS - * memory:{chrome, webview}: - * {browser_process, renderer_processes, ..., all_processes}: - * process_count - * type: tr.v.Numeric (histogram over all matching global memory dumps) - * unit: unitlessNumber_smallerIsBetter - * - * * MEMORY USAGE REPORTED BY CHROME - * memory:{chrome, webview}: - * {browser_process, renderer_processes, ..., all_processes}: - * reported_by_chrome[:{v8, malloc, ...}]: - * {effective_size, allocated_objects_size, locked_size} - * type: tr.v.Numeric (histogram over all matching global memory dumps) - * unit: sizeInBytes_smallerIsBetter - */ - function addGeneralMemoryDumpValues(browserNameToGlobalDumps, values) { - addMemoryDumpValues(browserNameToGlobalDumps, - gmd => true /* process all global memory dumps */, - function(processDump, addProcessScalar) { - // Increment memory:<browser-name>:<process-name>:process_count value. - addProcessScalar({ - source: 'process_count', - value: 1, - unit: unitlessNumber_smallerIsBetter, - descriptionPrefixBuilder: buildProcessCountDescriptionPrefix - }); - - // Add memory:<browser-name>:<process-name>:reported_by_chrome:... - // values. - if (processDump.memoryAllocatorDumps === undefined) - return; - processDump.memoryAllocatorDumps.forEach(function(rootAllocatorDump) { - CHROME_VALUE_PROPERTIES.forEach(function(spec) { - addProcessScalar({ - source: 'reported_by_chrome', - component: [rootAllocatorDump.name], - property: spec.propertyName, - value: rootAllocatorDump.numerics[spec.propertyName], - descriptionPrefixBuilder: spec.descriptionPrefixBuilder - }); - }); - }); - }, - function(componentTree) { - // Subtract memory:<browser-name>:<process-name>:reported_by_chrome: - // tracing:<size-property> from memory:<browser-name>:<process-name>: - // reported_by_chrome:<size-property> if applicable. - var tracingNode = componentTree.children[1].get('tracing'); - if (tracingNode === undefined) - return; - for (var i = 0; i < componentTree.values.length; i++) - componentTree.values[i].total -= tracingNode.values[i].total; - }, values); - } - - /** - * Build a description prefix for a memory:<browser-name>:<process-name>: - * process_count value. - * - * @param {!Array<string>} componentPath The underlying component path (must - * be empty). - * @param {string} processName The canonical name of the process. - * @return {string} Prefix for the value's description (always - * 'total number of renderer processes'). - */ - function buildProcessCountDescriptionPrefix(componentPath, processName) { - if (componentPath.length > 0) { - throw new Error('Unexpected process count non-empty component path: ' + - componentPath.join(':')); - } - return 'total number of ' + convertProcessNameToUserFriendlyName( - processName, true /* opt_requirePlural */); - } - - /** - * Build a description prefix for a memory:<browser-name>:<process-name>: - * reported_by_chrome:... value. - * - * @param {{ - * userFriendlyPropertyName: string, - * userFriendlyPropertyNamePrefix: (string|undefined), - * totalUserFriendlyPropertyName: (string|undefined), - * componentPreposition: (string|undefined) }} - * formatSpec Specification of how the property should be formatted. - * @param {!Array<string>} componentPath The underlying component path (e.g. - * ['malloc']). - * @param {string} processName The canonical name of the process. - * @return {string} Prefix for the value's description (e.g. - * 'effective size of malloc in the browser process'). - */ - function buildChromeValueDescriptionPrefix( - formatSpec, componentPath, processName) { - var nameParts = []; - if (componentPath.length === 0) { - nameParts.push('total'); - if (formatSpec.totalUserFriendlyPropertyName) { - nameParts.push(formatSpec.totalUserFriendlyPropertyName); - } else { - if (formatSpec.userFriendlyPropertyNamePrefix) - nameParts.push(formatSpec.userFriendlyPropertyNamePrefix); - nameParts.push(formatSpec.userFriendlyPropertyName); - } - nameParts.push('reported by Chrome for'); - } else { - if (formatSpec.componentPreposition === undefined) { - // Use component name as an adjective - // (e.g. 'size of V8 code and metadata'). - if (formatSpec.userFriendlyPropertyNamePrefix) - nameParts.push(formatSpec.userFriendlyPropertyNamePrefix); - nameParts.push(componentPath.join(':')); - nameParts.push(formatSpec.userFriendlyPropertyName); - } else { - // Use component name as a noun with a preposition - // (e.g. 'size of all objects allocated BY MALLOC'). - if (formatSpec.userFriendlyPropertyNamePrefix) - nameParts.push(formatSpec.userFriendlyPropertyNamePrefix); - nameParts.push(formatSpec.userFriendlyPropertyName); - nameParts.push(formatSpec.componentPreposition); - nameParts.push(componentPath.join(':')); - } - nameParts.push('in'); - } - nameParts.push(convertProcessNameToUserFriendlyName(processName)); - return nameParts.join(' '); - } - - // Specifications of properties reported by Chrome. - var CHROME_VALUE_PROPERTIES = [ - { - propertyName: 'effective_size', - descriptionPrefixBuilder: buildChromeValueDescriptionPrefix.bind( - undefined, { - userFriendlyPropertyName: 'effective size', - componentPreposition: 'of' - }) - }, - { - propertyName: 'allocated_objects_size', - descriptionPrefixBuilder: buildChromeValueDescriptionPrefix.bind( - undefined, { - userFriendlyPropertyName: 'size of all objects allocated', - totalUserFriendlyPropertyName: 'size of all allocated objects', - componentPreposition: 'by' - }) - }, - { - propertyName: 'locked_size', - descriptionPrefixBuilder: buildChromeValueDescriptionPrefix.bind( - undefined, { - userFriendlyPropertyName: 'locked (pinned) size', - componentPreposition: 'of' - }) - } - ]; - - /** - * Add heavy memory dump values calculated from heavy global memory dumps to - * |values|. In particular, this function adds the following values: - * - * * MEMORY USAGE REPORTED BY THE OS - * memory:{chrome, webview}: - * {browser_process, renderer_processes, ..., all_processes}: - * reported_by_os:system_memory:[{ashmem, native_heap, java_heap}:] - * {proportional_resident_size, private_dirty_size} - * memory:{chrome, webview}: - * {browser_process, renderer_processes, ..., all_processes}: - * reported_by_os:gpu_memory:[{gl, graphics, ...}:] - * proportional_resident_size - * type: tr.v.Numeric (histogram over matching heavy global memory dumps) - * unit: sizeInBytes_smallerIsBetter - * - * * MEMORY USAGE REPORTED BY CHROME - * memory:{chrome, webview}: - * {browser_process, renderer_processes, ..., all_processes}: - * reported_by_chrome:v8:code_and_metadata_size - * type: tr.v.Numeric (histogram over matching heavy global memory dumps) - * unit: sizeInBytes_smallerIsBetter - */ - function addDetailedMemoryDumpValues(browserNameToGlobalDumps, values) { - addMemoryDumpValues(browserNameToGlobalDumps, - g => g.levelOfDetail === DETAILED, - function(processDump, addProcessScalar) { - // Add memory:<browser-name>:<process-name>:reported_by_os: - // system_memory:... values. - tr.b.iterItems( - SYSTEM_VALUE_COMPONENTS, - function(componentName, componentSpec) { - tr.b.iterItems( - SYSTEM_VALUE_PROPERTIES, - function(propertyName, propertySpec) { - var node = getDescendantVmRegionClassificationNode( - processDump.vmRegions, - componentSpec.classificationPath); - var componentPath = ['system_memory']; - if (componentName) - componentPath.push(componentName); - addProcessScalar({ - source: 'reported_by_os', - component: componentPath, - property: propertyName, - value: node === undefined ? - 0 : (node.byteStats[propertySpec.byteStat] || 0), - unit: sizeInBytes_smallerIsBetter, - descriptionPrefixBuilder: - propertySpec.descriptionPrefixBuilder - }); - }); - }); - - // Add memory:<browser-name>:<process-name>:reported_by_os: - // gpu_memory:... values. - var memtrackDump = processDump.getMemoryAllocatorDumpByFullName( - 'gpu/android_memtrack'); - if (memtrackDump !== undefined) { - var descriptionPrefixBuilder = SYSTEM_VALUE_PROPERTIES[ - 'proportional_resident_size'].descriptionPrefixBuilder; - memtrackDump.children.forEach(function(memtrackChildDump) { - var childName = memtrackChildDump.name; - addProcessScalar({ - source: 'reported_by_os', - component: ['gpu_memory', childName], - property: 'proportional_resident_size', - value: memtrackChildDump.numerics['memtrack_pss'], - descriptionPrefixBuilder: descriptionPrefixBuilder - }); - }); - } - - // Add memory:<browser-name>:<process-name>:reported_by_chrome:v8: - // code_and_metadata_size when available. - var v8Dump = processDump.getMemoryAllocatorDumpByFullName('v8'); - if (v8Dump !== undefined) { - // V8 generates bytecode when interpreting and code objects when - // compiling the javascript. Total code size includes the size - // of code and bytecode objects. - addProcessScalar({ - source: 'reported_by_chrome', - component: ['v8'], - property: 'code_and_metadata_size', - value: v8Dump.numerics['code_and_metadata_size'], - descriptionPrefixBuilder: - buildCodeAndMetadataSizeValueDescriptionPrefix - }); - addProcessScalar({ - source: 'reported_by_chrome', - component: ['v8'], - property: 'code_and_metadata_size', - value: v8Dump.numerics['bytecode_and_metadata_size'], - descriptionPrefixBuilder: - buildCodeAndMetadataSizeValueDescriptionPrefix - }); - } - }, function(componentTree) {}, values); - } - - // Specifications of components reported by the system. - var SYSTEM_VALUE_COMPONENTS = { - '': { - classificationPath: [], - }, - 'java_heap': { - classificationPath: ['Android', 'Java runtime', 'Spaces'], - userFriendlyName: 'the Java heap' - }, - 'ashmem': { - classificationPath: ['Android', 'Ashmem'], - userFriendlyName: 'ashmem' - }, - 'native_heap': { - classificationPath: ['Native heap'], - userFriendlyName: 'the native heap' - } - }; - - // Specifications of properties reported by the system. - var SYSTEM_VALUE_PROPERTIES = { - 'proportional_resident_size': { - byteStat: 'proportionalResident', - descriptionPrefixBuilder: buildOsValueDescriptionPrefix.bind( - undefined, 'proportional resident size (PSS)') - }, - 'private_dirty_size': { - byteStat: 'privateDirtyResident', - descriptionPrefixBuilder: buildOsValueDescriptionPrefix.bind( - undefined, 'private dirty size') - } - }; - - /** - * Build a description prefix for a memory:<browser-name>:<process-name>: - * reported_by_os:... value. - * - * @param {string} userFriendlyPropertyName User-friendly name of the - * underlying property (e.g. 'private dirty size'). - * @param {!Array<string>} componentPath The underlying component path (e.g. - * ['system', 'java_heap']). - * @param {string} processName The canonical name of the process. - * @return {string} Prefix for the value's description (e.g. - * 'total private dirty size of the Java heal in the GPU process'). - */ - function buildOsValueDescriptionPrefix( - userFriendlyPropertyName, componentPath, processName) { - if (componentPath.length > 2) { - throw new Error('OS value component path for \'' + - userFriendlyPropertyName + '\' too long: ' + componentPath.join(':')); - } - - var nameParts = []; - if (componentPath.length < 2) - nameParts.push('total'); - - nameParts.push(userFriendlyPropertyName); - - if (componentPath.length > 0) { - switch (componentPath[0]) { - case 'system_memory': - if (componentPath.length > 1) { - var userFriendlyComponentName = - SYSTEM_VALUE_COMPONENTS[componentPath[1]].userFriendlyName; - if (userFriendlyComponentName === undefined) { - throw new Error('System value sub-component for \'' + - userFriendlyPropertyName + '\' unknown: ' + - componentPath.join(':')); - } - nameParts.push('of', userFriendlyComponentName, 'in'); - } else { - nameParts.push('of system memory (RAM) used by'); - } - break; - - case 'gpu_memory': - if (componentPath.length > 1) { - nameParts.push('of the', componentPath[1]); - nameParts.push('Android memtrack component in'); - } else { - nameParts.push('of GPU memory (Android memtrack) used by'); - } - break; - - default: - throw new Error('OS value component for \'' + - userFriendlyPropertyName + '\' unknown: ' + - componentPath.join(':')); - } - } else { - nameParts.push('reported by the OS for'); - } - - nameParts.push(convertProcessNameToUserFriendlyName(processName)); - return nameParts.join(' '); - } - - /** - * Build a description prefix for a memory:<browser-name>:<process-name>: - * reported_by_chrome:...:code_and_metadata_size value. - * - * @param {!Array<string>} componentPath The underlying component path (e.g. - * ['v8']). - * @param {string} processName The canonical name of the process. - * @return {string} Prefix for the value's description (e.g. - * 'size of v8 code and metadata in'). - */ - function buildCodeAndMetadataSizeValueDescriptionPrefix( - componentPath, processName) { - return buildChromeValueDescriptionPrefix({ - userFriendlyPropertyNamePrefix: 'size of', - userFriendlyPropertyName: 'code and metadata' - }, componentPath, processName); - } - - /** - * Get the descendant of a VM region classification |node| specified by the - * given |path| of child node titles. If |node| is undefined or such a - * descendant does not exist, this function returns undefined. - */ - function getDescendantVmRegionClassificationNode(node, path) { - for (var i = 0; i < path.length; i++) { - if (node === undefined) - break; - node = tr.b.findFirstInArray(node.children, c => c.title === path[i]); - } - return node; - } - - /** - * Add global memory dump counts to |values|. In particular, this function - * adds the following values: - * - * * DUMP COUNTS - * memory:{chrome, webview}:all_processes:dump_count[:{light, detailed}] - * type: tr.v.ScalarNumeric (scalar over the whole trace) - * unit: unitlessNumber_smallerIsBetter - * - * Note that unlike all other values generated by the memory metric, the - * global memory dump counts are NOT instances of tr.v.Numeric (histogram) - * because it doesn't make sense to aggregate them (they are already counts - * over all global dumps associated with the relevant browser). - */ - function addMemoryDumpCountValues(browserNameToGlobalDumps, values) { - browserNameToGlobalDumps.forEach(function(globalDumps, browserName) { - var totalDumpCount = 0; - var levelOfDetailNameToDumpCount = {}; - LEVEL_OF_DETAIL_NAMES.forEach(function(levelOfDetailName) { - levelOfDetailNameToDumpCount[levelOfDetailName] = 0; - }); - - globalDumps.forEach(function(globalDump) { - totalDumpCount++; - - // Increment the level-of-detail-specific dump count (if possible). - var levelOfDetailName = - LEVEL_OF_DETAIL_NAMES.get(globalDump.levelOfDetail); - if (!(levelOfDetailName in levelOfDetailNameToDumpCount)) - return; // Unknown level of detail. - levelOfDetailNameToDumpCount[levelOfDetailName]++; - }); - - // Add memory:<browser-name>:all_processes:dump_count[:<level>] values. - reportMemoryDumpCountAsValue(browserName, undefined /* total */, - totalDumpCount, values); - tr.b.iterItems(levelOfDetailNameToDumpCount, - function(levelOfDetailName, levelOfDetailDumpCount) { - reportMemoryDumpCountAsValue(browserName, levelOfDetailName, - levelOfDetailDumpCount, values); - }); - }); - } - - /** - * Add a tr.v.ScalarNumeric value to |values| reporting that the number of - * |levelOfDetailName| memory dumps added by |browserName| was - * |levelOfDetailCount|. - */ - function reportMemoryDumpCountAsValue( - browserName, levelOfDetailName, levelOfDetailDumpCount, values) { - // Construct the name of the memory value. - var nameParts = ['memory', browserName, 'all_processes', 'dump_count']; - if (levelOfDetailName !== undefined) - nameParts.push(levelOfDetailName); - var name = nameParts.join(':'); - - // Build the underlying numeric for the memory value. - var numeric = new ScalarNumeric( - unitlessNumber_smallerIsBetter, levelOfDetailDumpCount); - - // Build the options for the memory value. - var description = [ - 'total number of', - levelOfDetailName || 'all', - 'memory dumps added by', - convertBrowserNameToUserFriendlyName(browserName), - 'to the trace' - ].join(' '); - var options = { description: description }; - - // Report the memory value. - values.addValue(new tr.v.NumericValue(name, numeric, options)); - } - - /** - * Add generic values extracted from process memory dumps and aggregated by - * process name and component path into |values|. - * - * For each browser and set of global dumps in |browserNameToGlobalDumps|, - * |customProcessDumpValueExtractor| is applied to every process memory dump - * associated with the global memory dump. The second argument provided to the - * callback is a function for adding extracted values: - * - * function sampleProcessDumpCallback(processDump, addProcessValue) { - * ... - * addProcessScalar({ - * source: 'reported_by_chrome', - * component: ['system', 'native_heap'], - * property: 'proportional_resident_size', - * value: pssExtractedFromProcessDump2, - * descriptionPrefixBuilder: function(componentPath) { - * return 'PSS of ' + componentPath.join('/') + ' in'; - * } - * }); - * ... - * } - * - * For each global memory dump, the extracted values are summed by process - * name (browser_process, renderer_processes, ..., all_processes) and - * component path (e.g. gpu is a sum of gpu:gl, gpu:graphics, ...). The sums - * are then aggregated over all global memory dumps associated with the given - * browser. For example, assuming that |customProcessDumpValueExtractor| - * extracts 'proportional_resident_size' values for component paths - * ['X', 'A'], ['X', 'B'] and ['Y'] under the same 'source' from each process - * memory dump, the following values will be reported (for Chrome): - * - * memory:chrome:browser_process:source:X:A:proportional_resident_size : - * Numeric aggregated over [ - * sum of X:A in all 'browser' process dumps in global dump 1, - * ... - * sum of X:A in all 'browser' process dumps in global dump N - * ] - * - * memory:chrome:browser_process:source:X:B:proportional_resident_size : - * Numeric aggregated over [ - * sum of X:B in all 'browser' process dumps in global dump 1, - * ... - * sum of X:B in all 'browser' process dumps in global dump N - * ] - * - * memory:chrome:browser_process:source:X:proportional_resident_size : - * Numeric aggregated over [ - * sum of X:A+X:B in all 'browser' process dumps in global dump 1, - * ... - * sum of X:A+X:B in all 'browser' process dumps in global dump N - * ] - * - * memory:chrome:browser_process:source:Y:proportional_resident_size : - * Numeric aggregated over [ - * sum of Y in all 'browser' process dumps in global dump 1, - * ... - * sum of Y in all 'browser' process dumps in global dump N - * ] - * - * memory:chrome:browser_process:source:proportional_resident_size : - * Numeric aggregated over [ - * sum of X:A+X:B+Y in all 'browser' process dumps in global dump 1, - * ... - * sum of X:A+X:B+Y in all 'browser' process dumps in global dump N - * ] - * - * ... - * - * memory:chrome:all_processes:source:X:A:proportional_resident_size : - * Numeric aggregated over [ - * sum of X:A in all process dumps in global dump 1, - * ... - * sum of X:A in all process dumps in global dump N, - * ] - * - * memory:chrome:all_processes:source:X:B:proportional_resident_size : - * Numeric aggregated over [ - * sum of X:B in all process dumps in global dump 1, - * ... - * sum of X:B in all process dumps in global dump N, - * ] - * - * memory:chrome:all_processes:source:X:proportional_resident_size : - * Numeric aggregated over [ - * sum of X:A+X:B in all process dumps in global dump 1, - * ... - * sum of X:A+X:B in all process dumps in global dump N, - * ] - * - * memory:chrome:all_processes:source:Y:proportional_resident_size : - * Numeric aggregated over [ - * sum of Y in all process dumps in global dump 1, - * ... - * sum of Y in all process dumps in global dump N - * ] - * - * memory:chrome:all_processes:source:proportional_resident_size : - * Numeric aggregated over [ - * sum of X:A+X:B+Y in all process dumps in global dump 1, - * ... - * sum of X:A+X:B+Y in all process dumps in global dump N - * ] - * - * where global dumps 1 to N are the global dumps associated with the given - * browser. - * - * @param {!Map<string, !Array<!tr.model.GlobalMemoryDump>} - * browserNameToGlobalDumps Map from browser names to arrays of global - * memory dumps. The generic values will be extracted from the associated - * process memory dumps. - * @param {!function(!tr.model.GlobalMemoryDump): boolean} - * customGlobalDumpFilter Predicate for filtering global memory dumps. - * @param {!function( - * !tr.model.ProcessMemoryDump, - * !function(!{ - * source: string, - * componentPath: (!Array<string>|undefined), - * propertyName: (string|undefined), - * value: (!tr.v.ScalarNumeric|number|undefined), - * unit: (!tr.v.Unit|undefined), - * descriptionPrefixBuilder: (!function(!Array<string>): string) - * }))} - * customProcessDumpValueExtractor Callback for extracting values from a - * process memory dump. - * @param {!function(!tr.b.MultiDimensionalViewNode)} - * customComponentTreeModifier Callback applied to every component tree - * wrt each process name. - * @param {!tr.v.ValueSet} values List of values to which the - * resulting aggregated values are added. - */ - function addMemoryDumpValues(browserNameToGlobalDumps, customGlobalDumpFilter, - customProcessDumpValueExtractor, customComponentTreeModifier, - values) { - browserNameToGlobalDumps.forEach(function(globalDumps, browserName) { - var filteredGlobalDumps = globalDumps.filter(customGlobalDumpFilter); - var sourceToPropertyToData = extractDataFromGlobalDumps( - filteredGlobalDumps, customProcessDumpValueExtractor); - reportDataAsValues(sourceToPropertyToData, browserName, - customComponentTreeModifier, values); - }); - } - - /** - * For each global memory dump in |globalDumps|, calculate per-process-name - * sums of values extracted by |customProcessDumpValueExtractor| from the - * associated process memory dumps. - * - * This function returns the following nested map structure: - * - * Source name (Map key, e.g. 'reported_by_os') - * -> Property name (Map key, e.g. 'proportional_resident_size') - * -> {unit, descriptionPrefixBuilder, processAndComponentTreeBuilder} - * - * where |processAndComponentTreeBuilder| is a - * tr.b.MultiDimensionalViewBuilder: - * - * Browser name (0th dimension key, e.g. 'webview') x - * -> Component path (1st dimension keys, e.g. ['system', 'native_heap']) - * -> Sum of value over the processes (number). - * - * See addMemoryDumpValues for more details. - */ - function extractDataFromGlobalDumps( - globalDumps, customProcessDumpValueExtractor) { - var sourceToPropertyToData = new Map(); - var dumpCount = globalDumps.length; - globalDumps.forEach(function(globalDump, dumpIndex) { - tr.b.iterItems(globalDump.processMemoryDumps, function(_, processDump) { - extractDataFromProcessDump( - processDump, sourceToPropertyToData, dumpIndex, dumpCount, - customProcessDumpValueExtractor); - }); - }); - return sourceToPropertyToData; - } - - function extractDataFromProcessDump(processDump, sourceToPropertyToData, - dumpIndex, dumpCount, customProcessDumpValueExtractor) { - // Process name is typically 'browser', 'renderer', etc. - var rawProcessName = processDump.process.name; - var processNamePath = [canonicalizeProcessName(rawProcessName)]; - - customProcessDumpValueExtractor( - processDump, - function addProcessScalar(spec) { - if (spec.value === undefined) - return; - - var component = spec.component || []; - function createDetailsForErrorMessage() { - var propertyUserFriendlyName = - spec.property === undefined ? '(undefined)' : spec.property; - var componentUserFriendlyName = - component.length === 0 ? '(empty)' : component.join(':'); - return ['source=', spec.source, ', property=', - propertyUserFriendlyName, ', component=', - componentUserFriendlyName, ' in ', - processDump.process.userFriendlyName].join(''); - } - - var value, unit; - if (spec.value instanceof ScalarNumeric) { - value = spec.value.value; - unit = spec.value.unit; - if (spec.unit !== undefined) { - throw new Error('ScalarNumeric value for ' + - createDetailsForErrorMessage() + ' already specifies a unit'); - } - } else { - value = spec.value; - unit = spec.unit; - } - - var propertyToData = sourceToPropertyToData.get(spec.source); - if (propertyToData === undefined) { - propertyToData = new Map(); - sourceToPropertyToData.set(spec.source, propertyToData); - } - - var data = propertyToData.get(spec.property); - if (data === undefined) { - data = { - processAndComponentTreeBuilder: - new tr.b.MultiDimensionalViewBuilder( - 2 /* dimensions (process name and component path) */, - dumpCount /* valueCount */), - unit: unit, - descriptionPrefixBuilder: spec.descriptionPrefixBuilder - }; - propertyToData.set(spec.property, data); - } else if (data.unit !== unit) { - throw new Error('Multiple units provided for ' + - createDetailsForErrorMessage() + ':' + - data.unit.unitName + ' and ' + unit.unitName); - } else if (data.descriptionPrefixBuilder !== - spec.descriptionPrefixBuilder) { - throw new Error( - 'Multiple description prefix builders provided for' + - createDetailsForErrorMessage()); - } - - var values = new Array(dumpCount); - values[dumpIndex] = value; - - data.processAndComponentTreeBuilder.addPath( - [processNamePath, component] /* path */, values, - tr.b.MultiDimensionalViewBuilder.ValueKind.TOTAL /* valueKind */); - }); - } - - function reportDataAsValues(sourceToPropertyToData, browserName, - customComponentTreeModifier, values) { - // For each source name (e.g. 'reported_by_os')... - sourceToPropertyToData.forEach(function(propertyToData, sourceName) { - // For each property name (e.g. 'effective_size')... - propertyToData.forEach(function(data, propertyName) { - var tree = data.processAndComponentTreeBuilder.buildTopDownTreeView(); - var unit = data.unit; - var descriptionPrefixBuilder = data.descriptionPrefixBuilder; - - // Total over 'all' processes... - customComponentTreeModifier(tree); - reportComponentDataAsValues(browserName, sourceName, - propertyName, 'all_processes', [] /* componentPath */, tree, - unit, descriptionPrefixBuilder, values); - - // For each process name (e.g. 'renderer')... - tree.children[0].forEach(function(processTree, processName) { - if (processTree.children[0].size > 0) { - throw new Error('Multi-dimensional view node for source=' + - sourceName + ', property=' + - (propertyName === undefined ? '(undefined)' : propertyName) + - ', process=' + processName + - ' has children wrt the process name dimension'); - } - customComponentTreeModifier(processTree); - reportComponentDataAsValues(browserName, sourceName, - propertyName, processName, [] /* componentPath */, processTree, - unit, descriptionPrefixBuilder, values); - }); - }); - }); - } - - /** - * For the given |browserName| (e.g. 'chrome'), |processName| - * (e.g. 'gpu_process'), |propertyName| (e.g. 'effective_size'), - * |componentPath| (e.g. ['v8']), add a tr.v.Numeric with |unit| aggregating - * the total values of the associated |componentNode| across all timestamps - * (corresponding to global memory dumps associated with the given browser) - * to |values|. - * - * See addMemoryDumpValues for more details. - */ - function reportComponentDataAsValues( - browserName, sourceName, propertyName, processName, componentPath, - componentNode, unit, descriptionPrefixBuilder, values) { - // Construct the name of the memory value. - var nameParts = ['memory', browserName, processName, sourceName].concat( - componentPath); - if (propertyName !== undefined) - nameParts.push(propertyName); - var name = nameParts.join(':'); - - // Build the underlying numeric for the memory value. - var numeric = buildMemoryNumericFromNode(componentNode, unit); - - // Build the options for the memory value. - var description = [ - descriptionPrefixBuilder(componentPath, processName), - 'in', - convertBrowserNameToUserFriendlyName(browserName) - ].join(' '); - var options = { description: description }; - - // Report the memory value. - values.addValue(new tr.v.NumericValue(name, numeric, options)); - - // Recursively report memory values for sub-components. - var depth = componentPath.length; - componentPath.push(undefined); - componentNode.children[1].forEach(function(childNode, childName) { - componentPath[depth] = childName; - reportComponentDataAsValues( - browserName, sourceName, propertyName, processName, componentPath, - childNode, unit, descriptionPrefixBuilder, values); - }); - componentPath.pop(); - } - - /** - * Create a memory tr.v.Numeric (histogram) with |unit| and add all total - * values in |node| to it. - */ - function buildMemoryNumericFromNode(node, unit) { - var numeric = MEMORY_NUMERIC_BUILDER_MAP.get(unit).build(); - node.values.forEach(v => numeric.add(v.total)); - return numeric; - } - - tr.metrics.MetricRegistry.register(memoryMetric); - - return { - memoryMetric: memoryMetric - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/memory_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/memory_metric_test.html deleted file mode 100644 index 500333d61f9..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/memory_metric_test.html +++ /dev/null @@ -1,2473 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright 2016 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<link rel="import" href="/tracing/core/test_utils.html"> -<link rel="import" href="/tracing/metrics/system_health/memory_metric.html"> -<link rel="import" href="/tracing/model/container_memory_dump.html"> -<link rel="import" href="/tracing/model/memory_dump_test_utils.html"> -<link rel="import" href="/tracing/model/vm_region.html"> -<link rel="import" href="/tracing/value/value.html"> -<link rel="import" href="/tracing/value/value_set.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - var VMRegion = tr.model.VMRegion; - var VMRegionClassificationNode = tr.model.VMRegionClassificationNode; - var LIGHT = tr.model.ContainerMemoryDump.LevelOfDetail.LIGHT; - var DETAILED = tr.model.ContainerMemoryDump.LevelOfDetail.DETAILED; - var SIZE_DELTA = tr.model.MemoryDumpTestUtils.SIZE_DELTA; - var addProcessMemoryDump = tr.model.MemoryDumpTestUtils.addProcessMemoryDump; - var addGlobalMemoryDump = tr.model.MemoryDumpTestUtils.addGlobalMemoryDump; - var newAllocatorDump = tr.model.MemoryDumpTestUtils.newAllocatorDump; - var addChildDump = tr.model.MemoryDumpTestUtils.addChildDump; - var addOwnershipLink = tr.model.MemoryDumpTestUtils.addOwnershipLink; - var unitlessNumber_smallerIsBetter = - tr.v.Unit.byName.unitlessNumber_smallerIsBetter; - var sizeInBytes_smallerIsBetter = - tr.v.Unit.byName.sizeInBytes_smallerIsBetter; - - function memoryMetricTest(name, modelCallback, expectedNumerics) { - test(name, function() { - // Create a model and a fake value list. - var model = tr.c.TestUtils.newModel(modelCallback); - var valueNameToValues = {}; - var fakeValueList = { - addValue: function(value) { - var values = valueNameToValues[value.name]; - if (values === undefined) - valueNameToValues[value.name] = values = []; - values.push(value); - } - }; - - // Run the memory metric on the model. - tr.metrics.sh.memoryMetric(fakeValueList, model); - - // Check that the names of the added values match expectations. - var actualValueNames = Object.keys(valueNameToValues).sort(); - var expectedValueNames = Object.keys(expectedNumerics).sort(); - assert.deepEqual(actualValueNames, expectedValueNames, { - // Build the long error message lazily. - toString: function() { - var errorMessageParts = []; - function addValueNamesToError(type, valueNames, otherValueNames) { - var otherValueNamesSet = new Set(otherValueNames); - errorMessageParts.push(type, ' value names:'); - if (valueNames.length === 0) { - errorMessageParts.push('\n(empty)'); - } else { - valueNames.forEach(function(valueName) { - errorMessageParts.push('\n'); - if (!otherValueNamesSet.has(valueName)) - errorMessageParts.push('+++'); - errorMessageParts.push(valueName); - }); - } - } - addValueNamesToError('Expected', expectedValueNames, - actualValueNames); - errorMessageParts.push('\n'); - addValueNamesToError('Actual', actualValueNames, expectedValueNames); - return errorMessageParts.join(''); - } - }); - - // Check that the numeric values of the added values match expectations. - tr.b.iterItems(valueNameToValues, function(valueName, actualValues) { - assert.lengthOf(actualValues, 1, - 'Multiple \'' + valueName + '\' values'); - var actualValue = actualValues[0]; - assert.instanceOf(actualValue, tr.v.NumericValue); - - var actualNumeric = actualValue.numeric; - var expectedNumeric = expectedNumerics[valueName]; - assert.strictEqual(actualNumeric.unit, expectedNumeric.unit, - 'Invalid \'' + valueName + '\' unit (expected: ' + - expectedNumeric.unit.unitName, + ', actual: ' + - actualNumeric.unit.unitName + ')'); - - if (typeof expectedNumeric.value === 'number') { - // Scalar. - assert.instanceOf(actualNumeric, tr.v.ScalarNumeric, - 'Invalid \'' + valueName + '\' class'); - assert.closeTo(actualNumeric.value, expectedNumeric.value, - SIZE_DELTA, 'Invalid \'' + valueName + '\' numeric value'); - } else if (expectedNumeric.value instanceof Array) { - // Histogram. - assert.instanceOf(actualNumeric, tr.v.Numeric, - 'Invalid \'' + valueName + '\' class'); - assert.strictEqual(actualNumeric.numValues, - expectedNumeric.value.length, - 'Invalid \'' + valueName + '\' Numeric numValues'); - assert.closeTo(actualNumeric.sum, - expectedNumeric.value.reduce((a, b) => a + b, 0), SIZE_DELTA, - 'Invalid \'' + valueName + '\' Numeric sum'); - - // Check that the bin counts match. - var binToCount = new Map(); - expectedNumeric.value.forEach(function(value) { - var bin = actualNumeric.getBinForValue(value); - binToCount.set(bin, (binToCount.get(bin) || 0) + 1); - }); - actualNumeric.allBins.forEach(function(bin) { - binToCount.set(bin, (binToCount.get(bin) || 0) - bin.count); - }); - binToCount.forEach(function(count, bin) { - assert.strictEqual(count, 0, 'Invalid \'' + valueName + - '\' bin count for range ' + bin.min + '-' + bin.max); - }); - } else { - assert.fail( - 'Test sanity check: expected value must be a number or an array'); - } - - // Check that the description matches expectations. - //if (expectedNumeric.description !== '') - assert.strictEqual( - actualValue.description, expectedNumeric.description, - 'Invalid \'' + valueName + '\' description'); - }); - }); - } - - function createProcessWithName(model, name) { - var uniquePid = - Math.max.apply(null, Object.keys(model.processes).concat([0])) + 1; - var process = model.getOrCreateProcess(uniquePid); - process.name = name; - return process; - } - - function createChromeBrowserProcess(model) { - var process = createProcessWithName(model, 'Browser'); - process.getOrCreateThread(1).name = 'CrBrowserMain'; - return process; - } - - function createWebViewProcess(model) { - var process = createChromeBrowserProcess(model); - process.getOrCreateThread(2).name = 'Chrome_InProcRendererThread'; - return process; - } - - memoryMetricTest('noDumps_noBrowser', function(model) { - createProcessWithName(model, 'Non-browser'); - }, { - /* no values */ - }); - - memoryMetricTest('noDumps_chrome', function(model) { - createChromeBrowserProcess(model); - }, { - 'memory:chrome:all_processes:dump_count:detailed': { - value: 0, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of detailed memory dumps added by Chrome to ' + - 'the trace' - }, - 'memory:chrome:all_processes:dump_count:light': { - value: 0, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of light memory dumps added by Chrome to ' + - 'the trace' - }, - 'memory:chrome:all_processes:dump_count': { - value: 0, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all memory dumps added by Chrome to the ' + - 'trace' - } - }); - - memoryMetricTest('noDumps_multipleBrowsers', function(model) { - createChromeBrowserProcess(model); - createWebViewProcess(model); - createProcessWithName(model, 'Non-browser'); - createChromeBrowserProcess(model); - }, { - 'memory:chrome2:all_processes:dump_count:detailed': { - value: 0, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of detailed memory dumps added by Chrome(2) ' + - 'to the trace' - }, - 'memory:chrome2:all_processes:dump_count:light': { - value: 0, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of light memory dumps added by Chrome(2) to ' + - 'the trace' - }, - 'memory:chrome2:all_processes:dump_count': { - value: 0, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all memory dumps added by Chrome(2) to ' + - 'the trace' - }, - 'memory:chrome:all_processes:dump_count:detailed': { - value: 0, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of detailed memory dumps added by Chrome to ' + - 'the trace' - }, - 'memory:chrome:all_processes:dump_count:light': { - value: 0, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of light memory dumps added by Chrome to ' + - 'the trace' - }, - 'memory:chrome:all_processes:dump_count': { - value: 0, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all memory dumps added by Chrome to the ' + - 'trace' - }, - 'memory:webview:all_processes:dump_count:detailed': { - value: 0, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of detailed memory dumps added by WebView ' + - 'to the trace' - }, - 'memory:webview:all_processes:dump_count:light': { - value: 0, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of light memory dumps added by WebView to ' + - 'the trace' - }, - 'memory:webview:all_processes:dump_count': { - value: 0, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all memory dumps added by WebView to the ' + - 'trace' - } - }); - - memoryMetricTest('dumpCountsOnly_unknownBrowser', function(model) { - addGlobalMemoryDump(model, 45, DETAILED); - addGlobalMemoryDump(model, 68, LIGHT); - addGlobalMemoryDump(model, 89, DETAILED); - }, { - 'memory:unknown_browser:all_processes:dump_count:detailed': { - value: 2, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of detailed memory dumps added by an ' + - 'unknown browser to the trace' - }, - 'memory:unknown_browser:all_processes:dump_count:light': { - value: 1, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of light memory dumps added by an unknown ' + - 'browser to the trace' - }, - 'memory:unknown_browser:all_processes:dump_count': { - value: 3, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all memory dumps added by an unknown ' + - 'browser to the trace' - } - }); - - memoryMetricTest('dumpCountsOnly_webview', function(model) { - var p = createWebViewProcess(model); - addProcessMemoryDump(addGlobalMemoryDump(model, 45, LIGHT), p, 45); - addProcessMemoryDump(addGlobalMemoryDump(model, 68, LIGHT), p, 68); - }, { - 'memory:webview:all_processes:dump_count:detailed': { - value: 0, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of detailed memory dumps added by WebView ' + - 'to the trace' - }, - 'memory:webview:all_processes:dump_count:light': { - value: 2, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of light memory dumps added by WebView to ' + - 'the trace' - }, - 'memory:webview:all_processes:dump_count': { - value: 2, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all memory dumps added by WebView to the ' + - 'trace' - }, - 'memory:webview:all_processes:process_count': { - value: [1, 1], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all processes in WebView' - }, - 'memory:webview:browser_process:process_count': { - value: [1, 1], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of browser processes in WebView' - } - }); - - memoryMetricTest('generalValues_chrome', function(model) { - var pBrowser = createChromeBrowserProcess(model); - var pRendererA = createProcessWithName(model, 'Renderer'); - var pRendererB = createProcessWithName(model, 'Renderer'); - var pPpapi = createProcessWithName(model, 'PPAPI Process'); - var pUnknown = createProcessWithName(model, undefined); - - // Timestamp 1. - var gmd1 = addGlobalMemoryDump(model, 20); - var pmdBrowser1 = addProcessMemoryDump(gmd1, pBrowser, 19); - pmdBrowser1.memoryAllocatorDumps = [ - newAllocatorDump(pmdBrowser1, 'malloc', { - 'size': 8, - 'allocated_objects_size': 4 - }) - ]; - var pmdRendererA1 = addProcessMemoryDump(gmd1, pRendererA, 20); - pmdRendererA1.memoryAllocatorDumps = (function() { - var mallocDump = - newAllocatorDump(pmdRendererA1, 'malloc', { 'size': 16 }); - var partitionAllocDump = - newAllocatorDump(pmdRendererA1, 'partition_alloc'); - addOwnershipLink( - addChildDump(partitionAllocDump, 'allocated_objects', { 'size': 32 }), - addChildDump(partitionAllocDump, 'partitions', { 'size': 24 })); - return [mallocDump, partitionAllocDump]; - })(); - var pmdGpu1 = addProcessMemoryDump(gmd1, pPpapi, 21); - pmdGpu1.memoryAllocatorDumps = [ - newAllocatorDump(pmdGpu1, 'gpu', { - 'size': 30, - 'allocated_objects_size': 25 - }) - ]; - - // Timestamp 2. - var gmd2 = addGlobalMemoryDump(model, 40); - var pmdBrowser2 = addProcessMemoryDump(gmd2, pBrowser, 41); - pmdBrowser2.memoryAllocatorDumps = (function() { - var mallocDump = newAllocatorDump(pmdBrowser2, 'malloc', { 'size': 120 }); - var tracingDump = - newAllocatorDump(pmdBrowser2, 'tracing', { 'size': 40 }); - return [mallocDump, tracingDump]; - })(); - var pmdRendererA2 = addProcessMemoryDump(gmd2, pRendererA, 39); - pmdRendererA2.memoryAllocatorDumps = (function() { - var partitionAllocDump = - newAllocatorDump(pmdRendererA2, 'partition_alloc'); - addOwnershipLink( - addChildDump(partitionAllocDump, 'allocated_objects', - { 'size': 320 }), - addChildDump(partitionAllocDump, 'partitions', { 'size': 240 })); - var v8Dump = newAllocatorDump(pmdRendererA2, 'v8', { 'size': 650 }); - return [partitionAllocDump, v8Dump]; - })(); - var pmdRendererB2 = addProcessMemoryDump(gmd2, pRendererB, 40); - pmdRendererB2.memoryAllocatorDumps = [ - newAllocatorDump(pmdRendererB2, 'v8', { - 'size': 970, - 'allocated_objects_size': 860 - }), - newAllocatorDump(pmdRendererB2, 'malloc', { - 'allocated_objects_size': 750 - }) - ]; - var pmdUnknown = addProcessMemoryDump(gmd2, pUnknown, 42); - pmdUnknown.memoryAllocatorDumps = [ - newAllocatorDump(pmdRendererB2, 'v8', { - 'size': 111 - }) - ]; - - // Timestamp 3. - var gmd3 = addGlobalMemoryDump(model, 60); - var pmdBrowser3 = addProcessMemoryDump(gmd3, pBrowser, 60); - pmdBrowser3.memoryAllocatorDumps = [ - newAllocatorDump(pmdBrowser3, 'malloc', { - 'size': 8000, - 'allocated_objects_size': 4000 - }) - ]; - var pmdRendererB3 = addProcessMemoryDump(gmd3, pRendererB, 61); - // Intentionally pmdRendererB3.memoryAllocatorDumps undefined. - var pmdGpu3 = addProcessMemoryDump(gmd3, pPpapi, 59); - pmdGpu3.memoryAllocatorDumps = [ - newAllocatorDump(pmdGpu3, 'gpu', { 'size': 300 }) - ]; - - // Timestamp 4. - var gmd4 = addGlobalMemoryDump(model, 80); - var pmdBrowser4 = addProcessMemoryDump(gmd4, pBrowser, 81); - pmdBrowser4.memoryAllocatorDumps = [ - newAllocatorDump(pmdBrowser4, 'malloc', { 'size': 80000 }) - ]; - var pmdRendererB4 = addProcessMemoryDump(gmd4, pRendererB, 79); - pmdRendererB4.memoryAllocatorDumps = (function() { - var v8Dump = newAllocatorDump(pmdRendererB4, 'v8', { 'size': 9e5 }); - var partitionAllocDump = newAllocatorDump(pmdRendererB4, - 'partition_alloc', { 'size': 5e5 }); - addOwnershipLink(partitionAllocDump, v8Dump); - return [v8Dump, partitionAllocDump]; - })(); - var pmdGpu4 = addProcessMemoryDump(gmd4, pPpapi, 80); - pmdGpu4.memoryAllocatorDumps = [ - newAllocatorDump(pmdGpu4, 'gpu', { 'memtrack_pss': 666 /* ignored */ }) - ]; - }, { - 'memory:chrome:all_processes:dump_count:detailed': { - value: 0, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of detailed memory dumps added by Chrome to ' + - 'the trace' - }, - 'memory:chrome:all_processes:dump_count:light': { - value: 4, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of light memory dumps added by Chrome to ' + - 'the trace' - }, - 'memory:chrome:all_processes:dump_count': { - value: 4, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all memory dumps added by Chrome to the ' + - 'trace' - }, - 'memory:chrome:all_processes:process_count': { - value: [3, 4, 3, 3], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_chrome:effective_size': { - value: [30 + (8 + 16) + 32, (120 - 40) + 320 + (650 + 970) + 111, - 300 + 8000, 80000 + 5e5 + 4e5], - unit: sizeInBytes_smallerIsBetter, - description: 'total effective size reported by Chrome for all ' + - 'processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_chrome:allocated_objects_size': { - value: [25 + 4, 750 + 860, 4000, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total size of all allocated objects reported by Chrome ' + - 'for all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_chrome:gpu:effective_size': { - value: [30, 0, 300, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of gpu in all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_chrome:gpu:allocated_objects_size': - { - value: [25, 0, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'size of all objects allocated by gpu in all ' + - 'processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_chrome:malloc:effective_size': { - value: [8 + 16, 120 - 40, 8000, 80000], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of malloc in all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_chrome:malloc:allocated_objects_size': - { - value: [4, 750, 4000, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'size of all objects allocated by malloc in all ' + - 'processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_chrome:partition_alloc:effective_size': - { - value: [32, 320, 0, 5e5], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of partition_alloc in all processes ' + - 'in Chrome' - }, - 'memory:chrome:all_processes:reported_by_chrome:tracing:effective_size': { - value: [0, 40, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of tracing in all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_chrome:v8:effective_size': { - value: [0, 650 + 970 + 111, 0, 4e5], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of v8 in all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_chrome:v8:allocated_objects_size': - { - value: [0, 860, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'size of all objects allocated by v8 in all processes ' + - 'in Chrome' - }, - 'memory:chrome:browser_process:process_count': { - value: [1, 1, 1, 1], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of browser processes in Chrome' - }, - 'memory:chrome:browser_process:reported_by_chrome:effective_size': { - value: [8, (120 - 40), 8000, 80000], - unit: sizeInBytes_smallerIsBetter, - description: 'total effective size reported by Chrome for the browser ' + - 'process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_chrome:allocated_objects_size': { - value: [4, 0, 4000, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total size of all allocated objects reported by Chrome ' + - 'for the browser process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_chrome:malloc:effective_size': { - value: [8, 120 - 40, 8000, 80000], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of malloc in the browser process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_chrome:malloc:allocated_objects_size': - { - value: [4, 0, 4000, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'size of all objects allocated by malloc in the ' + - 'browser process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_chrome:tracing:effective_size': { - value: [0, 40, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of tracing in the browser process in Chrome' - }, - 'memory:chrome:ppapi_process:process_count': { - value: [1, 0, 1, 1], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of PPAPI processes in Chrome' - }, - 'memory:chrome:ppapi_process:reported_by_chrome:effective_size': { - value: [30, 0, 300, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total effective size reported by Chrome for the PPAPI ' + - 'process in Chrome' - }, - 'memory:chrome:ppapi_process:reported_by_chrome:allocated_objects_size': { - value: [25, 0, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total size of all allocated objects reported by Chrome ' + - 'for the PPAPI process in Chrome' - }, - 'memory:chrome:ppapi_process:reported_by_chrome:gpu:effective_size': { - value: [30, 0, 300, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of gpu in the PPAPI process in Chrome' - }, - 'memory:chrome:ppapi_process:reported_by_chrome:gpu:allocated_objects_size': - { - value: [25, 0, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'size of all objects allocated by gpu in the PPAPI ' + - 'process in Chrome' - }, - 'memory:chrome:renderer_processes:process_count': { - value: [1, 2, 1, 1], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of renderer processes in Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_chrome:effective_size': { - value: [16 + 32, 320 + 650 + 970, 0, 5e5 + 4e5], - unit: sizeInBytes_smallerIsBetter, - description: 'total effective size reported by Chrome for renderer ' + - 'processes in Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_chrome:allocated_objects_size': - { - value: [0, 750 + 860, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total size of all allocated objects reported by ' + - 'Chrome for renderer processes in Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_chrome:malloc:effective_size': - { - value: [16, 0, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of malloc in renderer processes in ' + - 'Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_chrome:malloc:allocated_objects_size': - { - value: [0, 750, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'size of all objects allocated by malloc in renderer ' + - 'processes in Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_chrome:partition_alloc:effective_size': - { - value: [32, 320, 0, 5e5], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of partition_alloc in renderer ' + - 'processes in Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_chrome:v8:effective_size': { - value: [0, 650 + 970, 0, 4e5], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of v8 in renderer processes in Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_chrome:v8:allocated_objects_size': - { - value: [0, 860, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'size of all objects allocated by v8 in renderer ' + - 'processes in Chrome' - }, - 'memory:chrome:unknown_processes:process_count': { - value: [0, 1, 0, 0], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of unknown processes in Chrome' - }, - 'memory:chrome:unknown_processes:reported_by_chrome:effective_size': { - value: [0, 111, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total effective size reported by Chrome for unknown ' + - 'processes in Chrome' - }, - 'memory:chrome:unknown_processes:reported_by_chrome:v8:effective_size': { - value: [0, 111, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of v8 in unknown processes in Chrome' - }, - }); - - memoryMetricTest('detailedValues_unknownBrowser', function(model) { - var pBrowser = createProcessWithName(model, 'Browser'); - var pRendererA = createProcessWithName(model, 'Renderer'); - var pRendererB = createProcessWithName(model, 'Renderer'); - var pRendererC = createProcessWithName(model, 'Renderer'); - var pGpu = createProcessWithName(model, 'GPU Process'); - - // Timestamp 1. - var gmd1 = addGlobalMemoryDump(model, 10, DETAILED); - var pmdBrowser1 = addProcessMemoryDump(gmd1, pBrowser, 9); - pmdBrowser1.vmRegions = VMRegionClassificationNode.fromRegions([ - new VMRegion(0xABCD, 128, 0, '/dev/ashmem/dalvik-non moving space', - { 'privateDirtyResident': 8 }) - ]); - var pmdRendererA1 = addProcessMemoryDump(gmd1, pRendererA, 10); - pmdRendererA1.vmRegions = VMRegionClassificationNode.fromRegions([ - new VMRegion(0xEF01, 256, 0, '[anon:libc_malloc]', - { 'privateDirtyResident': 17 }) - ]); - var pmdRendererB1 = addProcessMemoryDump(gmd1, pRendererB, 11); - pmdRendererB1.vmRegions = VMRegionClassificationNode.fromRegions([ - new VMRegion(0x2345, 512, 0, '[heap]', - { 'proportionalResident': 67, 'privateDirtyResident': 34 }) - ]); - pmdRendererB1.memoryAllocatorDumps = [ - newAllocatorDump(pmdRendererA4, 'v8', { 'code_and_metadata_size': 16 }) - ]; - var pmdGpu1 = addProcessMemoryDump(gmd1, pGpu, 10); - pmdGpu1.memoryAllocatorDumps = (function() { - var gpuDump = newAllocatorDump(pmdGpu1, 'gpu'); - var memtrackDump = addChildDump(gpuDump, 'android_memtrack'); - addChildDump(memtrackDump, 'gl', { 'memtrack_pss': 100 }); - addChildDump(memtrackDump, 'graphics', { 'memtrack_pss': 200 }); - return [gpuDump]; - })(); - - // Timestamp 2 (light global memory dump, so it should be skipped for - // mmaps_* values). - var gmd2 = addGlobalMemoryDump(model, 20, LIGHT); - var pmdBrowser2 = addProcessMemoryDump(gmd2, pBrowser, 18); - pmdBrowser2.vmRegions = VMRegionClassificationNode.fromRegions([ - new VMRegion(0x999, 999, 999, '/dev/ashmem/dalvik-main space', - { 'proportionalResident': 999 }) - ]); - var pmdRendererA2 = addProcessMemoryDump(gmd2, pRendererA, 19); - pmdRendererA2.memoryAllocatorDumps = [ - newAllocatorDump(pmdRendererA4, 'v8', { - 'bytecode_and_metadata_size': 678 - }) - ]; - var pmdRendererB2 = addProcessMemoryDump(gmd2, pRendererB, 21); - var pmdRendererC2 = addProcessMemoryDump(gmd2, pRendererC, 22); - var pmdGpu2 = addProcessMemoryDump(gmd2, pGpu, 20); - pmdGpu2.memoryAllocatorDumps = (function() { - var gpuDump = newAllocatorDump(pmdGpu2, 'gpu'); - var memtrackDump = addChildDump(gpuDump, 'android_memtrack'); - addChildDump(memtrackDump, 'gl', { 'memtrack_pss': 12345 }); - return [gpuDump]; - })(); - - // Timestamp 3. - var gmd3 = addGlobalMemoryDump(model, 30, DETAILED); - var pmdBrowser3 = addProcessMemoryDump(gmd3, pBrowser, 30); - pmdBrowser3.vmRegions = VMRegionClassificationNode.fromRegions([ - new VMRegion(0xABCD, 1024, 0, '/dev/ashmem/dalvik-non moving space', - { 'proportionalResident': 3, 'privateDirtyResident': 80 }) - ]); - var pmdRendererA3 = addProcessMemoryDump(gmd3, pRendererA, 29); - // Intentionally pmdRendererA3.vmRegions undefined. - var pmdRendererC3 = addProcessMemoryDump(gmd3, pRendererC, 31); - pmdRendererC3.vmRegions = VMRegionClassificationNode.fromRegions([ - new VMRegion(0x2345, 2048, 0, '/no/matching/category', - { 'proportionalResident': 200 }), - new VMRegion(0x2345, 2048, 0, '/dev/ashmem', - { 'proportionalResident': 500 }), - ]); - var pmdGpu3 = addProcessMemoryDump(gmd3, pGpu, 30); - pmdGpu3.memoryAllocatorDumps = (function() { - var gpuDump = newAllocatorDump(pmdGpu3, 'gpu', - { 'memtrack_pss': 6000 /* ignored */ }); - var memtrackDump = addChildDump(gpuDump, 'android_memtrack', - { 'memtrack_pss': 5000 /* ignored */ }); - addChildDump(memtrackDump, 'gl', { 'memtrack_pss': 3000 }); - addChildDump(memtrackDump, 'graphics', { 'ignored': 2000 }); - addChildDump(memtrackDump, 'gfx', { 'memtrack_pss': 1000 }); - return [gpuDump]; - })(); - pmdGpu3.vmRegions = VMRegionClassificationNode.fromRegions([ - new VMRegion(0xCDCD, 4096, 0, '/dev/ashmem/dalvik-zygote space', - { 'proportionalResident': 150, 'privateDirtyResident': 90 }) - ]); - - // Timestamp 4. - var gmd4 = addGlobalMemoryDump(model, 40, DETAILED); - var pmdBrowser4 = addProcessMemoryDump(gmd4, pBrowser, 40); - var pmdRendererA4 = addProcessMemoryDump(gmd4, pRendererA, 40); - pmdRendererA4.memoryAllocatorDumps = [ - newAllocatorDump(pmdRendererA4, 'v8', { - 'code_and_metadata_size': 21, - 'bytecode_and_metadata_size': 35 - }) - ]; - }, { - 'memory:unknown_browser:all_processes:dump_count:detailed': { - value: 3, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of detailed memory dumps added by an ' + - 'unknown browser to the trace' - }, - 'memory:unknown_browser:all_processes:dump_count:light': { - value: 1, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of light memory dumps added by an unknown ' + - 'browser to the trace' - }, - 'memory:unknown_browser:all_processes:dump_count': { - value: 4, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all memory dumps added by an unknown ' + - 'browser to the trace' - }, - 'memory:unknown_browser:all_processes:process_count': { - value: [4, 5, 4, 2], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all processes in an unknown browser' - }, - 'memory:unknown_browser:all_processes:reported_by_chrome:code_and_metadata_size': - { - value: [16, 0, 21 + 35], - unit: sizeInBytes_smallerIsBetter, - description: 'total size of code and metadata reported by Chrome ' + - 'for all processes in an unknown browser' - }, - 'memory:unknown_browser:all_processes:reported_by_chrome:v8:code_and_metadata_size': - { - value: [16, 0, 21 + 35], - unit: sizeInBytes_smallerIsBetter, - description: 'size of v8 code and metadata in all processes in an ' + - 'unknown browser' - }, - 'memory:unknown_browser:all_processes:reported_by_os:gpu_memory:proportional_resident_size': - { - value: [100 + 200, 3000 + 1000, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) of GPU memory ' + - '(Android memtrack) used by all processes in an unknown browser' - }, - 'memory:unknown_browser:all_processes:reported_by_os:gpu_memory:gfx:proportional_resident_size': - { - value: [0, 1000, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the gfx Android ' + - 'memtrack component in all processes in an unknown browser' - }, - 'memory:unknown_browser:all_processes:reported_by_os:gpu_memory:gl:proportional_resident_size': - { - value: [100, 3000, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the gl Android ' + - 'memtrack component in all processes in an unknown browser' - }, - 'memory:unknown_browser:all_processes:reported_by_os:gpu_memory:graphics:proportional_resident_size': - { - value: [200, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the graphics ' + - 'Android memtrack component in all processes in an unknown ' + - 'browser' - }, - 'memory:unknown_browser:all_processes:reported_by_os:private_dirty_size': { - value: [17 + 34 + 8, 80 + 90, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size reported by the OS for all ' + - 'processes in an unknown browser' - }, - 'memory:unknown_browser:all_processes:reported_by_os:proportional_resident_size': - { - value: [67 + 100 + 200, 700 + 3 + 1000 + 150 + 3000, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) reported by ' + - 'the OS for all processes in an unknown browser' - }, - 'memory:unknown_browser:all_processes:reported_by_os:system_memory:private_dirty_size': - { - value: [17 + 34 + 8, 80 + 90, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size of system memory (RAM) used ' + - 'by all processes in an unknown browser' - }, - 'memory:unknown_browser:all_processes:reported_by_os:system_memory:proportional_resident_size': - { - value: [67, 700 + 3 + 150, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) of system ' + - 'memory (RAM) used by all processes in an unknown browser' - }, - 'memory:unknown_browser:all_processes:reported_by_os:system_memory:ashmem:private_dirty_size': - { - value: [0, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of ashmem in all processes in an ' + - 'unknown browser' - }, - 'memory:unknown_browser:all_processes:reported_by_os:system_memory:ashmem:proportional_resident_size': - { - value: [0, 500, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of ashmem in all ' + - 'processes in an unknown browser' - }, - 'memory:unknown_browser:all_processes:reported_by_os:system_memory:java_heap:private_dirty_size': - { - value: [8, 80 + 90, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the Java heap in all processes ' + - 'in an unknown browser' - }, - 'memory:unknown_browser:all_processes:reported_by_os:system_memory:java_heap:proportional_resident_size': - { - value: [0, 3 + 150, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the Java heap in ' + - 'all processes in an unknown browser' - }, - 'memory:unknown_browser:all_processes:reported_by_os:system_memory:native_heap:private_dirty_size': - { - value: [17 + 34, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the native heap in all ' + - 'processes in an unknown browser' - }, - 'memory:unknown_browser:all_processes:reported_by_os:system_memory:native_heap:proportional_resident_size': - { - value: [67, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the native heap ' + - 'in all processes in an unknown browser' - }, - 'memory:unknown_browser:browser_process:process_count': { - value: [1, 1, 1, 1], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of browser processes in an unknown browser' - }, - 'memory:unknown_browser:browser_process:reported_by_os:private_dirty_size': - { - value: [8, 80, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size reported by the OS for the ' + - 'browser process in an unknown browser' - }, - 'memory:unknown_browser:browser_process:reported_by_os:proportional_resident_size': - { - value: [0, 3, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) reported by ' + - 'the OS for the browser process in an unknown browser' - }, - 'memory:unknown_browser:browser_process:reported_by_os:system_memory:private_dirty_size': - { - value: [8, 80, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size of system memory (RAM) used ' + - 'by the browser process in an unknown browser' - }, - 'memory:unknown_browser:browser_process:reported_by_os:system_memory:proportional_resident_size': - { - value: [0, 3, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) of system ' + - 'memory (RAM) used by the browser process in an unknown browser' - }, - 'memory:unknown_browser:browser_process:reported_by_os:system_memory:ashmem:private_dirty_size': - { - value: [0, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of ashmem in the browser process ' + - 'in an unknown browser' - }, - 'memory:unknown_browser:browser_process:reported_by_os:system_memory:ashmem:proportional_resident_size': - { - value: [0, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of ashmem in the ' + - 'browser process in an unknown browser' - }, - 'memory:unknown_browser:browser_process:reported_by_os:system_memory:java_heap:private_dirty_size': - { - value: [8, 80, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the Java heap in the browser ' + - 'process in an unknown browser' - }, - 'memory:unknown_browser:browser_process:reported_by_os:system_memory:java_heap:proportional_resident_size': - { - value: [0, 3, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the Java heap in ' + - 'the browser process in an unknown browser' - }, - 'memory:unknown_browser:browser_process:reported_by_os:system_memory:native_heap:private_dirty_size': - { - value: [0, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the native heap in the browser ' + - 'process in an unknown browser' - }, - 'memory:unknown_browser:browser_process:reported_by_os:system_memory:native_heap:proportional_resident_size': - { - value: [0, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the native heap ' + - 'in the browser process in an unknown browser' - }, - 'memory:unknown_browser:gpu_process:process_count': { - value: [1, 1, 1, 0], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of GPU processes in an unknown browser' - }, - 'memory:unknown_browser:gpu_process:reported_by_os:proportional_resident_size': - { - value: [100 + 200, 3000 + 1000 + 150, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) reported by ' + - 'the OS for the GPU process in an unknown browser' - }, - 'memory:unknown_browser:gpu_process:reported_by_os:private_dirty_size': { - value: [0, 90, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size reported by the OS for the GPU ' + - 'process in an unknown browser' - }, - 'memory:unknown_browser:gpu_process:reported_by_os:gpu_memory:proportional_resident_size': - { - value: [100 + 200, 3000 + 1000, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) of GPU memory ' + - '(Android memtrack) used by the GPU process in an unknown browser' - }, - 'memory:unknown_browser:gpu_process:reported_by_os:gpu_memory:gfx:proportional_resident_size': - { - value: [0, 1000, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the gfx Android ' + - 'memtrack component in the GPU process in an unknown browser' - }, - 'memory:unknown_browser:gpu_process:reported_by_os:gpu_memory:gl:proportional_resident_size': - { - value: [100, 3000, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the gl Android ' + - 'memtrack component in the GPU process in an unknown browser' - }, - 'memory:unknown_browser:gpu_process:reported_by_os:gpu_memory:graphics:proportional_resident_size': - { - value: [200, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the graphics ' + - 'Android memtrack component in the GPU process in an unknown ' + - 'browser' - }, - 'memory:unknown_browser:gpu_process:reported_by_os:system_memory:private_dirty_size': - { - value: [0, 90, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size of system memory (RAM) used ' + - 'by the GPU process in an unknown browser' - }, - 'memory:unknown_browser:gpu_process:reported_by_os:system_memory:proportional_resident_size': - { - value: [0, 150, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) of system ' + - 'memory (RAM) used by the GPU process in an unknown browser' - }, - 'memory:unknown_browser:gpu_process:reported_by_os:system_memory:ashmem:private_dirty_size': - { - value: [0, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of ashmem in the GPU process in ' + - 'an unknown browser' - }, - 'memory:unknown_browser:gpu_process:reported_by_os:system_memory:ashmem:proportional_resident_size': - { - value: [0, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of ashmem in the ' + - 'GPU process in an unknown browser' - }, - 'memory:unknown_browser:gpu_process:reported_by_os:system_memory:java_heap:private_dirty_size': - { - value: [0, 90, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the Java heap in the GPU ' + - 'process in an unknown browser' - }, - 'memory:unknown_browser:gpu_process:reported_by_os:system_memory:java_heap:proportional_resident_size': - { - value: [0, 150, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the Java heap in ' + - 'the GPU process in an unknown browser' - }, - 'memory:unknown_browser:gpu_process:reported_by_os:system_memory:native_heap:private_dirty_size': - { - value: [0, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the native heap in the GPU ' + - 'process in an unknown browser' - }, - 'memory:unknown_browser:gpu_process:reported_by_os:system_memory:native_heap:proportional_resident_size': - { - value: [0, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the native heap ' + - 'in the GPU process in an unknown browser' - }, - 'memory:unknown_browser:renderer_processes:process_count': { - value: [2, 3, 2, 1], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of renderer processes in an unknown browser' - }, - 'memory:unknown_browser:renderer_processes:reported_by_chrome:code_and_metadata_size': - { - value: [16, 0, 21 + 35], - unit: sizeInBytes_smallerIsBetter, - description: 'total size of code and metadata reported by Chrome ' + - 'for renderer processes in an unknown browser' - }, - 'memory:unknown_browser:renderer_processes:reported_by_chrome:v8:code_and_metadata_size': - { - value: [16, 0, 21 + 35], - unit: sizeInBytes_smallerIsBetter, - description: 'size of v8 code and metadata in renderer processes ' + - 'in an unknown browser' - }, - 'memory:unknown_browser:renderer_processes:reported_by_os:private_dirty_size': - { - value: [17 + 34, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size reported by the OS for ' + - 'renderer processes in an unknown browser' - }, - 'memory:unknown_browser:renderer_processes:reported_by_os:proportional_resident_size': - { - value: [67, 700, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) reported by ' + - 'the OS for renderer processes in an unknown browser' - }, - 'memory:unknown_browser:renderer_processes:reported_by_os:system_memory:private_dirty_size': - { - value: [17 + 34, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size of system memory (RAM) used ' + - 'by renderer processes in an unknown browser' - }, - 'memory:unknown_browser:renderer_processes:reported_by_os:system_memory:proportional_resident_size': - { - value: [67, 700, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) of system ' + - 'memory (RAM) used by renderer processes in an unknown browser' - }, - 'memory:unknown_browser:renderer_processes:reported_by_os:system_memory:ashmem:private_dirty_size': - { - value: [0, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of ashmem in renderer processes ' + - 'in an unknown browser' - }, - 'memory:unknown_browser:renderer_processes:reported_by_os:system_memory:ashmem:proportional_resident_size': - { - value: [0, 500, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of ashmem in ' + - 'renderer processes in an unknown browser' - }, - 'memory:unknown_browser:renderer_processes:reported_by_os:system_memory:java_heap:private_dirty_size': - { - value: [0, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the Java heap in renderer ' + - 'processes in an unknown browser' - }, - 'memory:unknown_browser:renderer_processes:reported_by_os:system_memory:java_heap:proportional_resident_size': - { - value: [0, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the Java heap in ' + - 'renderer processes in an unknown browser' - }, - 'memory:unknown_browser:renderer_processes:reported_by_os:system_memory:native_heap:private_dirty_size': - { - value: [17 + 34, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the native heap in renderer ' + - 'processes in an unknown browser' - }, - 'memory:unknown_browser:renderer_processes:reported_by_os:system_memory:native_heap:proportional_resident_size': - { - value: [67, 0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the native heap ' + - 'in renderer processes in an unknown browser' - } - }); - - memoryMetricTest('combined_chrome', function(model) { - var pBrowser = createChromeBrowserProcess(model); - - // Timestamp 1. - var gmd1 = addGlobalMemoryDump(model, 10, DETAILED); - var pmdBrowser1 = addProcessMemoryDump(gmd1, pBrowser, 10); - pmdBrowser1.vmRegions = VMRegionClassificationNode.fromRegions([ - new VMRegion(0xABCD, 128, 0, '/dev/ashmem/dalvik-non moving space', - { 'privateDirtyResident': 100 }) - ]); - - // Timestamp 2 (light global memory dump, so it should be skipped for - // mmaps_* values). - var gmd2 = addGlobalMemoryDump(model, 20, LIGHT); - var pmdBrowser2 = addProcessMemoryDump(gmd2, pBrowser, 20); - pmdBrowser2.memoryAllocatorDumps = [ - newAllocatorDump(pmdBrowser2, 'malloc', { size: 32 }) - ]; - - // Timestamp 3. - var gmd3 = addGlobalMemoryDump(model, 30, DETAILED); - var pmdBrowser3 = addProcessMemoryDump(gmd3, pBrowser, 30); - pmdBrowser3.memoryAllocatorDumps = [ - newAllocatorDump(pmdBrowser3, 'malloc', { size: 48 }) - ]; - pmdBrowser3.vmRegions = VMRegionClassificationNode.fromRegions([ - new VMRegion(0xABCD, 1024, 0, '/dev/ashmem/dalvik-non moving space', - { 'privateDirtyResident': 150 }) - ]); - }, { - 'memory:chrome:all_processes:dump_count:detailed': { - value: 2, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of detailed memory dumps added by Chrome to ' + - 'the trace' - }, - 'memory:chrome:all_processes:dump_count:light': { - value: 1, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of light memory dumps added by Chrome to ' + - 'the trace' - }, - 'memory:chrome:all_processes:dump_count': { - value: 3, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all memory dumps added by Chrome to the ' + - 'trace' - }, - 'memory:chrome:all_processes:process_count': { - value: [1, 1, 1], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_chrome:effective_size': { - value: [0, 32, 48], - unit: sizeInBytes_smallerIsBetter, - description: 'total effective size reported by Chrome for all ' + - 'processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_chrome:malloc:effective_size': { - value: [0, 32, 48], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of malloc in all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:private_dirty_size': { - value: [100, 150], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size reported by the OS for all ' + - 'processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:proportional_resident_size': { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) reported by the ' + - 'OS for all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:system_memory:ashmem:private_dirty_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of ashmem in all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:system_memory:ashmem:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of ashmem in all ' + - 'processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:system_memory:java_heap:private_dirty_size': - { - value: [100, 150], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the Java heap in all processes ' + - 'in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:system_memory:java_heap:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the Java heap in ' + - 'all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:system_memory:native_heap:private_dirty_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the native heap in all ' + - 'processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:system_memory:native_heap:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the native heap ' + - 'in all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:system_memory:private_dirty_size': - { - value: [100, 150], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size of system memory (RAM) used ' + - 'by all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:system_memory:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) of system ' + - 'memory (RAM) used by all processes in Chrome' - }, - 'memory:chrome:browser_process:process_count': { - value: [1, 1, 1], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of browser processes in Chrome' - }, - 'memory:chrome:browser_process:reported_by_chrome:effective_size': { - value: [0, 32, 48], - unit: sizeInBytes_smallerIsBetter, - description: 'total effective size reported by Chrome for the browser ' + - 'process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_chrome:malloc:effective_size': { - value: [0, 32, 48], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of malloc in the browser process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:private_dirty_size': { - value: [100, 150], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size reported by the OS for the ' + - 'browser process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:proportional_resident_size': { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) reported by the ' + - 'OS for the browser process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:system_memory:ashmem:private_dirty_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of ashmem in the browser process ' + - 'in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:system_memory:ashmem:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of ashmem in the ' + - 'browser process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:system_memory:java_heap:private_dirty_size': - { - value: [100, 150], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the Java heap in the browser ' + - 'process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:system_memory:java_heap:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the Java heap in ' + - 'the browser process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:system_memory:native_heap:private_dirty_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the native heap in the browser ' + - 'process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:system_memory:native_heap:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the native heap ' + - 'in the browser process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:system_memory:private_dirty_size': - { - value: [100, 150], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size of system memory (RAM) used ' + - 'by the browser process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:system_memory:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) of system ' + - 'memory (RAM) used by the browser process in Chrome' - } - }); - - memoryMetricTest('combined_multipleBrowsers', function(model) { - var pWebView = createWebViewProcess(model); - var pChrome1 = createChromeBrowserProcess(model); - var pRenderer1 = createProcessWithName(model, 'Renderer'); - var pGpu1 = createProcessWithName(model, 'GPU Process'); - var pUnknownBrowser = createProcessWithName(model, 'Browser'); - var pChrome2 = createChromeBrowserProcess(model); - var pRenderer2 = createProcessWithName(model, 'Renderer'); - - // Timestamp 1 (WebView). - var gmd1 = addGlobalMemoryDump(model, 0, LIGHT); - var pmdBrowser1 = addProcessMemoryDump(gmd1, pWebView, 0); - pmdBrowser1.memoryAllocatorDumps = [ - newAllocatorDump(pmdBrowser1, 'malloc', { size: 2 }), - newAllocatorDump(pmdBrowser1, 'v8', { size: 4 }) - ]; - - // Timestamp 2 (Chrome 1 + Renderer + GPU Process). - var gmd2 = addGlobalMemoryDump(model, 10, DETAILED); - var pmdBrowser2 = addProcessMemoryDump(gmd2, pChrome1, 12); - pmdBrowser2.vmRegions = VMRegionClassificationNode.fromRegions([ - new VMRegion(0xABCD, 9999, 0, '/dev/ashmem/dalvik-non moving space', - { 'privateDirtyResident': 8 }) - ]); - var pmdGpu2 = addProcessMemoryDump(gmd2, pGpu1, 8); - pmdGpu2.vmRegions = VMRegionClassificationNode.fromRegions([ - new VMRegion(0xABCD, 9999, 0, '/dev/ashmem/dalvik-non moving space', - { 'privateDirtyResident': 16 }) - ]); - var pmdRenderer2 = addProcessMemoryDump(gmd2, pRenderer1, 8); - pmdRenderer2.memoryAllocatorDumps = [ - newAllocatorDump(pmdBrowser2, 'malloc', { size: 32 }) - ]; - - // Timestamp 3 (Chrome 2). - var gmd3 = addGlobalMemoryDump(model, 20, DETAILED); - var pmdBrowser3 = addProcessMemoryDump(gmd3, pChrome2, 20); - pmdBrowser3.memoryAllocatorDumps = [ - newAllocatorDump(pmdBrowser3, 'malloc', { size: 64 }), - newAllocatorDump(pmdBrowser3, 'sqlite', { size: 128 }), - newAllocatorDump(pmdBrowser3, 'discardable', { - size: 8388608, - locked_size: 4194304 - }) - ]; - pmdBrowser3.vmRegions = VMRegionClassificationNode.fromRegions([ - new VMRegion(0xABCD, 99, 0, '/dev/ashmem/dalvik-non moving space', - { 'privateDirtyResident': 256 }) - ]); - - // Timestamp 4 (Chrome 2 + Renderer). - var gmd4 = addGlobalMemoryDump(model, 30, LIGHT); - var pmdBrowser4 = addProcessMemoryDump(gmd4, pChrome2, 28); - pmdBrowser4.memoryAllocatorDumps = [ - newAllocatorDump(pmdBrowser4, 'malloc', { size: 512 }), - newAllocatorDump(pmdBrowser3, 'discardable', { size: 16777216 }) - ]; - var pmdRenderer4 = addProcessMemoryDump(gmd4, pRenderer2, 32); - pmdRenderer4.memoryAllocatorDumps = [ - newAllocatorDump(pmdRenderer4, 'malloc', { size: 1024 }), - newAllocatorDump(pmdRenderer4, 'v8', { size: 2048 }) - ]; - - // Timestamp 5 (Unknown browser). - var gmd5 = addGlobalMemoryDump(model, 40, LIGHT); - var pmdBrowser5 = addProcessMemoryDump(gmd5, pUnknownBrowser, 40); - pmdBrowser5.memoryAllocatorDumps = [ - newAllocatorDump(pmdBrowser5, 'malloc', { size: 4096 }), - newAllocatorDump(pmdBrowser5, 'sqlite', { size: 8192 }), - ]; - - // Timestamp 6 (WebView). - var gmd6 = addGlobalMemoryDump(model, 50, DETAILED); - var pmdBrowser6 = addProcessMemoryDump(gmd6, pWebView, 50); - pmdBrowser6.memoryAllocatorDumps = [ - newAllocatorDump(pmdBrowser6, 'malloc', { size: 16384 }), - newAllocatorDump(pmdBrowser6, 'v8', { - 'allocated_objects_size': 32768, - 'code_and_metadata_size': 33554432, - 'size': 67108864 - }) - ]; - pmdBrowser6.vmRegions = VMRegionClassificationNode.fromRegions([ - new VMRegion(0xABCD, 99999, 0, '/dev/ashmem/dalvik-non moving space', - { 'privateDirtyResident': 65536 }) - ]); - - // Timestamp 7 (Chrome 1 + GPU Process). - var gmd7 = addGlobalMemoryDump(model, 60, DETAILED); - var pmdBrowser7 = addProcessMemoryDump(gmd7, pChrome1, 63); - pmdBrowser7.memoryAllocatorDumps = [ - newAllocatorDump(pmdBrowser4, 'malloc', { size: 131072 }), - newAllocatorDump(pmdBrowser4, 'sqlite', { size: 262144 }) - ]; - pmdBrowser7.vmRegions = VMRegionClassificationNode.fromRegions([ - new VMRegion(0xABCD, 999999, 0, '/dev/ashmem/dalvik-non moving space', - { 'privateDirtyResident': 524288 }) - ]); - var pmdGpu7 = addProcessMemoryDump(gmd7, pGpu1, 57); - pmdGpu7.memoryAllocatorDumps = (function() { - var gpuDump = newAllocatorDump(pmdGpu7, 'gpu', { 'size': 1048576 }); - var memtrackDump = addChildDump(gpuDump, 'android_memtrack'); - addChildDump(memtrackDump, 'gl', { 'memtrack_pss': 2097152 }); - return [gpuDump]; - })(); - }, { - // WebView (GMD1, GMD6). - 'memory:webview:all_processes:dump_count:detailed': { - value: 1, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of detailed memory dumps added by WebView ' + - 'to the trace' - }, - 'memory:webview:all_processes:dump_count:light': { - value: 1, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of light memory dumps added by WebView to ' + - 'the trace' - }, - 'memory:webview:all_processes:dump_count': { - value: 2, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all memory dumps added by WebView to the ' + - 'trace' - }, - 'memory:webview:all_processes:process_count': { - value: [1, 1], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all processes in WebView' - }, - 'memory:webview:all_processes:reported_by_chrome:effective_size': { - value: [4 + 2, 16384 + 67108864], - unit: sizeInBytes_smallerIsBetter, - description: 'total effective size reported by Chrome for all ' + - 'processes in WebView' - }, - 'memory:webview:all_processes:reported_by_chrome:code_and_metadata_size': { - value: [33554432], - unit: sizeInBytes_smallerIsBetter, - description: 'total size of code and metadata reported by Chrome for ' + - 'all processes in WebView' - }, - 'memory:webview:all_processes:reported_by_chrome:allocated_objects_size': { - value: [0, 32768], - unit: sizeInBytes_smallerIsBetter, - description: 'total size of all allocated objects reported by Chrome ' + - 'for all processes in WebView' - }, - 'memory:webview:all_processes:reported_by_chrome:malloc:effective_size': { - value: [2, 16384], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of malloc in all processes in WebView' - }, - 'memory:webview:all_processes:reported_by_chrome:v8:effective_size': { - value: [4, 67108864], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of v8 in all processes in WebView' - }, - 'memory:webview:all_processes:reported_by_chrome:v8:code_and_metadata_size': - { - value: [33554432], - unit: sizeInBytes_smallerIsBetter, - description: 'size of v8 code and metadata in all processes in ' + - 'WebView' - }, - 'memory:webview:all_processes:reported_by_chrome:v8:allocated_objects_size': - { - value: [0, 32768], - unit: sizeInBytes_smallerIsBetter, - description: 'size of all objects allocated by v8 in all processes ' + - 'in WebView' - }, - 'memory:webview:all_processes:reported_by_os:private_dirty_size': { - value: [65536], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size reported by the OS for all ' + - 'processes in WebView' - }, - 'memory:webview:all_processes:reported_by_os:proportional_resident_size': { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) reported by the ' + - 'OS for all processes in WebView' - }, - 'memory:webview:all_processes:reported_by_os:system_memory:ashmem:private_dirty_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of ashmem in all processes in ' + - 'WebView' - }, - 'memory:webview:all_processes:reported_by_os:system_memory:ashmem:proportional_resident_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of ashmem in all ' + - 'processes in WebView' - }, - 'memory:webview:all_processes:reported_by_os:system_memory:java_heap:private_dirty_size': - { - value: [65536], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the Java heap in all processes ' + - 'in WebView' - }, - 'memory:webview:all_processes:reported_by_os:system_memory:java_heap:proportional_resident_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the Java heap in ' + - 'all processes in WebView' - }, - 'memory:webview:all_processes:reported_by_os:system_memory:native_heap:private_dirty_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the native heap in all ' + - 'processes in WebView' - }, - 'memory:webview:all_processes:reported_by_os:system_memory:native_heap:proportional_resident_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the native heap ' + - 'in all processes in WebView' - }, - 'memory:webview:all_processes:reported_by_os:system_memory:private_dirty_size': - { - value: [65536], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size of system memory (RAM) used ' + - 'by all processes in WebView' - }, - 'memory:webview:all_processes:reported_by_os:system_memory:proportional_resident_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) of system ' + - 'memory (RAM) used by all processes in WebView' - }, - 'memory:webview:browser_process:process_count': { - value: [1, 1], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of browser processes in WebView' - }, - 'memory:webview:browser_process:reported_by_chrome:effective_size': { - value: [4 + 2, 16384 + 67108864], - unit: sizeInBytes_smallerIsBetter, - description: 'total effective size reported by Chrome for the browser ' + - 'process in WebView' - }, - 'memory:webview:browser_process:reported_by_chrome:allocated_objects_size': - { - value: [0, 32768], - unit: sizeInBytes_smallerIsBetter, - description: 'total size of all allocated objects reported by ' + - 'Chrome for the browser process in WebView' - }, - 'memory:webview:browser_process:reported_by_chrome:code_and_metadata_size': - { - value: [33554432], - unit: sizeInBytes_smallerIsBetter, - description: 'total size of code and metadata reported by Chrome ' + - 'for the browser process in WebView' - }, - 'memory:webview:browser_process:reported_by_chrome:malloc:effective_size': { - value: [2, 16384], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of malloc in the browser process in WebView' - }, - 'memory:webview:browser_process:reported_by_chrome:v8:effective_size': { - value: [4, 67108864], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of v8 in the browser process in WebView' - }, - 'memory:webview:browser_process:reported_by_chrome:v8:allocated_objects_size': - { - value: [0, 32768], - unit: sizeInBytes_smallerIsBetter, - description: 'size of all objects allocated by v8 in the browser ' + - 'process in WebView' - }, - 'memory:webview:browser_process:reported_by_chrome:v8:code_and_metadata_size': - { - value: [33554432], - unit: sizeInBytes_smallerIsBetter, - description: 'size of v8 code and metadata in the browser process ' + - 'in WebView' - }, - 'memory:webview:browser_process:reported_by_os:private_dirty_size': { - value: [65536], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size reported by the OS for the ' + - 'browser process in WebView' - }, - 'memory:webview:browser_process:reported_by_os:proportional_resident_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) reported by ' + - 'the OS for the browser process in WebView' - }, - 'memory:webview:browser_process:reported_by_os:system_memory:ashmem:private_dirty_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of ashmem in the browser process ' + - 'in WebView' - }, - 'memory:webview:browser_process:reported_by_os:system_memory:ashmem:proportional_resident_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of ashmem in the ' + - 'browser process in WebView' - }, - 'memory:webview:browser_process:reported_by_os:system_memory:java_heap:private_dirty_size': - { - value: [65536], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the Java heap in the browser ' + - 'process in WebView' - }, - 'memory:webview:browser_process:reported_by_os:system_memory:java_heap:proportional_resident_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the Java heap in ' + - 'the browser process in WebView' - }, - 'memory:webview:browser_process:reported_by_os:system_memory:native_heap:private_dirty_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the native heap in the browser ' + - 'process in WebView' - }, - 'memory:webview:browser_process:reported_by_os:system_memory:native_heap:proportional_resident_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the native heap ' + - 'in the browser process in WebView' - }, - 'memory:webview:browser_process:reported_by_os:system_memory:private_dirty_size': - { - value: [65536], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size of system memory (RAM) used ' + - 'by the browser process in WebView' - }, - 'memory:webview:browser_process:reported_by_os:system_memory:proportional_resident_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) of system ' + - 'memory (RAM) used by the browser process in WebView' - }, - - // Chrome 1 (GMD3, GMD4). - 'memory:chrome:all_processes:reported_by_os:gpu_memory:gl:proportional_resident_size': - { - value: [0, 2097152], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the gl Android ' + - 'memtrack component in all processes in Chrome' - }, - 'memory:chrome:all_processes:dump_count:detailed': { - value: 2, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of detailed memory dumps added by Chrome to ' + - 'the trace' - }, - 'memory:chrome:all_processes:dump_count:light': { - value: 0, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of light memory dumps added by Chrome to ' + - 'the trace' - }, - 'memory:chrome:all_processes:dump_count': { - value: 2, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all memory dumps added by Chrome to the ' + - 'trace' - }, - 'memory:chrome:all_processes:process_count': { - value: [3, 2], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_chrome:effective_size': { - value: [32, 1048576 + 131072 + 262144], - unit: sizeInBytes_smallerIsBetter, - description: 'total effective size reported by Chrome for all ' + - 'processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_chrome:gpu:effective_size': { - value: [0, 1048576], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of gpu in all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_chrome:malloc:effective_size': { - value: [32, 131072], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of malloc in all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_chrome:sqlite:effective_size': { - value: [0, 262144], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of sqlite in all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:private_dirty_size': { - value: [8 + 16, 524288], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size reported by the OS for all ' + - 'processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:proportional_resident_size': { - value: [0, 2097152], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) reported by the ' + - 'OS for all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:gpu_memory:proportional_resident_size': - { - value: [0, 2097152], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) of GPU memory ' + - '(Android memtrack) used by all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:system_memory:ashmem:private_dirty_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of ashmem in all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:system_memory:ashmem:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of ashmem in all ' + - 'processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:system_memory:java_heap:private_dirty_size': - { - value: [8 + 16, 524288], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the Java heap in all processes ' + - 'in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:system_memory:java_heap:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the Java heap in ' + - 'all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:system_memory:native_heap:private_dirty_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the native heap in all ' + - 'processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:system_memory:native_heap:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the native heap ' + - 'in all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:system_memory:private_dirty_size': - { - value: [8 + 16, 524288], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size of system memory (RAM) used ' + - 'by all processes in Chrome' - }, - 'memory:chrome:all_processes:reported_by_os:system_memory:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) of system ' + - 'memory (RAM) used by all processes in Chrome' - }, - 'memory:chrome:browser_process:process_count': { - value: [1, 1], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of browser processes in Chrome' - }, - 'memory:chrome:browser_process:reported_by_chrome:effective_size': { - value: [0, 131072 + 262144], - unit: sizeInBytes_smallerIsBetter, - description: 'total effective size reported by Chrome for the browser ' + - 'process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_chrome:malloc:effective_size': { - value: [0, 131072], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of malloc in the browser process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_chrome:sqlite:effective_size': { - value: [0, 262144], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of sqlite in the browser process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:private_dirty_size': { - value: [8, 524288], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size reported by the OS for the ' + - 'browser process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:proportional_resident_size': { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) reported by the ' + - 'OS for the browser process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:system_memory:ashmem:private_dirty_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of ashmem in the browser process ' + - 'in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:system_memory:ashmem:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of ashmem in the ' + - 'browser process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:system_memory:java_heap:private_dirty_size': - { - value: [8, 524288], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the Java heap in the browser ' + - 'process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:system_memory:java_heap:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the Java heap in ' + - 'the browser process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:system_memory:native_heap:private_dirty_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the native heap in the browser ' + - 'process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:system_memory:native_heap:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the native heap ' + - 'in the browser process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:system_memory:private_dirty_size': - { - value: [8, 524288], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size of system memory (RAM) used ' + - 'by the browser process in Chrome' - }, - 'memory:chrome:browser_process:reported_by_os:system_memory:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) of system ' + - 'memory (RAM) used by the browser process in Chrome' - }, - 'memory:chrome:gpu_process:reported_by_chrome:effective_size': { - value: [0, 1048576], - unit: sizeInBytes_smallerIsBetter, - description: 'total effective size reported by Chrome for the GPU ' + - 'process in Chrome' - }, - 'memory:chrome:gpu_process:reported_by_os:gpu_memory:proportional_resident_size': - { - value: [0, 2097152], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) of GPU memory ' + - '(Android memtrack) used by the GPU process in Chrome' - }, - 'memory:chrome:gpu_process:reported_by_os:gpu_memory:gl:proportional_resident_size': - { - value: [0, 2097152], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the gl Android ' + - 'memtrack component in the GPU process in Chrome' - }, - 'memory:chrome:gpu_process:process_count': { - value: [1, 1], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of GPU processes in Chrome' - }, - 'memory:chrome:gpu_process:reported_by_chrome:gpu:effective_size': { - value: [0, 1048576], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of gpu in the GPU process in Chrome' - }, - 'memory:chrome:gpu_process:reported_by_os:private_dirty_size': { - value: [16, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size reported by the OS for the GPU ' + - 'process in Chrome' - }, - 'memory:chrome:gpu_process:reported_by_os:proportional_resident_size': { - value: [0, 2097152], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) reported by the ' + - 'OS for the GPU process in Chrome' - }, - 'memory:chrome:gpu_process:reported_by_os:system_memory:ashmem:private_dirty_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of ashmem in the GPU process in ' + - 'Chrome' - }, - 'memory:chrome:gpu_process:reported_by_os:system_memory:ashmem:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of ashmem in the ' + - 'GPU process in Chrome' - }, - 'memory:chrome:gpu_process:reported_by_os:system_memory:java_heap:private_dirty_size': - { - value: [16, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the Java heap in the GPU ' + - 'process in Chrome' - }, - 'memory:chrome:gpu_process:reported_by_os:system_memory:java_heap:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the Java heap in ' + - 'the GPU process in Chrome' - }, - 'memory:chrome:gpu_process:reported_by_os:system_memory:native_heap:private_dirty_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the native heap in the GPU ' + - 'process in Chrome' - }, - 'memory:chrome:gpu_process:reported_by_os:system_memory:native_heap:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the native heap ' + - 'in the GPU process in Chrome' - }, - 'memory:chrome:gpu_process:reported_by_os:system_memory:private_dirty_size': - { - value: [16, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size of system memory (RAM) used ' + - 'by the GPU process in Chrome' - }, - 'memory:chrome:gpu_process:reported_by_os:system_memory:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) of system ' + - 'memory (RAM) used by the GPU process in Chrome' - }, - 'memory:chrome:renderer_processes:process_count': { - value: [1, 0], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of renderer processes in Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_chrome:effective_size': { - value: [32, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total effective size reported by Chrome for renderer ' + - 'processes in Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_chrome:malloc:effective_size': - { - value: [32, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of malloc in renderer processes in ' + - 'Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_os:private_dirty_size': { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size reported by the OS for renderer ' + - 'processes in Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_os:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) reported by ' + - 'the OS for renderer processes in Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_os:system_memory:ashmem:private_dirty_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of ashmem in renderer processes ' + - 'in Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_os:system_memory:ashmem:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of ashmem in ' + - 'renderer processes in Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_os:system_memory:java_heap:private_dirty_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the Java heap in renderer ' + - 'processes in Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_os:system_memory:java_heap:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the Java heap in ' + - 'renderer processes in Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_os:system_memory:native_heap:private_dirty_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the native heap in renderer ' + - 'processes in Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_os:system_memory:native_heap:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the native heap ' + - 'in renderer processes in Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_os:system_memory:private_dirty_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size of system memory (RAM) used ' + - 'by renderer processes in Chrome' - }, - 'memory:chrome:renderer_processes:reported_by_os:system_memory:proportional_resident_size': - { - value: [0, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) of system ' + - 'memory (RAM) used by renderer processes in Chrome' - }, - - // Chrome 2 (GMD2, GMD7). - 'memory:chrome2:all_processes:dump_count:detailed': { - value: 1, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of detailed memory dumps added by Chrome(2) ' + - 'to the trace' - }, - 'memory:chrome2:all_processes:dump_count:light': { - value: 1, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of light memory dumps added by Chrome(2) to ' + - 'the trace' - }, - 'memory:chrome2:all_processes:dump_count': { - value: 2, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all memory dumps added by Chrome(2) to ' + - 'the trace' - }, - 'memory:chrome2:all_processes:process_count': { - value: [1, 2], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all processes in Chrome(2)' - }, - 'memory:chrome2:all_processes:reported_by_chrome:discardable:effective_size': - { - value: [8388608, 16777216], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of discardable in all processes in ' + - 'Chrome(2)' - }, - 'memory:chrome2:all_processes:reported_by_chrome:locked_size': { - value: [4194304, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total locked (pinned) size reported by Chrome for all ' + - 'processes in Chrome(2)' - }, - 'memory:chrome2:all_processes:reported_by_chrome:discardable:locked_size': { - value: [4194304, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'locked (pinned) size of discardable in all processes in ' + - 'Chrome(2)' - }, - 'memory:chrome2:all_processes:reported_by_chrome:effective_size': { - value: [64 + 8388608 + 128, 512 + 1024 + 2048 + 16777216], - unit: sizeInBytes_smallerIsBetter, - description: 'total effective size reported by Chrome for all ' + - 'processes in Chrome(2)' - }, - 'memory:chrome2:all_processes:reported_by_chrome:malloc:effective_size': { - value: [64, 512 + 1024], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of malloc in all processes in Chrome(2)' - }, - 'memory:chrome2:all_processes:reported_by_chrome:sqlite:effective_size': { - value: [128, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of sqlite in all processes in Chrome(2)' - }, - 'memory:chrome2:all_processes:reported_by_chrome:v8:effective_size': { - value: [0, 2048], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of v8 in all processes in Chrome(2)' - }, - 'memory:chrome2:all_processes:reported_by_os:private_dirty_size': { - value: [256], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size reported by the OS for all ' + - 'processes in Chrome(2)' - }, - 'memory:chrome2:all_processes:reported_by_os:proportional_resident_size': { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) reported by the ' + - 'OS for all processes in Chrome(2)' - }, - 'memory:chrome2:all_processes:reported_by_os:system_memory:ashmem:private_dirty_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of ashmem in all processes in ' + - 'Chrome(2)' - }, - 'memory:chrome2:all_processes:reported_by_os:system_memory:ashmem:proportional_resident_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of ashmem in all ' + - 'processes in Chrome(2)' - }, - 'memory:chrome2:all_processes:reported_by_os:system_memory:java_heap:private_dirty_size': - { - value: [256], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the Java heap in all processes ' + - 'in Chrome(2)' - }, - 'memory:chrome2:all_processes:reported_by_os:system_memory:java_heap:proportional_resident_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the Java heap in ' + - 'all processes in Chrome(2)' - }, - 'memory:chrome2:all_processes:reported_by_os:system_memory:native_heap:private_dirty_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the native heap in all ' + - 'processes in Chrome(2)' - }, - 'memory:chrome2:all_processes:reported_by_os:system_memory:native_heap:proportional_resident_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the native heap ' + - 'in all processes in Chrome(2)' - }, - 'memory:chrome2:all_processes:reported_by_os:system_memory:private_dirty_size': - { - value: [256], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size of system memory (RAM) used ' + - 'by all processes in Chrome(2)' - }, - 'memory:chrome2:all_processes:reported_by_os:system_memory:proportional_resident_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) of system ' + - 'memory (RAM) used by all processes in Chrome(2)' - }, - 'memory:chrome2:browser_process:process_count': { - value: [1, 1], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of browser processes in Chrome(2)' - }, - 'memory:chrome2:browser_process:reported_by_chrome:effective_size': { - value: [64 + 8388608 + 128, 512 + 16777216], - unit: sizeInBytes_smallerIsBetter, - description: 'total effective size reported by Chrome for the browser ' + - 'process in Chrome(2)' - }, - 'memory:chrome2:browser_process:reported_by_chrome:locked_size': { - value: [4194304, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'total locked (pinned) size reported by Chrome for the ' + - 'browser process in Chrome(2)' - }, - 'memory:chrome2:browser_process:reported_by_chrome:malloc:effective_size': { - value: [64, 512], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of malloc in the browser process in ' + - 'Chrome(2)' - }, - 'memory:chrome2:browser_process:reported_by_chrome:discardable:effective_size': - { - value: [8388608, 16777216], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of discardable in the browser process ' + - 'in Chrome(2)' - }, - 'memory:chrome2:browser_process:reported_by_chrome:discardable:locked_size': - { - value: [4194304, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'locked (pinned) size of discardable in the browser ' + - 'process in Chrome(2)' - }, - 'memory:chrome2:browser_process:reported_by_chrome:sqlite:effective_size': { - value: [128, 0], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of sqlite in the browser process in ' + - 'Chrome(2)' - }, - 'memory:chrome2:browser_process:reported_by_os:private_dirty_size': { - value: [256], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size reported by the OS for the ' + - 'browser process in Chrome(2)' - }, - 'memory:chrome2:browser_process:reported_by_os:proportional_resident_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) reported by ' + - 'the OS for the browser process in Chrome(2)' - }, - 'memory:chrome2:browser_process:reported_by_os:system_memory:ashmem:private_dirty_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of ashmem in the browser process ' + - 'in Chrome(2)' - }, - 'memory:chrome2:browser_process:reported_by_os:system_memory:ashmem:proportional_resident_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of ashmem in the ' + - 'browser process in Chrome(2)' - }, - 'memory:chrome2:browser_process:reported_by_os:system_memory:java_heap:private_dirty_size': - { - value: [256], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the Java heap in the browser ' + - 'process in Chrome(2)' - }, - 'memory:chrome2:browser_process:reported_by_os:system_memory:java_heap:proportional_resident_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the Java heap in ' + - 'the browser process in Chrome(2)' - }, - 'memory:chrome2:browser_process:reported_by_os:system_memory:native_heap:private_dirty_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'private dirty size of the native heap in the browser ' + - 'process in Chrome(2)' - }, - 'memory:chrome2:browser_process:reported_by_os:system_memory:native_heap:proportional_resident_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'proportional resident size (PSS) of the native heap ' + - 'in the browser process in Chrome(2)' - }, - 'memory:chrome2:browser_process:reported_by_os:system_memory:private_dirty_size': - { - value: [256], - unit: sizeInBytes_smallerIsBetter, - description: 'total private dirty size of system memory (RAM) used ' + - 'by the browser process in Chrome(2)' - }, - 'memory:chrome2:browser_process:reported_by_os:system_memory:proportional_resident_size': - { - value: [0], - unit: sizeInBytes_smallerIsBetter, - description: 'total proportional resident size (PSS) of system ' + - 'memory (RAM) used by the browser process in Chrome(2)' - }, - 'memory:chrome2:renderer_processes:process_count': { - value: [0, 1], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of renderer processes in Chrome(2)' - }, - 'memory:chrome2:renderer_processes:reported_by_chrome:effective_size': { - value: [0, 1024 + 2048], - unit: sizeInBytes_smallerIsBetter, - description: 'total effective size reported by Chrome for renderer ' + - 'processes in Chrome(2)' - }, - 'memory:chrome2:renderer_processes:reported_by_chrome:malloc:effective_size': - { - value: [0, 1024], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of malloc in renderer processes in ' + - 'Chrome(2)' - }, - 'memory:chrome2:renderer_processes:reported_by_chrome:v8:effective_size': { - value: [0, 2048], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of v8 in renderer processes in Chrome(2)' - }, - - // Unknown browser (GMD5). - 'memory:unknown_browser:all_processes:dump_count:detailed': { - value: 0, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of detailed memory dumps added by an ' + - 'unknown browser to the trace' - }, - 'memory:unknown_browser:all_processes:dump_count:light': { - value: 1, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of light memory dumps added by an unknown ' + - 'browser to the trace' - }, - 'memory:unknown_browser:all_processes:dump_count': { - value: 1, - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all memory dumps added by an unknown ' + - 'browser to the trace' - }, - 'memory:unknown_browser:all_processes:process_count': { - value: [1], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of all processes in an unknown browser' - }, - 'memory:unknown_browser:all_processes:reported_by_chrome:effective_size': { - value: [4096 + 8192], - unit: sizeInBytes_smallerIsBetter, - description: 'total effective size reported by Chrome for all ' + - 'processes in an unknown browser' - }, - 'memory:unknown_browser:all_processes:reported_by_chrome:malloc:effective_size': - { - value: [4096], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of malloc in all processes in an ' + - 'unknown browser' - }, - 'memory:unknown_browser:all_processes:reported_by_chrome:sqlite:effective_size': - { - value: [8192], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of sqlite in all processes in an ' + - 'unknown browser' - }, - 'memory:unknown_browser:browser_process:process_count': { - value: [1], - unit: unitlessNumber_smallerIsBetter, - description: 'total number of browser processes in an unknown browser' - }, - 'memory:unknown_browser:browser_process:reported_by_chrome:effective_size': - { - value: [4096 + 8192], - unit: sizeInBytes_smallerIsBetter, - description: 'total effective size reported by Chrome for the ' + - 'browser process in an unknown browser' - }, - 'memory:unknown_browser:browser_process:reported_by_chrome:malloc:effective_size': - { - value: [4096], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of malloc in the browser process in ' + - 'an unknown browser' - }, - 'memory:unknown_browser:browser_process:reported_by_chrome:sqlite:effective_size': - { - value: [8192], - unit: sizeInBytes_smallerIsBetter, - description: 'effective size of sqlite in the browser process in ' + - 'an unknown browser' - } - }); - - test('dumpIdBrowserClashThrows', function() { - var model = tr.c.TestUtils.newModel(function(model) { - var pWebView = createWebViewProcess(model); - var pChrome = createChromeBrowserProcess(model); - - var gmd = addGlobalMemoryDump(model, 10); - addProcessMemoryDump(gmd, pWebView, 9); - addProcessMemoryDump(gmd, pChrome, 11); - }); - var values = new tr.v.ValueSet(); - - assert.throws(function() { - tr.metrics.sh.memoryMetric(values, model); - }, 'Memory dump ID clash across multiple browsers with PIDs: 1 and 2'); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/power_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/power_metric.html deleted file mode 100644 index eec9635a5a5..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/power_metric.html +++ /dev/null @@ -1,57 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright 2016 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<link rel="import" href="/tracing/base/statistics.html"> -<link rel="import" href="/tracing/metrics/metric_registry.html"> -<link rel="import" href="/tracing/metrics/system_health/clock_sync_latency_metric.html"> -<link rel="import" href="/tracing/value/numeric.html"> -<link rel="import" href="/tracing/value/value.html"> - -<script> -'use strict'; - -tr.exportTo('tr.metrics.sh', function() { - - var IDEAL_FRAME_RATE = 60; - var IDEAL_FRAME_DURATION = 1000 / IDEAL_FRAME_RATE; - - function energyConsumedPerFrame(valueList, model) { - var frameEnergyConsumed = tr.v.NumericBuilder.createLinear( - tr.v.Unit.byName.energyInJoules_smallerIsBetter, - tr.b.Range.fromExplicitRange(0, .5), 20).build(); - var frameStartTs = parseFloat(model.device.powerSeries.samples[0].start); - while (model.device.powerSeries.getSamplesWithinRange( - frameStartTs, frameStartTs + IDEAL_FRAME_DURATION).length) { - var currentFrameEnergy = model.device.powerSeries.getEnergyConsumed( - frameStartTs, frameStartTs + IDEAL_FRAME_DURATION); - frameStartTs += IDEAL_FRAME_DURATION; - frameEnergyConsumed.add(currentFrameEnergy); - } - - valueList.addValue(new tr.v.NumericValue( - 'energy_consumed_per_frame', frameEnergyConsumed, - {description: 'Energy consumption per frame in joules'})); - } - - function powerMetric(valueList, model) { - // TODO(alexandermont): Once it's possible to specify multiple metrics - // in a Telemetry benchmark, separate out this metric from the power - // metric and have the benchmark use both. - // (See: https://github.com/catapult-project/catapult/issues/2430.) - tr.metrics.sh.clockSyncLatencyMetric(valueList, model); - if (!model.device.powerSeries) - return; - energyConsumedPerFrame(valueList, model); - } - - tr.metrics.MetricRegistry.register(powerMetric); - - return { - powerMetric: powerMetric - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/power_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/power_metric_test.html deleted file mode 100644 index bdc034e63a7..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/power_metric_test.html +++ /dev/null @@ -1,65 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright 2016 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<link rel="import" href="/tracing/core/test_utils.html"> -<link rel="import" href="/tracing/metrics/system_health/power_metric.html"> -<link rel="import" href="/tracing/value/value_set.html"> - -<script> -'use strict'; - -tr.b.unittest.testSuite(function() { - test('powerMetric_multipleFrames', function() { - var model = new tr.Model(); - var valueSet = new tr.v.ValueSet(); - model.device.powerSeries = new tr.model.PowerSeries(model.device); - // We want values in different frames, so they must go up by more than 16.66 - // milliseconds. - model.device.powerSeries.addPowerSample('1', '.1'); - model.device.powerSeries.addPowerSample('2', '.1'); - model.device.powerSeries.addPowerSample('18', '.2'); - model.device.powerSeries.addPowerSample('36', '.3'); - model.device.powerSeries.addPowerSample('53', '.4'); - model.device.powerSeries.addPowerSample('70', '.5'); - tr.metrics.sh.powerMetric(valueSet, model); - var powerEntries = valueSet.valueDicts.filter( - (dict) => dict.name === 'energy_consumed_per_frame'); - var powerEntry = tr.b.getOnlyElement(powerEntries); - assert.equal(powerEntry.numeric.centralBins[0].count, 5); - assert.closeTo(powerEntry.numeric.running.sum, 0.0172, 1e-4); - }); - - test('powerMetric_oneFrame', function() { - var model = new tr.Model(); - var valueSet = new tr.v.ValueSet(); - model.device.powerSeries = new tr.model.PowerSeries(model.device); - // We want values in the same frame, so they must go up by less than 16.66 - // milliseconds. - model.device.powerSeries.addPowerSample('1', '.1'); - model.device.powerSeries.addPowerSample('2', '.1'); - model.device.powerSeries.addPowerSample('3', '.2'); - model.device.powerSeries.addPowerSample('4', '.3'); - model.device.powerSeries.addPowerSample('5', '.4'); - model.device.powerSeries.addPowerSample('6', '.5'); - tr.metrics.sh.powerMetric(valueSet, model); - var powerEntries = valueSet.valueDicts.filter( - (dict) => dict.name === 'energy_consumed_per_frame'); - var powerEntry = tr.b.getOnlyElement(powerEntries); - assert.equal(powerEntry.numeric.centralBins[0].count, 1); - assert.closeTo(powerEntry.numeric.running.sum, 0.0011, 1e-4); - }); - - test('powerMetric_noPowerSeries', function() { - var model = new tr.Model(); - var valueSet = new tr.v.ValueSet(); - tr.metrics.sh.powerMetric(valueSet, model); - var powerEntries = valueSet.valueDicts.filter( - (dict) => dict.name === 'energy_consumed_per_frame'); - assert.lengthOf(powerEntries, 0); - }); -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/responsiveness_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/responsiveness_metric.html deleted file mode 100644 index 5098c535277..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/responsiveness_metric.html +++ /dev/null @@ -1,158 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2015 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<link rel="import" href="/tracing/base/statistics.html"> -<link rel="import" href="/tracing/metrics/metric_registry.html"> -<link rel="import" href="/tracing/metrics/system_health/utils.html"> -<link rel="import" href="/tracing/model/user_model/animation_expectation.html"> -<link rel="import" href="/tracing/model/user_model/load_expectation.html"> -<link rel="import" href="/tracing/model/user_model/response_expectation.html"> -<link rel="import" href="/tracing/value/numeric.html"> -<link rel="import" href="/tracing/value/value.html"> - -<script> -'use strict'; - -tr.exportTo('tr.metrics.sh', function() { - // In the case of Response, Load, and DiscreteAnimation IRs, Responsiveness is - // derived from the time between when the user thinks they begin an interation - // (expectedStart) and the time when the screen first changes to reflect the - // interaction (actualEnd). There may be a delay between expectedStart and - // when chrome first starts processing the interaction (actualStart) if the - // main thread is busy. The user doesn't know when actualStart is, they only - // know when expectedStart is. User responsiveness, by definition, considers - // only what the user experiences, so "duration" is defined as actualEnd - - // expectedStart. - - function computeAnimationThroughput(animationExpectation) { - if (animationExpectation.frameEvents === undefined || - animationExpectation.frameEvents.length === 0) - throw new Error('Animation missing frameEvents ' + - animationExpectation.stableId); - - var durationSeconds = animationExpectation.duration / 1000; - return animationExpectation.frameEvents.length / durationSeconds; - } - - function computeAnimationframeTimeDiscrepancy(animationExpectation) { - if (animationExpectation.frameEvents === undefined || - animationExpectation.frameEvents.length === 0) - throw new Error('Animation missing frameEvents ' + - animationExpectation.stableId); - - var frameTimestamps = animationExpectation.frameEvents; - frameTimestamps = frameTimestamps.toArray().map(function(event) { - return event.start; - }); - - var absolute = false; - return tr.b.Statistics.timestampsDiscrepancy(frameTimestamps, absolute); - } - - var RESPONSE_NUMERIC_BUILDER = tr.v.NumericBuilder.createLinear( - tr.v.Unit.byName.timeDurationInMs_smallerIsBetter, - tr.b.Range.fromExplicitRange(100, 1000), 90); - - var THROUGHPUT_NUMERIC_BUILDER = tr.v.NumericBuilder.createLinear( - tr.v.Unit.byName.unitlessNumber_biggerIsBetter, - tr.b.Range.fromExplicitRange(10, 60), 10); - - var DISCREPANCY_NUMERIC_BUILDER = tr.v.NumericBuilder.createLinear( - tr.v.Unit.byName.unitlessNumber_smallerIsBetter, - tr.b.Range.fromExplicitRange(0, 1), 50); - - var LATENCY_NUMERIC_BUILDER = tr.v.NumericBuilder.createLinear( - tr.v.Unit.byName.timeDurationInMs_smallerIsBetter, - tr.b.Range.fromExplicitRange(0, 300), 60); - - /** - * @param {!tr.v.ValueSet} values - * @param {!tr.model.Model} model - * @param {!Object=} opt_options - */ - function responsivenessMetric(values, model, opt_options) { - // TODO(benjhayden): Add categories to benchmark to support: - // tr.metrics.sh.firstPaintMetric(values, model); - - var responseNumeric = RESPONSE_NUMERIC_BUILDER.build(); - var throughputNumeric = THROUGHPUT_NUMERIC_BUILDER.build(); - var frameTimeDiscrepancyNumeric = DISCREPANCY_NUMERIC_BUILDER.build(); - var latencyNumeric = LATENCY_NUMERIC_BUILDER.build(); - - model.userModel.expectations.forEach(function(ue) { - if (opt_options && opt_options.rangeOfInterest && - !opt_options.rangeOfInterest.intersectsExplicitRangeExclusive( - ue.start, ue.end)) - return; - - var sourceInfo = {userExpectationId: ue.stableId}; - - // Responsiveness is not defined for Idle. - if (ue instanceof tr.model.um.IdleExpectation) { - return; - } else if (ue instanceof tr.model.um.LoadExpectation) { - // This is already covered by firstPaintMetric. - } else if (ue instanceof tr.model.um.ResponseExpectation) { - responseNumeric.add(ue.duration, sourceInfo); - } else if (ue instanceof tr.model.um.AnimationExpectation) { - var throughput = computeAnimationThroughput(ue); - if (throughput === undefined) - throw new Error('Missing throughput for ' + - ue.stableId); - - throughputNumeric.add(throughput, sourceInfo); - - var frameTimeDiscrepancy = computeAnimationframeTimeDiscrepancy(ue); - if (frameTimeDiscrepancy === undefined) - throw new Error('Missing frameTimeDiscrepancy for ' + - ue.stableId); - - frameTimeDiscrepancyNumeric.add(frameTimeDiscrepancy, sourceInfo); - - ue.associatedEvents.forEach(function(event) { - if (!(event instanceof tr.e.cc.InputLatencyAsyncSlice)) - return; - - latencyNumeric.add(event.duration, sourceInfo); - }); - } else { - throw new Error('Unrecognized stage for ' + ue.stableId); - } - }); - - [ - responseNumeric, throughputNumeric, frameTimeDiscrepancyNumeric, - latencyNumeric - ].forEach(function(numeric) { - numeric.customizeSummaryOptions({ - avg: true, - max: true, - min: true, - std: true - }); - }); - - values.addValue(new tr.v.NumericValue( - 'response latency', responseNumeric)); - values.addValue(new tr.v.NumericValue( - 'animation throughput', throughputNumeric)); - values.addValue(new tr.v.NumericValue( - 'animation frameTimeDiscrepancy', - frameTimeDiscrepancyNumeric)); - values.addValue(new tr.v.NumericValue( - 'animation latency', latencyNumeric)); - } - - tr.metrics.MetricRegistry.register(responsivenessMetric, { - supportsRangeOfInterest: true - }); - - return { - responsivenessMetric: responsivenessMetric, - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/system_health_metrics.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/system_health_metrics.html deleted file mode 100644 index 723e526b554..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/system_health_metrics.html +++ /dev/null @@ -1,33 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2016 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<link rel="import" href="/tracing/metrics/system_health/efficiency_metric.html"> -<link rel="import" href="/tracing/metrics/system_health/hazard_metric.html"> -<link rel="import" href="/tracing/metrics/system_health/long_tasks_metric.html"> -<link rel="import" href="/tracing/metrics/system_health/power_metric.html" -<link rel="import" - href="/tracing/metrics/system_health/responsiveness_metric.html"> - -<script> -'use strict'; - -tr.exportTo('tr.metrics.sh', function() { - function systemHealthMetrics(values, model) { - tr.metrics.sh.responsivenessMetric(values, model); - tr.metrics.sh.efficiencyMetric(values, model); - tr.metrics.sh.longTasksMetric(values, model); - tr.metrics.sh.hazardMetric(values, model); - tr.metrics.sh.powerMetric(values, model); - } - - tr.metrics.MetricRegistry.register(systemHealthMetrics); - - return { - systemHealthMetrics: systemHealthMetrics - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/utils.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/utils.html deleted file mode 100644 index 9e0d09bd32f..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/utils.html +++ /dev/null @@ -1,43 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright (c) 2015 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> -<link rel="import" href="/tracing/model/user_model/user_expectation.html"> - -<script> -'use strict'; - -tr.exportTo('tr.metrics.sh', function() { - // Returns a weight for this score. - // score should be a number between 0 and 1 inclusive. - // This function is expected to be passed to tr.b.Statistics.weightedMean as - // its weightCallback. - function perceptualBlend(ir, index, score) { - // Lower scores are exponentially more important than higher scores - // due to the Peak-end rule. - // Other than that general rule, there is no specific reasoning behind this - // specific formula -- it is fairly arbitrary. - return Math.exp(1 - score); - } - - function filterExpectationsByRange(irs, opt_range) { - var filteredExpectations = []; - irs.forEach(function(ir) { - if (!(ir instanceof tr.model.um.UserExpectation)) - return; - - if (!opt_range || - opt_range.intersectsExplicitRangeExclusive(ir.start, ir.end)) - filteredExpectations.push(ir); - }); - return filteredExpectations; - } - - return { - perceptualBlend: perceptualBlend, - filterExpectationsByRange: filterExpectationsByRange - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/webview_startup_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/webview_startup_metric.html deleted file mode 100644 index 10e873b97f5..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/webview_startup_metric.html +++ /dev/null @@ -1,64 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright 2016 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<link rel="import" href="/tracing/metrics/metric_registry.html"> -<link rel="import" href="/tracing/metrics/system_health/utils.html"> -<link rel="import" href="/tracing/value/numeric.html"> -<link rel="import" href="/tracing/value/value.html"> - -<script> -'use strict'; - -tr.exportTo('tr.metrics.sh', function() { - function webviewStartupMetric(values, model) { - for (var slice of model.getDescendantEvents()) { - // WebViewStartupInterval is the title of the section of code that is - // entered (via android.os.Trace.beginSection) when WebView is started - // up. This value is defined in TelemetryActivity.java. - if (!(slice instanceof tr.model.Slice)) - return; - if (slice.title === 'WebViewStartupInterval') { - values.addValue(new tr.v.NumericValue( - 'webview_startup_wall_time', - new tr.v.ScalarNumeric( - tr.v.Unit.byName.timeDurationInMs_smallerIsBetter, - slice.duration), - { description: 'WebView startup wall time' })); - values.addValue(new tr.v.NumericValue( - 'webview_startup_cpu_time', - new tr.v.ScalarNumeric( - tr.v.Unit.byName.timeDurationInMs_smallerIsBetter, - slice.cpuDuration), - { description: 'WebView startup CPU time' })); - } - // WebViewBlankUrlLoadInterval is the title of the section of code - // that is entered (via android.os.Trace.beginSection) when WebView - // is started up. This value is defined in TelemetryActivity.java. - if (slice.title === 'WebViewBlankUrlLoadInterval') { - values.addValue(new tr.v.NumericValue( - 'webview_url_load_wall_time', - new tr.v.ScalarNumeric( - tr.v.Unit.byName.timeDurationInMs_smallerIsBetter, - slice.duration), - { description: 'WebView blank URL load wall time' })); - values.addValue(new tr.v.NumericValue( - 'webview_url_load_cpu_time', - new tr.v.ScalarNumeric( - tr.v.Unit.byName.timeDurationInMs_smallerIsBetter, - slice.cpuDuration), - { description: 'WebView blank URL load CPU time' })); - } - } - }; - - tr.metrics.MetricRegistry.register(webviewStartupMetric); - - return { - webviewStartupMetric: webviewStartupMetric - }; -}); -</script> diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/webview_startup_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/webview_startup_metric_test.html deleted file mode 100644 index fa4da093afc..00000000000 --- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/webview_startup_metric_test.html +++ /dev/null @@ -1,68 +0,0 @@ -<!DOCTYPE html> -<!-- -Copyright 2016 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<link rel="import" href="/tracing/core/test_utils.html"> -<link rel="import" href="/tracing/metrics/system_health/webview_startup_metric.html"> -<link rel="import" href="/tracing/value/value_set.html"> - -<script> -'use strict'; - -function makeTestModel() { - return tr.c.TestUtils.newModel(function(model) { - var mainThread = model.getOrCreateProcess(1).getOrCreateThread(2); - mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - cat: 'webview', - title: 'WebViewStartupInterval', - start: 200, - duration: 42.0, - cpuStart: 150, - cpuDuration: 32.0 - })); - mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ - cat: 'webview', - title: 'WebViewBlankUrlLoadInterval', - start: 250, - duration: 27.0, - cpuStart: 190, - cpuDuration: 17.0 - })); - }); -} - -tr.b.unittest.testSuite(function() { - test('webviewStartupMetric_allIntervals', function() { - var values = new tr.v.ValueSet(); - tr.metrics.sh.webviewStartupMetric(values, makeTestModel()); - assert.lengthOf(values.valueDicts, 4); - }); - - test('webviewStartupMetric_startupWallInterval', function() { - var values = new tr.v.ValueSet(); - tr.metrics.sh.webviewStartupMetric(values, makeTestModel()); - assert.equal(values.valueDicts[0].numeric.value, 42); - }); - - test('webviewStartupMetric_startupCpuInterval', function() { - var values = new tr.v.ValueSet(); - tr.metrics.sh.webviewStartupMetric(values, makeTestModel()); - assert.equal(values.valueDicts[1].numeric.value, 32); - }); - - test('webviewStartupMetric_urlLoadWallInterval', function() { - var values = new tr.v.ValueSet(); - tr.metrics.sh.webviewStartupMetric(values, makeTestModel()); - assert.equal(values.valueDicts[2].numeric.value, 27); - }); - - test('webviewStartupMetric_urlLoadCpuInterval', function() { - var values = new tr.v.ValueSet(); - tr.metrics.sh.webviewStartupMetric(values, makeTestModel()); - assert.equal(values.valueDicts[3].numeric.value, 17); - }); -}); -</script> |