From dec7c6d4228cdb5193e5e3525b9e303f003832b9 Mon Sep 17 00:00:00 2001 From: ButenkoMS Date: Wed, 29 Jun 2016 14:23:29 +0300 Subject: [PATCH 1/2] Bug fixing --- echo_client | 2 +- http_client | 44 +++++++++++++++++++++++++++------- servers/asyncio_http_server.py | 5 +++- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/echo_client b/echo_client index 3bd1b9a..1b760d1 100755 --- a/echo_client +++ b/echo_client @@ -126,7 +126,7 @@ if __name__ == '__main__': for fut in res.done: t_messages, t_latency_stats, t_min_latency, t_max_latency = \ fut.result() - messages += t_messages + messages += t_messages * args.mpr if latency_stats is None: latency_stats = t_latency_stats else: diff --git a/http_client b/http_client index b6c9bd0..7cff5bb 100755 --- a/http_client +++ b/http_client @@ -29,8 +29,12 @@ function done(summary, latency, requests) "latency_percentiles": [%s] }]] - transfer = (summary.bytes / (1024 * 1024)) / (summary.duration / 1000000) - rps = summary.requests / (summary.duration / 1000000) + transfer = 1024 * 1024 * 1024 * 1024 * 1024 + rps = transfer + if summary.duration >= 1000 then + transfer = (summary.bytes / (1024 * 1024)) / (summary.duration / 1000000) + rps = summary.requests / (summary.duration / 1000000) + end latency_percentiles = {} percentiles = {25, 50, 75, 90, 99, 99.99} @@ -41,11 +45,20 @@ function done(summary, latency, requests) latency:percentile(percentile) / 1000) ) end - - out = string.format(tpl, summary.requests, transfer, rps, - latency.min / 1000, latency.mean / 1000, - latency.max / 1000, latency.stdev / 1000, - (latency.stdev / latency.mean) * 100, + + latency_cv = 0 + if latency.mean > 0.001 then + latency_cv = (latency.stdev / latency.mean) * 100 + end + + out = string.format(tpl, + summary.requests, + transfer, rps, + latency.min / 1000, + latency.mean / 1000, + latency.max / 1000, + latency.stdev / 1000, + latency_cv, table.concat(latency_percentiles, ',')) io.stderr:write(out) @@ -74,12 +87,17 @@ if __name__ == '__main__': with tempfile.NamedTemporaryFile(mode='w+t', delete=False) as luaf: luaf.write(luascript) lua_script_path = luaf.name - + wrk = ['wrk', '--latency', '--duration={}s'.format(args.duration), '--connections={}'.format(args.concurrency), '--script={}'.format(lua_script_path), 'http://{}/{}'.format(args.addr, args.msize)] + + if 1 == args.concurrency: + wrk.append('--threads=1') + out = None + data_json = None try: wrk_run = subprocess.Popen(wrk, universal_newlines=True, stdout=subprocess.PIPE, @@ -87,11 +105,19 @@ if __name__ == '__main__': out, data_json = wrk_run.communicate() finally: os.unlink(lua_script_path) + + if data_json is not None: + data_json.replace('nan,', '0,') if args.output_format == 'json': print(data_json) else: - data = json.loads(data_json) + try: + data = json.loads(data_json) + except ValueError: + print('Wrk Out:', out, ';\nWrk Err:', data_json) + raise + data['latency_percentiles'] = '; '.join( '{}% under {}ms'.format(*v) for v in data['latency_percentiles']) diff --git a/servers/asyncio_http_server.py b/servers/asyncio_http_server.py index 63ded77..c8ea6f0 100644 --- a/servers/asyncio_http_server.py +++ b/servers/asyncio_http_server.py @@ -61,7 +61,10 @@ def __init__(self, *, loop=None): self._current_headers = None def on_url(self, url): - self._current_url = url + if self._current_url: + self._current_url += url + else: + self._current_url = url def on_header(self, name, value): self._current_headers.append((name, value)) From bda78c4d1c2d7e7fbbcbacc2355327810c9d1ecf Mon Sep 17 00:00:00 2001 From: ButenkoMS Date: Wed, 29 Jun 2016 14:25:47 +0300 Subject: [PATCH 2/2] Original GoLang server was useles: it was not more then benchmark cheating. Added real-world wersion. --- servers/goecho.go | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/servers/goecho.go b/servers/goecho.go index e4db9e0..e384390 100644 --- a/servers/goecho.go +++ b/servers/goecho.go @@ -11,6 +11,7 @@ import ( const PORT = 25000 func main() { + fmt.Printf("Started\n") server, err := net.Listen("tcp", ":"+strconv.Itoa(PORT)) if server == nil { panic("couldn't start listening: " + err.Error()) @@ -28,16 +29,55 @@ func main() { } } +//func handleConn(client net.Conn) { +// // USELES RAW COPYLESS (ORIGINAL VERSION) +// defer client.Close() +// buf := make([]byte, 102400) +// for { +// reqLen, err := client.Read(buf) +// if err != nil { +// break +// } +// if reqLen > 0 { +// client.Write(buf[:reqLen]) +// } +// } +//} + +//func handleConn(client net.Conn) { +// // COPY FROM BUFF +// defer client.Close() +// buf := make([]byte, 102400) +// for { +// reqLen, err := client.Read(buf) +// resultBuf := make([]byte, reqLen) +// copy(resultBuf, buf) +// if err != nil { +// break +// } +// if reqLen > 0 { +// //client.Write(buf[:reqLen]) +// client.Write(resultBuf) +// } +// } +//} + func handleConn(client net.Conn) { + // WITH SLICES defer client.Close() - buf := make([]byte, 102400) + buf := make([]byte, 1048576) for { reqLen, err := client.Read(buf) + resultBuf := buf[:reqLen] + buf = buf[reqLen:] + if len(buf) <= 0 { + buf = make([]byte, 1048576) + } if err != nil { break } if reqLen > 0 { - client.Write(buf[:reqLen]) + client.Write(resultBuf) } } }