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