import os import matplotlib.pyplot as plt from config import markers, colors import util experiments = [f for f in os.listdir('../data') if f.startswith('memcached_qps_scan') and len(os.listdir(os.path.join('../data', f))) > 0] def parse_memcached_output(s): lines = s.split('\n') qps = int(float(lines[6].split(' ')[3])) latency_99th = int(float(lines[1].split(' ')[-1])) return (qps, latency_99th) def extract_qps_latency_exp(exp): ret = ([], [], []) for f in os.listdir(os.path.join('../data/', exp)): if not f[0].isdigit(): continue if f.split('_')[-1].startswith('aux'): continue ((qps_mean, latency_99th_mean), (qps_stddev, latency_99th_stddev)) = \ util.extract_exp_avg_stddev(exp, f.replace('.txt', ''), parse_memcached_output) ret[0].append(qps_mean) ret[1].append(latency_99th_mean) # We don't care about stddev in qps -- qps is the x axis ret[2].append(latency_99th_stddev) return ret def extract_qps_latency(threads, include_caladan = False): ret = dict() for exp in experiments: split = exp.split('.') if split[-2] != ('t' + str(threads)): continue if split[-3] == 'caladan' and not include_caladan: continue name = split[-3] if name[0].isdigit(): name = 'default' ret[name] = extract_qps_latency_exp(exp) return ret def show_plot(threads, include_caladan = False): plt.cla() if include_caladan: plt.title('Memcached QPS vs Latency (99th percentile), %d threads, with Caladan' % (threads,)) else: plt.title('Memcached QPS vs Latency (99th percentile), %d threads' % (threads,)) data = extract_qps_latency(threads, include_caladan) if include_caladan and threads == 1: # Because we cannot run caladan on 1 threads, we use the t2 data # but we half the QPS name = 'caladan (per-thread QPS w/ 2 threads)' data[name] = extract_qps_latency_exp('memcached_qps_scan.5.4.0-136-generic.caladan.t2.c160') data[name] = ([qps / 2 for qps in data[name][0]], data[name][1], data[name][2]) for k in data: plt.errorbar(data[k][0], data[k][1], yerr = data[k][2], capsize = 4, label = k, marker = markers[k], color = colors[k]) plt.xlabel('QPS') plt.ylabel('Latency (99th percentile)') plt.yscale('log') plt.xlim(xmin = 0) plt.legend() if os.getenv('SAVE_FIGURE') != 'true': plt.rcParams.update({'font.size': 16}) plt.show() else: if include_caladan: plt.savefig('../data/figs/memcached_qps_scan.t%d.caladan.png' % (threads,), dpi = 192) else: plt.savefig('../data/figs/memcached_qps_scan.t%d.png' % (threads,), dpi = 192) show_plot(1) show_plot(1, True) show_plot(8) show_plot(8, True)