summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrmcilroy@chromium.org <rmcilroy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-06 01:41:38 +0000
committerrmcilroy@chromium.org <rmcilroy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-06 01:41:38 +0000
commit2a294af452d7f805013f93b30244734a164cb04c (patch)
tree47994d90119189261002bf5a23a212b5a6e77eaf
parentd2f46b1d31044a6cb76b2a4695cadfd8ed786d2f (diff)
downloadchromium_src-2a294af452d7f805013f93b30244734a164cb04c.zip
chromium_src-2a294af452d7f805013f93b30244734a164cb04c.tar.gz
chromium_src-2a294af452d7f805013f93b30244734a164cb04c.tar.bz2
[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
-rw-r--r--tools/perf/benchmarks/octane.py20
-rw-r--r--tools/telemetry/telemetry/core/browser.py41
-rw-r--r--tools/telemetry/telemetry/core/browser_unittest.py3
-rw-r--r--tools/telemetry/telemetry/core/platform/android_platform_backend.py6
-rw-r--r--tools/telemetry/telemetry/core/platform/mac_platform_backend.py3
-rw-r--r--tools/telemetry/telemetry/core/platform/platform_backend.py3
-rw-r--r--tools/telemetry/telemetry/core/platform/proc_supporting_platform_backend.py5
-rw-r--r--tools/telemetry/telemetry/core/platform/win_platform_backend.py60
8 files changed, 90 insertions, 51 deletions
diff --git a/tools/perf/benchmarks/octane.py b/tools/perf/benchmarks/octane.py
index 39b3313..689ccd9 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 6833e8f..aa4297c 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 d389cf2..ba37241 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 28b2ee3..58db52b 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 f62c547..b5b0f17 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 bcc57bd..ffaa9cc 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 57d3a25..bf41053 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 164b4cb..174abbd 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