diff --git a/python/tools/benchmark.py b/python/tools/benchmark.py index 401b2cd077d9d42b8dba23521f58faeef7989bd3..209c05ea7a9c3012c74baa8245a32777bec3479c 100755 --- a/python/tools/benchmark.py +++ b/python/tools/benchmark.py @@ -14,38 +14,6 @@ from opendht import * def random_hash(): return PyInfoHash(''.join(random.SystemRandom().choice(string.hexdigits) for _ in range(40)).encode()) -parser = argparse.ArgumentParser(description='Create a dummy network interface for testing') -parser.add_argument('-i', '--ifname', help='interface name', default='ethdht') -parser.add_argument('-n', '--node-num', help='number of dht nodes to run', type=int, default=32) -parser.add_argument('-v', '--virtual-locs', help='number of virtual locations (node clusters)', type=int, default=8) -parser.add_argument('-l', '--loss', help='simulated cluster packet loss (percent)', type=int, default=0) -parser.add_argument('-d', '--delay', help='simulated cluster latency (ms)', type=int, default=0) -parser.add_argument('-no4', '--disable-ipv4', help='Enable IPv4', action="store_true") -parser.add_argument('-no6', '--disable-ipv6', help='Enable IPv6', action="store_true") - -args = parser.parse_args() - -clusters = min(args.virtual_locs, args.node_num) -node_per_loc = int(args.node_num / clusters) - -print("Launching", args.node_num, "nodes (", clusters, "clusters of", node_per_loc, "nodes)") - -if args.virtual_locs > 1: - cmd = ["/usr/bin/sudo", "python3", "dummy_if.py", "-i", args.ifname, "-n", str(clusters), '-l', str(args.loss), '-d', str(args.delay)] - if not args.disable_ipv4: - cmd.append('-4') - if not args.disable_ipv6: - cmd.append('-6') - print(cmd) - p = subprocess.Popen(cmd, stdout=subprocess.PIPE) - output, err = p.communicate() - print(output.decode()) - -bootstrap = DhtNetwork(iface='br'+args.ifname) -bootstrap.resize(1) - -procs = [None for _ in range(clusters)] - def start_cluster(i): global procs cmd = ["python3", "dhtnetwork.py", "-n", str(node_per_loc), '-I', args.ifname+str(i)+'.1'] @@ -72,9 +40,10 @@ def replace_cluster(): stop_cluster(n) start_cluster(n) -try: - for i in range(clusters): - start_cluster(i) +def getsTimesTest(): + """TODO: Docstring for + + """ plt.ion() @@ -95,7 +64,7 @@ try: print("found", v) def donecb(ok, nodes): - global lock, done, times + nonlocal lock, done, times t = time.time()-start with lock: if not ok: @@ -105,7 +74,7 @@ try: lock.notify() def update_plot(): - global lines + nonlocal lines while lines: l = lines.pop() l.remove() @@ -133,20 +102,70 @@ try: update_plot() print("Took", np.sum(times), "mean", np.mean(times), "std", np.std(times), "min", np.min(times), "max", np.max(times)) + print('GET calls timings benchmark test : DONE. ' \ + 'Close Matplotlib window for terminating the program.') plt.ioff() plt.show() -except Exception as e: - print(e) -finally: - for i in range(clusters): - if procs[i]: - procs[i].send_signal(signal.SIGINT); - bootstrap.resize(0) - subprocess.call(["/usr/bin/sudo", "python3", "dummy_if.py", "-i", args.ifname, "-n", str(clusters), "-r"]) - for i in range(clusters): - if procs[i]: - try: - procs[i].wait() - procs[i].release() - except Exception as e: - print(e) + +if __name__ == '__main__': + + parser = argparse.ArgumentParser(description='Create a dummy network interface for testing') + parser.add_argument('-i', '--ifname', help='interface name', default='ethdht') + parser.add_argument('-n', '--node-num', help='number of dht nodes to run', type=int, default=32) + parser.add_argument('-v', '--virtual-locs', help='number of virtual locations (node clusters)', type=int, default=8) + parser.add_argument('-l', '--loss', help='simulated cluster packet loss (percent)', type=int, default=0) + parser.add_argument('-d', '--delay', help='simulated cluster latency (ms)', type=int, default=0) + parser.add_argument('-no4', '--disable-ipv4', help='Enable IPv4', action="store_true") + parser.add_argument('-no6', '--disable-ipv6', help='Enable IPv6', action="store_true") + parser.add_argument('--gets', action='store_true', help='Launches get calls timings benchmark test.', default=0) + + args = parser.parse_args() + + if args.gets < 1: + print('No test specified... Quitting.', file=sys.stderr) + sys.exit(1) + + clusters = min(args.virtual_locs, args.node_num) + node_per_loc = int(args.node_num / clusters) + + print("Launching", args.node_num, "nodes (", clusters, "clusters of", node_per_loc, "nodes)") + + if args.virtual_locs > 1: + cmd = ["/usr/bin/sudo", "python3", "dummy_if.py", "-i", args.ifname, "-n", str(clusters), '-l', str(args.loss), '-d', str(args.delay)] + if not args.disable_ipv4: + cmd.append('-4') + if not args.disable_ipv6: + cmd.append('-6') + print(cmd) + p = subprocess.Popen(cmd, stdout=subprocess.PIPE) + output, err = p.communicate() + print(output.decode()) + + bootstrap = DhtNetwork(iface='br'+args.ifname) + bootstrap.resize(1) + + procs = [None for _ in range(clusters)] + + try: + for i in range(clusters): + start_cluster(i) + + if args.gets: + getsTimesTest() + + except Exception as e: + print(e) + finally: + for i in range(clusters): + if procs[i]: + procs[i].send_signal(signal.SIGINT); + bootstrap.resize(0) + print('Removing dummy interfaces...') + subprocess.call(["/usr/bin/sudo", "python3", "dummy_if.py", "-i", args.ifname, "-n", str(clusters), "-r"]) + for i in range(clusters): + if procs[i]: + try: + procs[i].wait() + procs[i].release() + except Exception as e: + print(e)