def analyse_remy_with_kernel(directory, endpt_name): file_names = [ os.path.join(directory, f) for f in os.listdir(directory) if os.path.isfile( os.path.join(directory, f)) ] def filename_compare(x,y): x, y = ''.join(x.split('-')[1:]), ''.join(y.split('-')[1:]) if x < y: return -1 elif x > y: return 1 else: return 0 file_names.sort(cmp=filename_compare) for filename in file_names: filename_short = filename.split('/')[-1] dat = None if filename_short.endswith('tcptrace'): dat = weighted_means(parse_tcptrace.parse_file(filename, print_csv=False, endpt_name=endpt_name)) elif filename_short.startswith('remy') and not filename_short.endswith('prober'): dat = weighted_means(parse_ctcp_output.parse_file(filename, print_csv=False)) if dat != None: if dat[0] == None or dat[0] == None: print filename_short, "\t\t\t\t\t", dat else: print filename_short, '\t\t\t\t\t', (dat[0]/1e6, dat[1])
def analyse_remy_with_kernel(directory, endpt_name): file_names = [ os.path.join(directory, f) for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f)) ] def filename_compare(x, y): x, y = ''.join(x.split('-')[1:]), ''.join(y.split('-')[1:]) if x < y: return -1 elif x > y: return 1 else: return 0 file_names.sort(cmp=filename_compare) for filename in file_names: filename_short = filename.split('/')[-1] dat = None if filename_short.endswith('tcptrace'): dat = weighted_means( parse_tcptrace.parse_file(filename, print_csv=False, endpt_name=endpt_name)) elif filename_short.startswith( 'remy') and not filename_short.endswith('prober'): dat = weighted_means( parse_ctcp_output.parse_file(filename, print_csv=False)) if dat != None: if dat[0] == None or dat[0] == None: print filename_short, "\t\t\t\t\t", dat else: print filename_short, '\t\t\t\t\t', (dat[0] / 1e6, dat[1])
def collect_data_from_directory(directory, endpt_name, output_directory="/tmp/"): re_kernel_name = re.compile('kernel.*-([0-9]+)-tcptrace') re_remy_name = re.compile('remy-(.*)-([0-9]+)') file_names = [ os.path.join(directory, f) for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f)) ] data_bins = { } # key: (num_senders, cc_name) value: tuple of 2 lists ([[tp1, rtt1], [tp2, rtt2], ...], [[tp_wt1, rtt_wt1], [...], ...]) of values as [ ([tp1, rtt1], [wt_tpt, wt_rtt]), ([tp2, rtt2], [wt_tpt, wt_rtt]), ... ] num_senders_list = {} # key: int, value: None rat_names = {'kernel': None} # key: name of rat/'kernel', value: None for full_fname in file_names: fname = full_fname.split('/')[-1] if fname.startswith('kernel') and fname.endswith('tcptrace'): num_senders = int(re_kernel_name.match(fname).group(1)) if num_senders not in num_senders_list: num_senders_list[num_senders] = None print full_fname #assert( (num_senders, 'kernel') not in data_bins ) temp = parse_tcptrace.parse_file(full_fname, print_csv=False, endpt_name=endpt_name, dst_endpt_name=endpt_name) data_bins[(num_senders, 'kernel')] = ([[x['RTT'], x['Throughput']] for x in temp ], [[x['TransmitTime'], x['NumPkts']] for x in temp]) elif fname.startswith('remy') and not fname.endswith( 'prober') and not fname.endswith('tcptrace'): tmp = re_remy_name.match(fname).groups() remy_name, num_senders = tmp[0], int(tmp[1]) if num_senders not in num_senders_list: num_senders_list[num_senders] = None if fname not in rat_names: rat_names[remy_name] = None assert ((num_senders, remy_name) not in data_bins) temp = parse_ctcp_output.parse_file(full_fname, print_csv=False) data_bins[(num_senders, remy_name)] = ([ [x['RTT'], x['Throughput']] for x in temp ], [[x['TransmitTime'], x['NumPkts']] for x in temp]) plot_graphs(data_bins, num_senders_list, rat_names, output_directory)
def collect_data_from_directory(directory, endpt_name, output_directory="/tmp/"): re_kernel_name = re.compile('kernel.*-([0-9]+)-tcptrace') re_remy_name = re.compile('remy-(.*)-([0-9]+)') file_names = [ os.path.join(directory, f) for f in os.listdir(directory) if os.path.isfile( os.path.join(directory, f)) ] data_bins = {} # key: (num_senders, cc_name) value: tuple of 2 lists ([[tp1, rtt1], [tp2, rtt2], ...], [[tp_wt1, rtt_wt1], [...], ...]) of values as [ ([tp1, rtt1], [wt_tpt, wt_rtt]), ([tp2, rtt2], [wt_tpt, wt_rtt]), ... ] num_senders_list = {} # key: int, value: None rat_names = {'kernel': None} # key: name of rat/'kernel', value: None for full_fname in file_names: fname = full_fname.split('/')[-1] if fname.startswith('kernel') and fname.endswith('tcptrace'): num_senders = int(re_kernel_name.match(fname).group(1)) if num_senders not in num_senders_list: num_senders_list[num_senders] = None print full_fname #assert( (num_senders, 'kernel') not in data_bins ) temp = parse_tcptrace.parse_file(full_fname, print_csv=False, endpt_name=endpt_name, dst_endpt_name=endpt_name) data_bins[(num_senders, 'kernel')] = ( [[x['RTT'], x['Throughput']] for x in temp], [[x['TransmitTime'], x['NumPkts']] for x in temp] ) elif fname.startswith('remy') and not fname.endswith('prober') and not fname.endswith('tcptrace'): tmp = re_remy_name.match(fname).groups() remy_name, num_senders = tmp[0], int(tmp[1]) if num_senders not in num_senders_list: num_senders_list[num_senders] = None if fname not in rat_names: rat_names[remy_name] = None assert( (num_senders, remy_name) not in data_bins ) temp = parse_ctcp_output.parse_file(full_fname, print_csv=False) data_bins[(num_senders, remy_name)] = ( [[x['RTT'], x['Throughput']] for x in temp], [[x['TransmitTime'], x['NumPkts']] for x in temp] ) plot_graphs(data_bins, num_senders_list, rat_names, output_directory)
def plot_data(mahimahi_directory, remysim_directory, vary_link, delta=1): """ Plot the utility function w.r.t link rate or minrtt mahimahi_directory -- directory where raw results from conduct_mahimahi_expt are stored remysim_directory -- directory where results from the remy simulator are stored vary_link -- if True, it is assumed that the link rate is to be varied. Else minrtt is varied delta -- adjustable factor in computing utility """ assert(type(mahimahi_directory) is str) assert(type(remysim_directory) is str) assert(type(vary_link) is bool) re_mahimahi_name = re.compile(r""" rawout-(?P<ratname>.*)- (?P<linkrate>[0-9.]+)- (?P<minrtt>[0-9.]+)- (?P<numsenders>[0-9]+)$ """, re.VERBOSE) re_mahimahi_kernel_name = re.compile(r""" rawout-(?P<ratname>cubic)- (?P<linkrate>[0-9.]+)- (?P<minrtt>[0-9.]+)- (?P<numsenders>[0-9]+)-tcptrace$ """, re.VERBOSE) re_mahimahi_nash_name = re.compile(r""" rawout-(?P<ratname>nash[0-9.]*)- (?P<linkrate>[0-9.]+)- (?P<minrtt>[0-9.]+)- (?P<numsenders>[0-9]+)$ """, re.VERBOSE) re_remysim_name = re.compile(r""" rawout-remysim-(?P<ratname>.*)- (?P<linkrate>[0-9.]+)- (?P<minrtt>[0-9.]+)- (?P<numsenders>[0-9]+)$ """, re.VERBOSE) re_remysim_data = re.compile(r"sender: \[tp=(?P<throughput>[0-9.]+), del=(?P<delay>[0-9.]+)\]") file_names = [ os.path.join(mahimahi_directory, f) for f in os.listdir(mahimahi_directory) if os.path.isfile(os.path.join(mahimahi_directory, f)) ] # if link speed is varied, fixed value the rtt, else it is the link speed fixed_value = -1 # format: key - ratname, value - [(linkrate or rtt, utility), ...] values = {} tmp_values = [] for filename in file_names: if filename.find('remysim') != -1: match = re_remysim_name.match(filename.split('/')[-1]) remysim = True elif filename.find('cubic') != -1: match = re_mahimahi_kernel_name.match(filename.split('/')[-1]) remysim = False elif filename.find('nash') != -1: match = re_mahimahi_nash_name.match(filename.split('/')[-1]) remysim = False else: match = re_mahimahi_name.match(filename.split('/')[-1]) remysim = False if match is None: continue linkrate, minrtt = match.group('linkrate'), match.group('minrtt') ratname = match.group('ratname') + ('', '-remysim')[remysim] + ' ' + match.group('numsenders') + 'senders' print ratname, linkrate, minrtt if filename.find('remysim') != -1 or filename.find('us-') != -1: print "Ignoring ", filename continue if ratname not in values: values[ratname] = [] if remysim: infile = open(filename, 'r') throughput, delay, numsenders = 0, 0, 0 for line in infile.readlines(): line_match = re_remysim_data.match(line) if line_match == None: continue throughput += float(line_match.group('throughput')) delay += float(line_match.group('delay')) numsenders += 1 if numsenders < 2: print "Skipping ", filename continue assert( numsenders == 2 ) throughput, delay = throughput/numsenders, delay/numsenders throughput /= (numsenders + 1)/2.0 # divide by E[ #senders ] throughput /= float(linkrate) # normalize delay -= float(minrtt) else: if filename.split('/')[-1].find('cubic') != -1: data = parse_tcptrace.parse_file(filename, endpt_name="100.64.0.1", dst_endpt_name="100.64.0.1") else: data = parse_ctcp_output.parse_file(filename) throughput, delay = analyse_data.weighted_means(data) if throughput == None or delay == None: print "Warning: No data present in ", filename continue throughput /= 1e6 * float(linkrate) # convert to MBps and normalize throughput *= 1500.0 / 1468.0 # compensate for differences in data sizes delay -= float(minrtt) #delay /= float(minrtt) utility = math.log(throughput, 10) - delta*math.log(delay, 10) if vary_link: fixed_value = minrtt value = float(linkrate)*8 else: fixed_value = linkrate*8 value = float(minrtt) values[ratname].append( (value, utility) ) # ns_throughput, ns_delay = get_nearest_ns_throughput_delay( # ratname, # ('delay', 'link')[vary_link], # value # ) # ns_throughput /= float(linkrate) * 8 # ns_utility = math.log(ns_throughput, 10) - delta*math.log(ns_delay, 10) # if ratname+'-ns2' not in values: # values[ratname+'-ns2'] = [] # values[ratname+'-ns2'].append( (value, ns_utility) ) tmp_values.append( (value, throughput, delay, ('mahimahi', 'remysim')[remysim]) ) # tmp_values.append( (value, ns_throughput, ns_delay, 'ns') ) tmp_values.sort(cmp=lambda x,y: ((1, -1)[x[0] > y[0]], 0)[x[0] == y[0]]) for x in tmp_values: print x colors = ['r', 'g', 'b', 'c', 'm', 'y', 'k', '0.75', '0.5', '0.25', '#663311', '#113366'] color_ctr = 0 print "For " + ('rtt', 'link rate')[vary_link] + " = " + str(fixed_value) for rat in values: if rat.find('ns2') != -1: continue print rat, '\t', colors[color_ctr] values[rat].sort(cmp=lambda x,y: ((-1, 1)[x[0] > y[0]], 0)[x[0]==y[0]]) try: x, y = zip(*values[rat]) except ValueError: print "Warning: No data for rat '" + rat + "'" continue plt.plot(x, y, colors[color_ctr], alpha=0.8, label=rat) color_ctr += 1 if vary_link: plt.xlabel('Link rate (Mbps)') plt.xscale('log') else: plt.xlabel('Min. RTT (ms)') plt.ylabel('Utility (mahimahi)') plt.legend(loc='lower center', bbox_to_anchor=(0.5, 0)) plt.show() color_ctr = 0 for rat in values: if rat.find('ns2') == -1: continue print rat, '\t', colors[color_ctr] values[rat].sort(cmp=lambda x,y: ((-1, 1)[x[0] > y[0]], 0)[x[0]==y[0]]) try: x, y = zip(*values[rat]) except ValueError: print "Warning: No data for rat '" + rat + "'" continue plt.plot(x, y, colors[color_ctr], alpha=0.8, label=rat) color_ctr += 1 if vary_link: plt.xlabel('Link rate (Mbps)') plt.xscale('log') else: plt.xlabel('Min. RTT (ms)') plt.ylabel('Utility (ns2)') plt.legend(loc='lower center', bbox_to_anchor=(0.5, 0)) plt.show()
def plot_data(mahimahi_directory, remysim_directory, vary_link, delta=1): """ Plot the utility function w.r.t link rate or minrtt mahimahi_directory -- directory where raw results from conduct_mahimahi_expt are stored remysim_directory -- directory where results from the remy simulator are stored vary_link -- if True, it is assumed that the link rate is to be varied. Else minrtt is varied delta -- adjustable factor in computing utility """ assert (type(mahimahi_directory) is str) assert (type(remysim_directory) is str) assert (type(vary_link) is bool) re_mahimahi_name = re.compile( r""" rawout-(?P<ratname>.*)- (?P<linkrate>[0-9.]+)- (?P<minrtt>[0-9.]+)- (?P<numsenders>[0-9]+)$ """, re.VERBOSE) re_mahimahi_kernel_name = re.compile( r""" rawout-(?P<ratname>cubic)- (?P<linkrate>[0-9.]+)- (?P<minrtt>[0-9.]+)- (?P<numsenders>[0-9]+)-tcptrace$ """, re.VERBOSE) re_mahimahi_nash_name = re.compile( r""" rawout-(?P<ratname>nash[0-9.]*)- (?P<linkrate>[0-9.]+)- (?P<minrtt>[0-9.]+)- (?P<numsenders>[0-9]+)$ """, re.VERBOSE) re_remysim_name = re.compile( r""" rawout-remysim-(?P<ratname>.*)- (?P<linkrate>[0-9.]+)- (?P<minrtt>[0-9.]+)- (?P<numsenders>[0-9]+)$ """, re.VERBOSE) re_remysim_data = re.compile( r"sender: \[tp=(?P<throughput>[0-9.]+), del=(?P<delay>[0-9.]+)\]") file_names = [ os.path.join(mahimahi_directory, f) for f in os.listdir(mahimahi_directory) if os.path.isfile(os.path.join(mahimahi_directory, f)) ] # if link speed is varied, fixed value the rtt, else it is the link speed fixed_value = -1 # format: key - ratname, value - [(linkrate or rtt, utility), ...] values = {} tmp_values = [] for filename in file_names: if filename.find('remysim') != -1: match = re_remysim_name.match(filename.split('/')[-1]) remysim = True elif filename.find('cubic') != -1: match = re_mahimahi_kernel_name.match(filename.split('/')[-1]) remysim = False elif filename.find('nash') != -1: match = re_mahimahi_nash_name.match(filename.split('/')[-1]) remysim = False else: match = re_mahimahi_name.match(filename.split('/')[-1]) remysim = False if match is None: continue linkrate, minrtt = match.group('linkrate'), match.group('minrtt') ratname = match.group('ratname') + ( '', '-remysim')[remysim] + ' ' + match.group('numsenders') + 'senders' print ratname, linkrate, minrtt if filename.find('remysim') != -1 or filename.find('us-') != -1: print "Ignoring ", filename continue if ratname not in values: values[ratname] = [] if remysim: infile = open(filename, 'r') throughput, delay, numsenders = 0, 0, 0 for line in infile.readlines(): line_match = re_remysim_data.match(line) if line_match == None: continue throughput += float(line_match.group('throughput')) delay += float(line_match.group('delay')) numsenders += 1 if numsenders < 2: print "Skipping ", filename continue assert (numsenders == 2) throughput, delay = throughput / numsenders, delay / numsenders throughput /= (numsenders + 1) / 2.0 # divide by E[ #senders ] throughput /= float(linkrate) # normalize delay -= float(minrtt) else: if filename.split('/')[-1].find('cubic') != -1: data = parse_tcptrace.parse_file(filename, endpt_name="100.64.0.1", dst_endpt_name="100.64.0.1") else: data = parse_ctcp_output.parse_file(filename) throughput, delay = analyse_data.weighted_means(data) if throughput == None or delay == None: print "Warning: No data present in ", filename continue throughput /= 1e6 * float( linkrate) # convert to MBps and normalize throughput *= 1500.0 / 1468.0 # compensate for differences in data sizes delay -= float(minrtt) #delay /= float(minrtt) utility = math.log(throughput, 10) - delta * math.log(delay, 10) if vary_link: fixed_value = minrtt value = float(linkrate) * 8 else: fixed_value = linkrate * 8 value = float(minrtt) values[ratname].append((value, utility)) # ns_throughput, ns_delay = get_nearest_ns_throughput_delay( # ratname, # ('delay', 'link')[vary_link], # value # ) # ns_throughput /= float(linkrate) * 8 # ns_utility = math.log(ns_throughput, 10) - delta*math.log(ns_delay, 10) # if ratname+'-ns2' not in values: # values[ratname+'-ns2'] = [] # values[ratname+'-ns2'].append( (value, ns_utility) ) tmp_values.append( (value, throughput, delay, ('mahimahi', 'remysim')[remysim])) # tmp_values.append( (value, ns_throughput, ns_delay, 'ns') ) tmp_values.sort(cmp=lambda x, y: ((1, -1)[x[0] > y[0]], 0)[x[0] == y[0]]) for x in tmp_values: print x colors = [ 'r', 'g', 'b', 'c', 'm', 'y', 'k', '0.75', '0.5', '0.25', '#663311', '#113366' ] color_ctr = 0 print "For " + ('rtt', 'link rate')[vary_link] + " = " + str(fixed_value) for rat in values: if rat.find('ns2') != -1: continue print rat, '\t', colors[color_ctr] values[rat].sort( cmp=lambda x, y: ((-1, 1)[x[0] > y[0]], 0)[x[0] == y[0]]) try: x, y = zip(*values[rat]) except ValueError: print "Warning: No data for rat '" + rat + "'" continue plt.plot(x, y, colors[color_ctr], alpha=0.8, label=rat) color_ctr += 1 if vary_link: plt.xlabel('Link rate (Mbps)') plt.xscale('log') else: plt.xlabel('Min. RTT (ms)') plt.ylabel('Utility (mahimahi)') plt.legend(loc='lower center', bbox_to_anchor=(0.5, 0)) plt.show() color_ctr = 0 for rat in values: if rat.find('ns2') == -1: continue print rat, '\t', colors[color_ctr] values[rat].sort( cmp=lambda x, y: ((-1, 1)[x[0] > y[0]], 0)[x[0] == y[0]]) try: x, y = zip(*values[rat]) except ValueError: print "Warning: No data for rat '" + rat + "'" continue plt.plot(x, y, colors[color_ctr], alpha=0.8, label=rat) color_ctr += 1 if vary_link: plt.xlabel('Link rate (Mbps)') plt.xscale('log') else: plt.xlabel('Min. RTT (ms)') plt.ylabel('Utility (ns2)') plt.legend(loc='lower center', bbox_to_anchor=(0.5, 0)) plt.show()