aboutsummaryrefslogtreecommitdiff
path: root/src/benchmarks/httpd.py
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fl.fischer@fau.de>2019-04-02 12:01:41 +0200
committerFlorian Fischer <florian.fl.fischer@fau.de>2019-04-02 12:01:41 +0200
commit5bcc88fb9131884edd545af1f085c043cf34166a (patch)
tree090b05e1d97ab44e15cc82903707701b6f03ed60 /src/benchmarks/httpd.py
parent5f477e0561b613038888a0fd7169f9b6dc11b118 (diff)
downloadallocbench-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.py87
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()