diff options
| author | Florian Fischer <florian.fl.fischer@fau.de> | 2019-04-02 12:01:41 +0200 |
|---|---|---|
| committer | Florian Fischer <florian.fl.fischer@fau.de> | 2019-04-02 12:01:41 +0200 |
| commit | 5bcc88fb9131884edd545af1f085c043cf34166a (patch) | |
| tree | 090b05e1d97ab44e15cc82903707701b6f03ed60 /src/benchmarks/httpd.py | |
| parent | 5f477e0561b613038888a0fd7169f9b6dc11b118 (diff) | |
| download | allocbench-5bcc88fb9131884edd545af1f085c043cf34166a.tar.gz allocbench-5bcc88fb9131884edd545af1f085c043cf34166a.zip | |
add real simple webserver benchmark using nginx and ab
Diffstat (limited to 'src/benchmarks/httpd.py')
| -rw-r--r-- | src/benchmarks/httpd.py | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/benchmarks/httpd.py b/src/benchmarks/httpd.py new file mode 100644 index 0000000..e52dc16 --- /dev/null +++ b/src/benchmarks/httpd.py @@ -0,0 +1,87 @@ +import atexit +import matplotlib.pyplot as plt +import numpy as np +import re +import shutil +import subprocess +from subprocess import PIPE +import sys +from time import sleep + +from src.globalvars import builddir +from src.benchmark import Benchmark +from src.util import * + +server_cmd = "{} -c {}/benchmarks/httpd/nginx/nginx.conf".format(shutil.which("nginx"), builddir).split() + + +class Benchmark_HTTPD(Benchmark): + def __init__(self): + self.name = "httpd" + self.descrition = """TODO""" + + self.args = {"nthreads": Benchmark.scale_threads_for_cpus(25)} + self.cmd = "ab -n 10000 -c {nthreads} localhost:8080/index.html" + self.measure_cmd = "" + self.server_benchmark = True + + self.requirements = ["nginx", "ab"] + + atexit.register(self.terminate_server) + + super().__init__() + + def terminate_server(self): + ret = subprocess.run(server_cmd + ["-s", "stop"], stdout=PIPE, + stderr=PIPE, universal_newlines=True) + + if ret.returncode != 0: + print_debug("Stdout:", ret.stdout) + print_debug("Stderr:", ret.stderr) + raise Exception("Stopping {} failed with {}".format(server_cmd[0], ret.returncode)) + + def preallocator_hook(self, allocator, run, env, verbose): + actual_cmd = allocator[1]["cmd_prefix"].split() + server_cmd + print_info("Starting server with:", actual_cmd) + + ret = subprocess.run(actual_cmd, stdout=PIPE, stderr=PIPE, env=env, + universal_newlines=True) + if ret.returncode != 0: + print_debug("Stdout:", ret.stdout) + print_debug("Stderr:", ret.stderr) + raise Exception("Starting {} for {} failed with {}".format(server_cmd[0], allocator[0], ret.returncode)) + + + def postallocator_hook(self, allocator, run, verbose): + self.terminate_server() + + def process_output(self, result, stdout, stderr, allocator, perm, verbose): + result["time"] = re.search("Time taken for tests:\s*(\d*\.\d*) seconds", stdout).group(1) + result["requests"] = re.search("Requests per second:\s*(\d*\.\d*) .*", stdout).group(1) + + # with open("/proc/"+str(self.server.pid)+"/status", "r") as f: + # for l in f.readlines(): + # if l.startswith("VmHWM:"): + # result["rssmax"] = int(l.replace("VmHWM:", "").strip().split()[0]) + # break + + def summary(self): + allocators = self.results["allocators"] + args = self.results["args"] + + # linear plot + self.plot_single_arg("{requests}", + xlabel='"threads"', + ylabel='"requests/s"', + title='"ab -n 10000 -c threads"') + + # linear plot + ref_alloc = list(allocators)[0] + self.plot_single_arg("{requests}", + xlabel='"threads"', + ylabel='"requests/s scaled at " + scale', + title='"ab -n 10000 -c threads (normalized)"', + filepostfix="norm", + scale=ref_alloc) + +httpd = Benchmark_HTTPD() |
