From 2a294af452d7f805013f93b30244734a164cb04c Mon Sep 17 00:00:00 2001 From: "rmcilroy@chromium.org" Date: Thu, 6 Feb 2014 01:41:38 +0000 Subject: [PATCH] [Telemetry]: Enable telemetry to skip the zlib Octane benchmark on low memory devices. This change also introduces a GetSystemTotalPhysicalMemory function to the platform backend to enable querying on the devices available physical memory. BUG=321039 Review URL: https://codereview.chromium.org/153733004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@249202 0039d316-1c4b-4281-b951-d872f2087c98 --- tools/perf/benchmarks/octane.py | 20 +++++--- tools/telemetry/telemetry/core/browser.py | 41 ++++++++------- tools/telemetry/telemetry/core/browser_unittest.py | 3 ++ .../core/platform/android_platform_backend.py | 6 +++ .../core/platform/mac_platform_backend.py | 3 ++ .../telemetry/core/platform/platform_backend.py | 3 ++ .../platform/proc_supporting_platform_backend.py | 5 ++ .../core/platform/win_platform_backend.py | 60 ++++++++++++---------- 8 files changed, 90 insertions(+), 51 deletions(-) diff --git a/tools/perf/benchmarks/octane.py b/tools/perf/benchmarks/octane.py index 39b3313fe1ab..689ccd919a4d 100644 --- a/tools/perf/benchmarks/octane.py +++ b/tools/perf/benchmarks/octane.py @@ -19,6 +19,7 @@ from telemetry import test from telemetry.page import page_measurement from telemetry.page import page_set +_GB = 1024 * 1024 * 1024 class _OctaneMeasurement(page_measurement.PageMeasurement): def __init__(self): @@ -28,7 +29,12 @@ class _OctaneMeasurement(page_measurement.PageMeasurement): def CustomizeBrowserOptions(self, options): power.PowerMetric.CustomizeBrowserOptions(options) + def WillNavigateToPage(self, page, tab): + if tab.browser.memory_stats['SystemTotalPhysicalMemory'] < 1 * _GB: + skipBenchmarks = '"zlib"' + else: + skipBenchmarks = '' page.script_to_evaluate_on_commit = """ var __results = []; var __real_log = window.console.log; @@ -36,7 +42,8 @@ class _OctaneMeasurement(page_measurement.PageMeasurement): __results.push(msg); __real_log.apply(this, [msg]); } - """ + skipBenchmarks = [%s] + """ % (skipBenchmarks) def DidNavigateToPage(self, page, tab): self._power_metric.Start(page, tab) @@ -56,11 +63,12 @@ class _OctaneMeasurement(page_measurement.PageMeasurement): score_and_name = output.split(': ', 2) assert len(score_and_name) == 2, \ 'Unexpected result format "%s"' % score_and_name - name = score_and_name[0] - score = int(score_and_name[1]) - results.Add(name, 'score', score, data_type='unimportant') - # Collect all test scores to compute geometric mean. - all_scores.append(score) + if 'Skipped' not in score_and_name[1]: + name = score_and_name[0] + score = int(score_and_name[1]) + results.Add(name, 'score', score, data_type='unimportant') + # Collect all test scores to compute geometric mean. + all_scores.append(score) total = statistics.GeometricMean(all_scores) results.AddSummary('Score', 'score', total, chart_name='Total') diff --git a/tools/telemetry/telemetry/core/browser.py b/tools/telemetry/telemetry/core/browser.py index 6833e8fac366..aa4297cb2b1f 100644 --- a/tools/telemetry/telemetry/core/browser.py +++ b/tools/telemetry/telemetry/core/browser.py @@ -138,30 +138,31 @@ class Browser(object): def memory_stats(self): """Returns a dict of memory statistics for the browser: { 'Browser': { - 'VM': S, - 'VMPeak': T, - 'WorkingSetSize': U, - 'WorkingSetSizePeak': V, - 'ProportionalSetSize': W, - 'PrivateDirty': X + 'VM': R, + 'VMPeak': S, + 'WorkingSetSize': T, + 'WorkingSetSizePeak': U, + 'ProportionalSetSize': V, + 'PrivateDirty': W }, 'Gpu': { - 'VM': S, - 'VMPeak': T, - 'WorkingSetSize': U, - 'WorkingSetSizePeak': V, - 'ProportionalSetSize': W, - 'PrivateDirty': X + 'VM': R, + 'VMPeak': S, + 'WorkingSetSize': T, + 'WorkingSetSizePeak': U, + 'ProportionalSetSize': V, + 'PrivateDirty': W }, 'Renderer': { - 'VM': S, - 'VMPeak': T, - 'WorkingSetSize': U, - 'WorkingSetSizePeak': V, - 'ProportionalSetSize': W, - 'PrivateDirty': X + 'VM': R, + 'VMPeak': S, + 'WorkingSetSize': T, + 'WorkingSetSizePeak': U, + 'ProportionalSetSize': V, + 'PrivateDirty': W }, - 'SystemCommitCharge': Y, + 'SystemCommitCharge': X, + 'SystemTotalPhysicalMemory': Y, 'ProcessCount': Z, } Any of the above keys may be missing on a per-platform basis. @@ -170,6 +171,8 @@ class Browser(object): result = self._GetStatsCommon(self._platform_backend.GetMemoryStats) result['SystemCommitCharge'] = \ self._platform_backend.GetSystemCommitCharge() + result['SystemTotalPhysicalMemory'] = \ + self._platform_backend.GetSystemTotalPhysicalMemory() return result @property diff --git a/tools/telemetry/telemetry/core/browser_unittest.py b/tools/telemetry/telemetry/core/browser_unittest.py index d389cf27235c..ba372415d8dd 100644 --- a/tools/telemetry/telemetry/core/browser_unittest.py +++ b/tools/telemetry/telemetry/core/browser_unittest.py @@ -147,3 +147,6 @@ class BrowserTest(unittest.TestCase): for g in info.gpu.devices: self.assertTrue(isinstance(g, gpu_device.GPUDevice)) + def testGetSystemTotalMemory(self): + b = self.CreateBrowser() + self.assertTrue(b.memory_stats['SystemTotalPhysicalMemory'] > 0) diff --git a/tools/telemetry/telemetry/core/platform/android_platform_backend.py b/tools/telemetry/telemetry/core/platform/android_platform_backend.py index 28b2ee395685..58db52b2fbd1 100644 --- a/tools/telemetry/telemetry/core/platform/android_platform_backend.py +++ b/tools/telemetry/telemetry/core/platform/android_platform_backend.py @@ -98,6 +98,12 @@ class AndroidPlatformBackend( return int(line.split()[2]) * 1024 return 0 + def GetSystemTotalPhysicalMemory(self): + for line in self._adb.RunShellCommand('dumpsys meminfo', log_result=False): + if line.startswith('Total RAM: '): + return int(line.split()[2]) * 1024 + return 0 + def GetCpuStats(self, pid): if not self._can_access_protected_file_contents: logging.warning('CPU stats cannot be retrieved on non-rooted device.') diff --git a/tools/telemetry/telemetry/core/platform/mac_platform_backend.py b/tools/telemetry/telemetry/core/platform/mac_platform_backend.py index f62c54797959..b5b0f17d8bd2 100644 --- a/tools/telemetry/telemetry/core/platform/mac_platform_backend.py +++ b/tools/telemetry/telemetry/core/platform/mac_platform_backend.py @@ -158,6 +158,9 @@ class MacPlatformBackend(posix_platform_backend.PosixPlatformBackend): return pages_active * resource.getpagesize() / 1024 return 0 + def GetSystemTotalPhysicalMemory(self): + return int(self._RunCommand(['sysctl', '-n', 'hw.memsize'])) + def PurgeUnpinnedMemory(self): # TODO(pliard): Implement this. pass diff --git a/tools/telemetry/telemetry/core/platform/platform_backend.py b/tools/telemetry/telemetry/core/platform/platform_backend.py index bcc57bdb7e2b..ffaa9cc1e0b9 100644 --- a/tools/telemetry/telemetry/core/platform/platform_backend.py +++ b/tools/telemetry/telemetry/core/platform/platform_backend.py @@ -50,6 +50,9 @@ class PlatformBackend(object): def GetSystemCommitCharge(self): raise NotImplementedError() + def GetSystemTotalPhysicalMemory(self): + raise NotImplementedError() + def GetCpuStats(self, pid): return {} diff --git a/tools/telemetry/telemetry/core/platform/proc_supporting_platform_backend.py b/tools/telemetry/telemetry/core/platform/proc_supporting_platform_backend.py index 57d3a252875a..bf41053a3b2a 100644 --- a/tools/telemetry/telemetry/core/platform/proc_supporting_platform_backend.py +++ b/tools/telemetry/telemetry/core/platform/proc_supporting_platform_backend.py @@ -25,6 +25,11 @@ class ProcSupportingPlatformBackend(platform_backend.PlatformBackend): - self._ConvertKbToByte(meminfo['Buffers']) - self._ConvertKbToByte(meminfo['Cached'])) + def GetSystemTotalPhysicalMemory(self): + meminfo_contents = self._GetFileContents('/proc/meminfo') + meminfo = self._GetProcFileDict(meminfo_contents) + return self._ConvertKbToByte(meminfo['MemTotal']) + def GetCpuStats(self, pid): stats = self._GetProcFileForPid(pid, 'stat') if not stats: diff --git a/tools/telemetry/telemetry/core/platform/win_platform_backend.py b/tools/telemetry/telemetry/core/platform/win_platform_backend.py index 164b4cb2b478..174abbda15f6 100644 --- a/tools/telemetry/telemetry/core/platform/win_platform_backend.py +++ b/tools/telemetry/telemetry/core/platform/win_platform_backend.py @@ -41,34 +41,13 @@ class WinPlatformBackend(desktop_platform_backend.DesktopPlatformBackend): raise NotImplementedError() def GetSystemCommitCharge(self): - class PerformanceInfo(ctypes.Structure): - """Struct for GetPerformanceInfo() call - http://msdn.microsoft.com/en-us/library/ms683210 - """ - _fields_ = [('size', ctypes.c_ulong), - ('CommitTotal', ctypes.c_size_t), - ('CommitLimit', ctypes.c_size_t), - ('CommitPeak', ctypes.c_size_t), - ('PhysicalTotal', ctypes.c_size_t), - ('PhysicalAvailable', ctypes.c_size_t), - ('SystemCache', ctypes.c_size_t), - ('KernelTotal', ctypes.c_size_t), - ('KernelPaged', ctypes.c_size_t), - ('KernelNonpaged', ctypes.c_size_t), - ('PageSize', ctypes.c_size_t), - ('HandleCount', ctypes.c_ulong), - ('ProcessCount', ctypes.c_ulong), - ('ThreadCount', ctypes.c_ulong)] - - def __init__(self): - self.size = ctypes.sizeof(self) - super(PerformanceInfo, self).__init__() - - performance_info = PerformanceInfo() - ctypes.windll.psapi.GetPerformanceInfo( - ctypes.byref(performance_info), performance_info.size) + performance_info = self._GetPerformanceInfo() return performance_info.CommitTotal * performance_info.PageSize / 1024 + def GetSystemTotalPhysicalMemory(self): + performance_info = self._GetPerformanceInfo() + return performance_info.PhysicalTotal * performance_info.PageSize / 1024 + def GetCpuStats(self, pid): cpu_info = self._GetWin32ProcessInfo(win32process.GetProcessTimes, pid) # Convert 100 nanosecond units to seconds @@ -190,3 +169,32 @@ class WinPlatformBackend(desktop_platform_backend.DesktopPlatformBackend): finally: if handle: win32api.CloseHandle(handle) + + def _GetPerformanceInfo(self): + class PerformanceInfo(ctypes.Structure): + """Struct for GetPerformanceInfo() call + http://msdn.microsoft.com/en-us/library/ms683210 + """ + _fields_ = [('size', ctypes.c_ulong), + ('CommitTotal', ctypes.c_size_t), + ('CommitLimit', ctypes.c_size_t), + ('CommitPeak', ctypes.c_size_t), + ('PhysicalTotal', ctypes.c_size_t), + ('PhysicalAvailable', ctypes.c_size_t), + ('SystemCache', ctypes.c_size_t), + ('KernelTotal', ctypes.c_size_t), + ('KernelPaged', ctypes.c_size_t), + ('KernelNonpaged', ctypes.c_size_t), + ('PageSize', ctypes.c_size_t), + ('HandleCount', ctypes.c_ulong), + ('ProcessCount', ctypes.c_ulong), + ('ThreadCount', ctypes.c_ulong)] + + def __init__(self): + self.size = ctypes.sizeof(self) + super(PerformanceInfo, self).__init__() + + performance_info = PerformanceInfo() + ctypes.windll.psapi.GetPerformanceInfo( + ctypes.byref(performance_info), performance_info.size) + return performance_info -- 2.11.4.GIT