Exemplo n.º 1
0
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])
Exemplo n.º 2
0
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])
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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()
Exemplo n.º 6
0
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()