diff --git a/test/bench/.gitignore b/test/bench/.gitignore new file mode 100644 index 000000000..1a06816d8 --- /dev/null +++ b/test/bench/.gitignore @@ -0,0 +1 @@ +results diff --git a/test/bench/README.md b/test/bench/README.md new file mode 100644 index 000000000..05741c07a --- /dev/null +++ b/test/bench/README.md @@ -0,0 +1,56 @@ + +This directory contains a set of tools for benchmarking and profiling mitmproxy. +At the moment, this is simply to give developers a quick way to see the impact +of their work. Eventually, this might grow into a performance dashboard with +historical data, so we can track performance over time. + + +# Setup + +Install the following tools: + + go get -u github.com/rakyll/hey + go get github.com/cortesi/devd/cmd/devd + +You may also want to install snakeviz to make viewing profiles easier: + + pip install snakeviz + +In one window, run the devd server: + + ./backend + + +# Running tests + +Each run consists of two files - a mitproxy invocation, and a traffic generator. +Make sure the backend is started, then run the proxy: + + ./simple.mitmproxy + +Now run the traffic generator: + + ./simple.traffic + +After the run is done, quit the proxy with ctrl-c. + + +# Reading results + +Results are placed in the ./results directory. You should see two files - a +performance log from **hey**, and a profile. You can view the profile like so: + + snakeviz ./results/simple.prof + + + + + + + + + + + + + diff --git a/test/bench/backend b/test/bench/backend new file mode 100755 index 000000000..12a05d701 --- /dev/null +++ b/test/bench/backend @@ -0,0 +1,3 @@ +#!/bin/sh + +devd -p 10001 . \ No newline at end of file diff --git a/test/bench/profiler.py b/test/bench/profiler.py new file mode 100644 index 000000000..9072e17d4 --- /dev/null +++ b/test/bench/profiler.py @@ -0,0 +1,25 @@ +import cProfile +from mitmproxy import ctx + + +class Profile: + """ + A simple profiler addon. + """ + def __init__(self): + self.pr = cProfile.Profile() + + def load(self, loader): + loader.add_option( + "profile_path", + str, + "/tmp/profile", + "Destination for the run profile, saved at exit" + ) + self.pr.enable() + + def done(self): + self.pr.dump_stats(ctx.options.profile_path) + + +addons = [Profile()] \ No newline at end of file diff --git a/test/bench/simple.mitmproxy b/test/bench/simple.mitmproxy new file mode 100755 index 000000000..9de329815 --- /dev/null +++ b/test/bench/simple.mitmproxy @@ -0,0 +1,5 @@ +#!/bin/sh + +mkdir -p results +mitmdump -p 10002 --mode reverse:http://devd.io:10001 \ + -s ./profiler.py --set profile_path=./results/simple.prof diff --git a/test/bench/simple.traffic b/test/bench/simple.traffic new file mode 100755 index 000000000..08200e050 --- /dev/null +++ b/test/bench/simple.traffic @@ -0,0 +1,3 @@ +#!/bin/sh + +hey -disable-keepalive http://localhost:10002/profiler.py | tee ./results/simple.perf \ No newline at end of file