diff options
author | 2017-01-31 15:08:31 -0800 | |
---|---|---|
committer | 2017-01-31 15:08:31 -0800 | |
commit | f7af2a9a0517ada19e0ce1a092ca064985f604e5 (patch) | |
tree | 72da19b09b153e5c5eb2f472f59eed2dd25bf7d4 /tools/profiling | |
parent | 02cae86b344c616c37959773c3e319a751b8f830 (diff) |
Update latency profiler to use (more appropriate) microbenchmarks
Diffstat (limited to 'tools/profiling')
-rwxr-xr-x | tools/profiling/latency_profile/run_latency_profile.sh | 61 | ||||
-rwxr-xr-x | tools/profiling/microbenchmark/bm.py | 109 |
2 files changed, 110 insertions, 60 deletions
diff --git a/tools/profiling/latency_profile/run_latency_profile.sh b/tools/profiling/latency_profile/run_latency_profile.sh index 618db202dc..7ebe308e0a 100755 --- a/tools/profiling/latency_profile/run_latency_profile.sh +++ b/tools/profiling/latency_profile/run_latency_profile.sh @@ -28,55 +28,6 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# format argument via -# $ echo '{...}' | python -mjson.tool -read -r -d '' SCENARIOS_JSON_ARG <<'EOF' -{ - "scenarios": [ - { - "benchmark_seconds": 5, - "client_config": { - "client_channels": 1, - "client_type": "SYNC_CLIENT", - "histogram_params": { - "max_possible": 60000000000.0, - "resolution": 0.01 - }, - "load_params": { - "closed_loop": {} - }, - "outstanding_rpcs_per_channel": 1, - "payload_config": { - "simple_params": { - "req_size": 0, - "resp_size": 0 - } - }, - "rpc_type": "UNARY", - "security_params": { - "server_host_override": "foo.test.google.fr", - "use_test_ca": true - } - }, - "name": "cpp_protobuf_sync_unary_ping_pong_secure", - "num_clients": 1, - "num_servers": 1, - "server_config": { - "core_limit": 1, - "security_params": { - "server_host_override": "foo.test.google.fr", - "use_test_ca": true - }, - "server_type": "SYNC_SERVER" - }, - "spawn_local_worker_count": 2, - "warmup_seconds": 5 - } - ] -} - -EOF - set -ex cd $(dirname $0)/../../.. @@ -93,14 +44,4 @@ else PYTHON=python2.7 fi -make CONFIG=basicprof -j$CPUS qps_json_driver - -mkdir -p reports -bins/basicprof/qps_json_driver --scenarios_json="$SCENARIOS_JSON_ARG" - -echo '<html><head></head><body>Latency profile for:<br/>' > reports/index.html -echo "<p><pre>${SCENARIOS_JSON_ARG}</pre></p>" >> reports/index.html -echo '<p><pre>' >> reports/index.html -$PYTHON tools/profiling/latency_profile/profile_analyzer.py \ - --source=latency_trace.txt --fmt=simple >> reports/index.html -echo '</pre></p></body></html>' >> reports/index.html +$PYTHON tools/profiling/microbenchmark/bm.py bm_fullstack diff --git a/tools/profiling/microbenchmark/bm.py b/tools/profiling/microbenchmark/bm.py new file mode 100755 index 0000000000..064bb7af1b --- /dev/null +++ b/tools/profiling/microbenchmark/bm.py @@ -0,0 +1,109 @@ +#!/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. + +import multiprocessing +import os +import subprocess +import sys + +flamegraph_dir = os.path.join(os.path.expanduser('~'), 'FlameGraph') + +def fnize(s): + out = '' + for c in s: + if c in '<>, /': + if len(out) and out[-1] == '_': continue + out += '_' + else: + out += c + return out + +os.chdir(os.path.join(os.path.dirname(sys.argv[0]), '../../..')) +if not os.path.exists('reports'): + os.makedirs('reports') + +# index html +index_html = """ +<html> +<head> +<title>Microbenchmark Results</title> +</head> +<body> +""" + +def heading(name): + global index_html + index_html += "<h1>%s</h1>\n" % name + +def link(txt, tgt): + global index_html + index_html += "<p><a href=\"%s\">%s</a></p>\n" % (tgt, txt) + +for bm_name in sys.argv[1:]: + # generate latency profiles + heading('Latency Profiles: %s' % bm_name) + subprocess.check_call( + ['make', bm_name, + 'CONFIG=basicprof', '-j', '%d' % multiprocessing.cpu_count()]) + for line in subprocess.check_output(['bins/basicprof/%s' % bm_name, + '--benchmark_list_tests']).splitlines(): + link(line, 'reports/%s.txt' % fnize(line)) + with open('reports/%s.txt' % fnize(line), 'w') as f: + f.write(subprocess.check_output(['bins/basicprof/%s' % bm_name, + '--benchmark_filter=^%s$' % line])) + f.write('\n***********************************************************\n') + f.write(subprocess.check_output([ + sys.executable, 'tools/profiling/latency_profile/profile_analyzer.py', + '--source', 'latency_trace.txt', '--fmt', 'simple'])) + + # generate flamegraphs + heading('Flamegraphs: %s' % bm_name) + subprocess.check_call( + ['make', bm_name, + 'CONFIG=mutrace', '-j', '%d' % multiprocessing.cpu_count()]) + for line in subprocess.check_output(['bins/mutrace/%s' % bm_name, + '--benchmark_list_tests']).splitlines(): + subprocess.check_call(['sudo', 'perf', 'record', '-g', '-F', '99', + 'bins/mutrace/%s' % bm_name, + '--benchmark_filter=^%s$' % line, + '--benchmark_min_time=20']) + with open('/tmp/bm.perf', 'w') as f: + f.write(subprocess.check_output(['sudo', 'perf', 'script'])) + with open('/tmp/bm.folded', 'w') as f: + f.write(subprocess.check_output([ + '%s/stackcollapse-perf.pl' % flamegraph_dir, '/tmp/bm.perf'])) + link(line, 'reports/%s.svg' % fnize(line)) + with open('reports/%s.svg' % fnize(line), 'w') as f: + f.write(subprocess.check_output([ + '%s/flamegraph.pl' % flamegraph_dir, '/tmp/bm.folded'])) + +index_html += "</body>\n</html>\n" +with open('reports/index.html', 'w') as f: + w.write(index_html) |