| Index: tools/perf/measurements/memory_infra.py
|
| diff --git a/tools/perf/measurements/memory_infra.py b/tools/perf/measurements/memory_infra.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9dc2b4cc38e23494f01c18816a53ed24aa8173bc
|
| --- /dev/null
|
| +++ b/tools/perf/measurements/memory_infra.py
|
| @@ -0,0 +1,88 @@
|
| +# Copyright 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.
|
| +
|
| +# TODO(bashi): DO-NOT-FOR-COMMIT. Just for local measurements.
|
| +
|
| +import logging
|
| +
|
| +from telemetry.page import action_runner
|
| +from telemetry.page import page_test
|
| +from telemetry.timeline import tracing_category_filter
|
| +from telemetry.timeline import tracing_options
|
| +from telemetry.timeline.model import TimelineModel
|
| +from telemetry.value import scalar
|
| +
|
| +
|
| +class MemoryInfra(page_test.PageTest):
|
| + def __init__(self):
|
| + super(MemoryInfra, self).__init__()
|
| +
|
| + def WillNavigateToPage(self, page, tab):
|
| + category_filter = tracing_category_filter.TracingCategoryFilter(
|
| + '-*,blink.console,disabled-by-default-memory-infra')
|
| + options = tracing_options.TracingOptions()
|
| + options.enable_chrome_trace = True
|
| + tab.browser.platform.tracing_controller.Start(options, category_filter,
|
| + 10)
|
| + def CustomizeBrowserOptions(self, options):
|
| + options.AppendExtraBrowserArgs(['--no-sandbox'])
|
| +
|
| + def DidNavigateToPage(self, page, tab):
|
| + runner = action_runner.ActionRunner(tab)
|
| + runner.Wait(10)
|
| +
|
| + def ValidateAndMeasurePage(self, page, tab, results):
|
| + timeline_data = tab.browser.platform.tracing_controller.Stop()
|
| + timeline_model = TimelineModel(timeline_data)
|
| + renderer_process = timeline_model.GetRendererProcessFromTabId(tab.id)
|
| + latest = self._FindLatestRendererDump(timeline_model, renderer_process.pid)
|
| + self._AddAllocatorResults(latest, results)
|
| + self._AddMMapResults(latest, results)
|
| +
|
| + def CleanUpAfterPage(self, page, tab):
|
| + if tab.browser.platform.tracing_controller.is_tracing_running:
|
| + tab.browser.platform.tracing_controller.Stop()
|
| +
|
| + def _FindLatestRendererDump(self, timeline_model, pid):
|
| + """Returns the latest ProcessMemoryDumpEvent which is associated with
|
| + the renderer process and its |has_mmaps| is true.
|
| + """
|
| + latest = None
|
| + for memory_event in timeline_model.IterGlobalMemoryDumps():
|
| + renderer_events = filter(lambda event: event.process.pid == pid,
|
| + memory_event._process_dumps)
|
| + if len(renderer_events) == 0:
|
| + continue
|
| + assert(len(renderer_events) == 1)
|
| + current = renderer_events[0]
|
| + if current.has_mmaps and (not latest or latest.start < current.start):
|
| + latest = current
|
| + assert(latest != None)
|
| + return latest
|
| +
|
| + def _AddAllocatorResults(self, latest, results):
|
| + usage = latest.GetMemoryUsage()
|
| + def _AddAllocatorStat(category):
|
| + results.AddValue(scalar.ScalarValue(
|
| + results.current_page, category, 'MiB',
|
| + float(usage.get('allocator_' + category, 0.0)) / 1024**2,
|
| + description='Total memoy allocated by %s' % category))
|
| + _AddAllocatorStat('malloc')
|
| + _AddAllocatorStat('v8')
|
| + _AddAllocatorStat('blink_gc')
|
| + _AddAllocatorStat('partition_alloc')
|
| + _AddAllocatorStat('discardable')
|
| + #_AddAllocatorStat('tracing')
|
| +
|
| + def _AddMMapResults(self, latest, results):
|
| + usage = latest.GetMemoryUsage()
|
| + def _AddMMapStat(category):
|
| + results.AddValue(scalar.ScalarValue(
|
| + results.current_page, category, 'MiB',
|
| + float(usage.get('mmaps_' + category, 0.0)) / 1024**2,
|
| + description=category))
|
| + _AddMMapStat('private_dirty')
|
| + #_AddMMapStat('overall_pss')
|
| + #_AddMMapStat('native_heap')
|
| + #_AddMMapStat('java_heap')
|
|
|