Skip to content
Snippets Groups Projects
memcached_qps_scan.py 2.83 KiB
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)