analysis/fct_analysis.py (50 lines of code) (raw):

import subprocess import argparse def get_pctl(a, p): i = int(len(a) * p) return a[i] if __name__=="__main__": parser = argparse.ArgumentParser(description='') parser.add_argument('-p', dest='prefix', action='store', default='fct_fat', help="Specify the prefix of the fct file. Usually like fct_<topology>_<trace>") parser.add_argument('-s', dest='step', action='store', default='5') parser.add_argument('-t', dest='type', action='store', type=int, default=0, help="0: normal, 1: incast, 2: all") parser.add_argument('-T', dest='time_limit', action='store', type=int, default=3000000000, help="only consider flows that finish before T") parser.add_argument('-b', dest='bw', action='store', type=int, default=25, help="bandwidth of edge link (Gbps)") args = parser.parse_args() type = args.type time_limit = args.time_limit # Please list all the cc (together with parameters) that you want to compare. # For example, here we list two CC: 1. HPCC-PINT with utgt=95,AI=50Mbps,pint_log_base=1.05,pint_prob=1; 2. HPCC with utgt=95,ai=50Mbps. # For the exact naming, please check ../simulation/mix/fct_*.txt output by the simulation. CCs = [ 'hpccPint95ai50log1.05p1.000', 'hp95ai50', ] step = int(args.step) res = [[i/100.] for i in range(0, 100, step)] for cc in CCs: #file = "%s_%s.txt"%(args.prefix, cc) file = "../simulation/mix/%s_%s.txt"%(args.prefix, cc) if type == 0: cmd = "cat %s"%(file)+" | awk '{if ($4==100 && $6+$7<"+"%d"%time_limit+") {slow=$7/$8;print slow<1?1:slow, $5}}' | sort -n -k 2" # print cmd output = subprocess.check_output(cmd, shell=True) elif type == 1: cmd = "cat %s"%(file)+" | awk '{if ($4==200 && $6+$7<"+"%d"%time_limit+") {slow=$7/$8;print slow<1?1:slow, $5}}' | sort -n -k 2" #print cmd output = subprocess.check_output(cmd, shell=True) else: cmd = "cat %s"%(file)+" | awk '{$6+$7<"+"%d"%time_limit+") {slow=$7/$8;print slow<1?1:slow, $5}}' | sort -n -k 2" #print cmd output = subprocess.check_output(cmd, shell=True) # up to here, `output` should be a string of multiple lines, each line is: fct, size a = output.split('\n')[:-2] n = len(a) for i in range(0,100,step): l = i * n / 100 r = (i+step) * n / 100 d = map(lambda x: [float(x.split()[0]), int(x.split()[1])], a[l:r]) fct=sorted(map(lambda x: x[0], d)) res[i/step].append(d[-1][1]) # flow size #res[i/step].append(sum(fct) / len(fct)) # avg fct res[i/step].append(get_pctl(fct, 0.5)) # mid fct res[i/step].append(get_pctl(fct, 0.95)) # 95-pct fct res[i/step].append(get_pctl(fct, 0.99)) # 99-pct fct for item in res: line = "%.3f %d"%(item[0], item[1]) i = 1 for cc in CCs: line += "\t%.3f %.3f %.3f"%(item[i+1], item[i+2], item[i+3]) i += 4 print line