mirror of https://github.com/grpc/grpc.git
parent
c7676a3d00
commit
ab69ea3f9d
5 changed files with 250 additions and 153 deletions
@ -0,0 +1,68 @@ |
||||
#!/usr/bin/env python2.7 |
||||
# Copyright 2017, Google Inc. |
||||
# All rights reserved. |
||||
# |
||||
# Redistribution and use in source and binary forms, with or without |
||||
# modification, are permitted provided that the following conditions are |
||||
# met: |
||||
# |
||||
# * Redistributions of source code must retain the above copyright |
||||
# notice, this list of conditions and the following disclaimer. |
||||
# * Redistributions in binary form must reproduce the above |
||||
# copyright notice, this list of conditions and the following disclaimer |
||||
# in the documentation and/or other materials provided with the |
||||
# distribution. |
||||
# * Neither the name of Google Inc. nor the names of its |
||||
# contributors may be used to endorse or promote products derived from |
||||
# this software without specific prior written permission. |
||||
# |
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
### Python utility to build opt and counters benchmarks """ |
||||
|
||||
import bm_constants |
||||
|
||||
import argparse |
||||
import subprocess |
||||
import multiprocessing |
||||
import os |
||||
import shutil |
||||
|
||||
def _args(): |
||||
argp = argparse.ArgumentParser(description='Builds microbenchmarks') |
||||
argp.add_argument('-b', '--benchmarks', nargs='+', choices=bm_constants._AVAILABLE_BENCHMARK_TESTS, default=bm_constants._AVAILABLE_BENCHMARK_TESTS) |
||||
argp.add_argument('-j', '--jobs', type=int, default=multiprocessing.cpu_count()) |
||||
argp.add_argument('-n', '--name', type=str, help='Unique name of this build') |
||||
return argp.parse_args() |
||||
|
||||
def _make_cmd(cfg, jobs, benchmarks): |
||||
return ['make'] + benchmarks + [ |
||||
'CONFIG=%s' % cfg, '-j', '%d' % jobs] |
||||
|
||||
def build(name, jobs, benchmarks): |
||||
shutil.rmtree('bm_diff_%s' % name, ignore_errors=True) |
||||
subprocess.check_call(['git', 'submodule', 'update']) |
||||
try: |
||||
subprocess.check_call(_make_cmd('opt', jobs, benchmarks)) |
||||
subprocess.check_call(_make_cmd('counters', jobs, benchmarks)) |
||||
except subprocess.CalledProcessError, e: |
||||
subprocess.check_call(['make', 'clean']) |
||||
subprocess.check_call(_make_cmd('opt', jobs, benchmarks)) |
||||
subprocess.check_call(_make_cmd('counters', jobs, benchmarks)) |
||||
os.rename('bins', 'bm_diff_%s' % name, ) |
||||
|
||||
if __name__ == '__main__': |
||||
args = _args() |
||||
build(args.name, args.jobs, args.benchmarks) |
||||
|
||||
|
@ -0,0 +1,56 @@ |
||||
#!/usr/bin/env python2.7 |
||||
# Copyright 2017, Google Inc. |
||||
# All rights reserved. |
||||
# |
||||
# Redistribution and use in source and binary forms, with or without |
||||
# modification, are permitted provided that the following conditions are |
||||
# met: |
||||
# |
||||
# * Redistributions of source code must retain the above copyright |
||||
# notice, this list of conditions and the following disclaimer. |
||||
# * Redistributions in binary form must reproduce the above |
||||
# copyright notice, this list of conditions and the following disclaimer |
||||
# in the documentation and/or other materials provided with the |
||||
# distribution. |
||||
# * Neither the name of Google Inc. nor the names of its |
||||
# contributors may be used to endorse or promote products derived from |
||||
# this software without specific prior written permission. |
||||
# |
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
### Configurable constants for the bm_*.py family """ |
||||
|
||||
_AVAILABLE_BENCHMARK_TESTS = ['bm_fullstack_unary_ping_pong', |
||||
'bm_fullstack_streaming_ping_pong', |
||||
'bm_fullstack_streaming_pump', |
||||
'bm_closure', |
||||
'bm_cq', |
||||
'bm_call_create', |
||||
'bm_error', |
||||
'bm_chttp2_hpack', |
||||
'bm_chttp2_transport', |
||||
'bm_pollset', |
||||
'bm_metadata', |
||||
'bm_fullstack_trickle'] |
||||
|
||||
|
||||
_INTERESTING = ( |
||||
'cpu_time', |
||||
'real_time', |
||||
'locks_per_iteration', |
||||
'allocs_per_iteration', |
||||
'writes_per_iteration', |
||||
'atm_cas_per_iteration', |
||||
'atm_add_per_iteration', |
||||
'nows_per_iteration', |
||||
) |
@ -0,0 +1,77 @@ |
||||
#!/usr/bin/env python2.7 |
||||
# Copyright 2017, Google Inc. |
||||
# All rights reserved. |
||||
# |
||||
# Redistribution and use in source and binary forms, with or without |
||||
# modification, are permitted provided that the following conditions are |
||||
# met: |
||||
# |
||||
# * Redistributions of source code must retain the above copyright |
||||
# notice, this list of conditions and the following disclaimer. |
||||
# * Redistributions in binary form must reproduce the above |
||||
# copyright notice, this list of conditions and the following disclaimer |
||||
# in the documentation and/or other materials provided with the |
||||
# distribution. |
||||
# * Neither the name of Google Inc. nor the names of its |
||||
# contributors may be used to endorse or promote products derived from |
||||
# this software without specific prior written permission. |
||||
# |
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
### Python utility to run opt and counters benchmarks and save json output """ |
||||
|
||||
import bm_constants |
||||
|
||||
import argparse |
||||
import multiprocessing |
||||
import random |
||||
import itertools |
||||
import sys |
||||
import os |
||||
|
||||
sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), '..', '..', 'run_tests', 'python_utils')) |
||||
import jobset |
||||
|
||||
def _args(): |
||||
argp = argparse.ArgumentParser(description='Runs microbenchmarks') |
||||
argp.add_argument('-b', '--benchmarks', nargs='+', choices=bm_constants._AVAILABLE_BENCHMARK_TESTS, default=bm_constants._AVAILABLE_BENCHMARK_TESTS) |
||||
argp.add_argument('-j', '--jobs', type=int, default=multiprocessing.cpu_count()) |
||||
argp.add_argument('-n', '--name', type=str, help='Unique name of this build') |
||||
argp.add_argument('-r', '--repetitions', type=int, default=1) |
||||
argp.add_argument('-l', '--loops', type=int, default=20) |
||||
return argp.parse_args() |
||||
|
||||
def _collect_bm_data(bm, cfg, name, reps, idx): |
||||
cmd = ['bm_diff_%s/%s/%s' % (name, cfg, bm), |
||||
'--benchmark_out=%s.%s.%s.%d.json' % (bm, cfg, name, idx), |
||||
'--benchmark_out_format=json', |
||||
'--benchmark_repetitions=%d' % (reps) |
||||
] |
||||
return jobset.JobSpec(cmd, shortname='%s %s %s %d/%d' % (bm, cfg, name, idx+1, args.loops), |
||||
verbose_success=True, timeout_seconds=None) |
||||
|
||||
def _run_bms(benchmarks, name, loops, reps): |
||||
jobs = [] |
||||
for loop in range(0, loops): |
||||
jobs.extend(x for x in itertools.chain( |
||||
(_collect_bm_data(bm, 'opt', name, reps, loop) for bm in benchmarks), |
||||
(_collect_bm_data(bm, 'counters', name, reps, loop) for bm in benchmarks), |
||||
)) |
||||
random.shuffle(jobs, random.SystemRandom().random) |
||||
|
||||
jobset.run(jobs, maxjobs=args.jobs) |
||||
|
||||
if __name__ == '__main__': |
||||
args = _args() |
||||
assert args.name |
||||
_run_bms(args.benchmarks, args.name, args.loops, args.repetitions) |
Loading…
Reference in new issue