You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
245 lines
7.0 KiB
245 lines
7.0 KiB
#!/usr/bin/python2 |
|
# |
|
# Copyright 2010 Google Inc. All Rights Reserved. |
|
"""Script to run ChromeOS benchmarks |
|
|
|
Inputs: |
|
chromeos_root |
|
board |
|
[chromeos/cpu/<benchname>| |
|
chromeos/browser/[pagecycler|sunspider]| |
|
chromeos/startup] |
|
hostname/IP of Chromeos machine |
|
|
|
chromeos/cpu/<benchname> |
|
- Read run script rules from bench.mk perflab-bin, copy benchmark to |
|
host, run |
|
and return results. |
|
|
|
chromeos/startup |
|
- Re-image host with image in perflab-bin |
|
- Call run_tests to run startup test, gather results. |
|
- Restore host back to what it was. |
|
|
|
chromeos/browser/* |
|
- Call build_chromebrowser to build image with new browser |
|
- Copy image to perflab-bin |
|
|
|
""" |
|
|
|
from __future__ import print_function |
|
|
|
__author__ = 'bjanakiraman@google.com (Bhaskar Janakiraman)' |
|
|
|
import argparse |
|
import os |
|
import re |
|
import sys |
|
|
|
import image_chromeos |
|
import run_tests |
|
from cros_utils import command_executer |
|
from cros_utils import logger |
|
|
|
# pylint: disable=anomalous-backslash-in-string |
|
|
|
KNOWN_BENCHMARKS = [ |
|
'chromeos/startup', 'chromeos/browser/pagecycler', |
|
'chromeos/browser/sunspider', 'chromeos/browser/v8bench', |
|
'chromeos/cpu/bikjmp' |
|
] |
|
|
|
name_map = { |
|
'pagecycler': 'Page', |
|
'sunspider': 'SunSpider', |
|
'v8bench': 'V8Bench', |
|
'startup': 'BootPerfServer' |
|
} |
|
|
|
# Run command template |
|
|
|
# Common initializations |
|
cmd_executer = command_executer.GetCommandExecuter() |
|
|
|
|
|
def Usage(parser, message): |
|
print('ERROR: %s' % message) |
|
parser.print_help() |
|
sys.exit(0) |
|
|
|
|
|
def RunBrowserBenchmark(chromeos_root, board, bench, machine): |
|
"""Run browser benchmarks. |
|
|
|
Args: |
|
chromeos_root: ChromeOS src dir |
|
board: Board being tested |
|
bench: Name of benchmark (chromeos/browser/*) |
|
machine: name of chromeos machine |
|
""" |
|
benchname = re.split('/', bench)[2] |
|
benchname = name_map[benchname] |
|
ret = run_tests.RunRemoteTests(chromeos_root, machine, board, benchname) |
|
return ret |
|
|
|
|
|
def RunStartupBenchmark(chromeos_root, board, machine): |
|
"""Run browser benchmarks. |
|
|
|
Args: |
|
chromeos_root: ChromeOS src dir |
|
board: Board being tested |
|
machine: name of chromeos machine |
|
""" |
|
benchname = 'startup' |
|
benchname = name_map[benchname] |
|
ret = run_tests.RunRemoteTests(chromeos_root, machine, board, benchname) |
|
return ret |
|
|
|
|
|
def RunCpuBenchmark(chromeos_root, bench, workdir, machine): |
|
"""Run CPU benchmark. |
|
|
|
Args: |
|
chromeos_root: ChromeOS src dir |
|
bench: Name of benchmark |
|
workdir: directory containing benchmark directory |
|
machine: name of chromeos machine |
|
|
|
Returns: |
|
status: 0 on success |
|
""" |
|
|
|
benchname = re.split('/', bench)[2] |
|
benchdir = '%s/%s' % (workdir, benchname) |
|
|
|
# Delete any existing run directories on machine. |
|
# Since this has exclusive access to the machine, |
|
# we do not worry about duplicates. |
|
args = 'rm -rf /tmp/%s' % benchname |
|
retv = cmd_executer.CrosRunCommand(args, |
|
chromeos_root=chromeos_root, |
|
machine=machine) |
|
if retv: |
|
return retv |
|
|
|
# Copy benchmark directory. |
|
retv = cmd_executer.CopyFiles(benchdir, |
|
'/tmp/' + benchname, |
|
chromeos_root=chromeos_root, |
|
dest_machine=machine, |
|
dest_cros=True) |
|
if retv: |
|
return retv |
|
|
|
# Parse bench.mk to extract run flags. |
|
|
|
benchmk_file = open('%s/bench.mk' % benchdir, 'r') |
|
for line in benchmk_file: |
|
line.rstrip() |
|
if re.match('^run_cmd', line): |
|
line = re.sub('^run_cmd.*\${PERFLAB_PATH}', './out', line) |
|
line = re.sub('\${PERFLAB_INPUT}', './data', line) |
|
run_cmd = line |
|
break |
|
|
|
# Execute on remote machine |
|
# Capture output and process it. |
|
sshargs = "'cd /tmp/%s;" % benchname |
|
sshargs += "time -p %s'" % run_cmd |
|
cmd_executer.CrosRunCommand(sshargs, |
|
chromeos_root=chromeos_root, |
|
machine=machine) |
|
|
|
return retv |
|
|
|
|
|
def Main(argv): |
|
"""Build ChromeOS.""" |
|
# Common initializations |
|
|
|
parser = argparse.ArgumentParser() |
|
parser.add_argument('-c', |
|
'--chromeos_root', |
|
dest='chromeos_root', |
|
help='Target directory for ChromeOS installation.') |
|
parser.add_argument('-m', |
|
'--machine', |
|
dest='machine', |
|
help='The chromeos host machine.') |
|
parser.add_argument('--workdir', |
|
dest='workdir', |
|
default='./perflab-bin', |
|
help='Work directory for perflab outputs.') |
|
parser.add_argument('--board', |
|
dest='board', |
|
help='ChromeOS target board, e.g. x86-generic') |
|
parser.add_argumen('args', margs='+', help='Benchmarks to run.') |
|
|
|
options = parser.parse_args(argv[1:]) |
|
|
|
# validate args |
|
for arg in options.args: |
|
if arg not in KNOWN_BENCHMARKS: |
|
logger.GetLogger().LogFatal('Bad benchmark %s specified' % arg) |
|
|
|
if options.chromeos_root is None: |
|
Usage(parser, '--chromeos_root must be set') |
|
|
|
if options.board is None: |
|
Usage(parser, '--board must be set') |
|
|
|
if options.machine is None: |
|
Usage(parser, '--machine must be set') |
|
|
|
found_err = 0 |
|
retv = 0 |
|
for arg in options.args: |
|
# CPU benchmarks |
|
comps = re.split('/', arg) |
|
if re.match('chromeos/cpu', arg): |
|
benchname = comps[2] |
|
print('RUNNING %s' % benchname) |
|
retv = RunCpuBenchmark(options.chromeos_root, arg, options.workdir, |
|
options.machine) |
|
if not found_err: |
|
found_err = retv |
|
elif re.match('chromeos/startup', arg): |
|
benchname = comps[1] |
|
image_args = [ |
|
os.path.dirname(os.path.abspath(__file__)) + '/image_chromeos.py', |
|
'--chromeos_root=' + options.chromeos_root, |
|
'--remote=' + options.machine, '--image=' + options.workdir + '/' + |
|
benchname + '/chromiumos_image.bin' |
|
] |
|
logger.GetLogger().LogOutput('Reimaging machine %s' % options.machine) |
|
image_chromeos.Main(image_args) |
|
|
|
logger.GetLogger().LogOutput('Running %s' % arg) |
|
retv = RunStartupBenchmark(options.chromeos_root, options.board, |
|
options.machine) |
|
if not found_err: |
|
found_err = retv |
|
elif re.match('chromeos/browser', arg): |
|
benchname = comps[2] |
|
image_args = [ |
|
os.path.dirname(os.path.abspath(__file__)) + '/image_chromeos.py', |
|
'--chromeos_root=' + options.chromeos_root, |
|
'--remote=' + options.machine, '--image=' + options.workdir + '/' + |
|
benchname + '/chromiumos_image.bin' |
|
] |
|
logger.GetLogger().LogOutput('Reimaging machine %s' % options.machine) |
|
image_chromeos.Main(image_args) |
|
|
|
logger.GetLogger().LogOutput('Running %s' % arg) |
|
retv = RunBrowserBenchmark(options.chromeos_root, options.board, arg, |
|
options.machine) |
|
if not found_err: |
|
found_err = retv |
|
|
|
return found_err |
|
|
|
|
|
if __name__ == '__main__': |
|
retval = Main(sys.argv) |
|
sys.exit(retval)
|
|
|