Skip to content
Snippets Groups Projects
memcached_conn_scan.py 2.38 KiB
Newer Older
import os

experiments = [f for f in os.listdir('../data')
    if f.startswith('memcached_conn_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]))
    return qps

def parse_perf_stat(s):
    lines = s.split('\n')
    llc_misses_u = int(list(filter(None, lines[5].split(' ')))[0].replace(',', ''))
Peter Cai's avatar
Peter Cai committed
    llc_misses_k = int(list(filter(None, lines[6].split(' ')))[0].replace(',', ''))
    instructions_u = int(list(filter(None, lines[16].split(' ')))[0].replace(',', ''))
    instructions_k = int(list(filter(None, lines[17].split(' ')))[0].replace(',', ''))
    return (llc_misses_u + llc_misses_k, instructions_u + instructions_k)

def extract_conn_qps_exp(exp):
    ret = ([10, 20, 40, 80, 160, 240, 320], [], [], [], [], [], [])

    for f in ret[0]:
        (qps_avg, qps_stddev) = util.extract_exp_avg_stddev(exp, 'c%d' % (f,), parse_memcached_output)
        ret[1].append(qps_avg)
        ret[2].append(qps_stddev)
 
        ((misses_avg, instructions_avg), (misses_stddev, instructions_stddev)) = \
            util.extract_exp_avg_stddev(exp, 'stat_c%d' % (f,), parse_perf_stat)
        ret[3].append(misses_avg / (qps_avg * 30))
        ret[4].append(misses_stddev / (qps_avg * 30))
        ret[5].append(instructions_avg / (qps_avg * 30))
        ret[6].append(instructions_stddev / (qps_avg * 30))

    return ret

def extract_conn_qps(threads, include_caladan = False):
    ret = dict()

    for exp in experiments:
        split = exp.split('.')
        if split[-1] != ('t' + str(threads)):
            continue

        if split[-2] == 'caladan' and not include_caladan:
            continue

        name = split[-2]
        if name[0].isdigit():
            name = 'default'

        ret[name] = extract_conn_qps_exp(exp)

    return ret

def collect_data(threads, include_caladan = False):
    data = extract_conn_qps(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'
        data[name] = extract_conn_qps_exp('memcached_conn_scan.5.4.0-136-generic.caladan.t2')
        data[name] = (data[name][0], [qps / 2 for qps in data[name][1]], [qps / 2 for qps in data[name][2]], data[name][3], data[name][4], data[name][5], data[name][6])