| # Copyright (c) 2009 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import logging |
| |
| from autotest_lib.client.bin import test |
| from autotest_lib.client.common_lib import error, utils |
| from autotest_lib.client.cros import service_stopper |
| |
| class hardware_MemoryThroughput(test.test): |
| """Autotest for measuring memory throughput. |
| |
| This uses mem_bw with different parameters to measure memory and cache |
| throughput. |
| |
| Private Attributes: |
| _results: dict containing keyvals with throughput measurements |
| _services: service_stopper.ServiceStopper object |
| """ |
| version = 1 |
| |
| def _run_benchmarks(self, test, warmup, num_iterations, parallel, sizes): |
| """Run the benchmark. |
| |
| This runs the bw_mem benchmark from lmbench 3 and fills out results. |
| Args: |
| test: string containing either rd, rdwr, cp, bzero, or bcopy |
| warmup: integer amount of time to spend warming up in microseconds. |
| num_iterations: integer number of times to run the benchmark on each |
| size. |
| parallel: integer number of instances to run in parallel |
| sizes: list of integer sizes in bytes to run |
| """ |
| r = {} |
| |
| for size in sizes: |
| cmd = 'bw_mem -P %d -W %d -N %d %d %s 2>&1' % (parallel, warmup, |
| num_iterations, |
| size, test) |
| logging.debug('cmd: %s', cmd) |
| out = utils.system_output(cmd) |
| logging.debug('Output: %s', out) |
| |
| lines = out.splitlines() |
| if len(lines) != 1: |
| raise error.TestFail('invalid amount of output from bw_mem') |
| |
| s = lines[0].split() |
| if len(s) == 2: |
| bw = float(s[1]) |
| if bw <= 0: |
| raise error.TestFail('invalid throughput %f' % bw) |
| key = ('MB_per_second_' + test + '-' + |
| str(parallel) + '-thread-' + |
| str(size / 1024) + 'KB') |
| self._results[key] = bw |
| else: |
| raise error.TestFail('invalid output line %s' % lines[0]) |
| |
| |
| def initialize(self): |
| super(hardware_MemoryThroughput, self).initialize() |
| self._results = {} |
| stop = [ 'ui' ] |
| stop.extend(service_stopper.ServiceStopper.POWER_DRAW_SERVICES) |
| self._services = service_stopper.ServiceStopper(stop) |
| self._services.stop_services() |
| |
| |
| def run_once(self, test='bcopy', warmup=100, num_iterations=20, |
| parallel=1, sizes= [ 4096, 192 * 1024, 32 * 1024 * 1024 ]): |
| self._run_benchmarks(test, warmup, num_iterations, parallel, |
| sizes) |
| self.write_perf_keyval(self._results) |
| |
| |
| def cleanup(self): |
| self._services.restore_services() |
| super(hardware_MemoryThroughput, self).cleanup() |