Exemplo n.º 1
0
def sub():

  #
  # Parse/aggregate.
  #

  tputs = collections.defaultdict(list)
  lats = collections.defaultdict(list)
  for fname in glob.glob('sync-*-count-*-npar-*-rep-*.out'):
    m = re.match(r'sync-(\d+)-count-(\d+)-npar-(\d+)-rep-(\d+)\.out', fname)
    sync, count, npar, rep = map(int, m.groups())
    with file(fname) as f:
      m = re.search(r'finished subs, tput = ([\d\.]+) ops/s, avg latency = (\d+)', f.readlines()[-2])
      tput, lat = map(float, m.groups())
    tputs[sync, count, npar].append(tput)
    lats[sync, count, npar].append(lat)
  for d in tputs, lats:
    for k in d:
      d[k] = array(d[k]).mean(), array(d[k]).std()
      print k, d[k]

  #
  # Plot.
  #

  for title, ylabel, fname, d in [ ('Subscription throughput over three trials', 'Subscriptions per second', 'tput', tputs),
                                   ('Subscription latency over three trials', 'Round-trip time in ms', 'lat', lats) ]:
    means = dict((k, v[0]) for k,v in d.iteritems())
    sdevs = dict((k, v[1]) for k,v in d.iteritems())

    surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 500, 400)
    syncs, counts, npars = [ sorted(set(x[i] for x in means))
                                for i in xrange(3) ]
    print syncs, counts, npars
    dataset = [ ( '%d topics, %s' %
                    ( count, 'synchronous' if sync else 'asynchronous' ),
                  [ ( npar/10, means[sync, count, npar], sdevs[sync, count, npar] )
                    for npar in npars ] )
                for count in counts
                for sync in syncs ]
    options = {'legend.position':
                {'top': None, 'left': None, 'bottom': 100, 'right': 20},
               'axis.x.ticks': [{'v': x, 'label': max(1,10*x)}
                                for i,(x,y,e) in enumerate(dataset[0][1])],
               'axis.x.label': 'Number of outstanding subscription requests',
               'axis.y.label': ylabel,
               'padding.left': 50,
               'title': title,
               'background.color': '#f0f0f0'}
    chart = VerticalBarChart(surface, structs.sparse_dict(options))
    chart.addDataset(dataset)
    chart.render()
    surface.write_to_png(fname + '.png')
Exemplo n.º 2
0
    def subhelper(keyname, pat, xlabel):

      #
      # Parse/aggregate.
      #

      print 'Analyzing', keyname, 'for', 'publishers' if do_pubs else 'receivers'
      print '========================'
      print

      tputs = collections.defaultdict(list)
      lats = collections.defaultdict(list)
      fnames = [ ( fname, tuple(map(int, m.groups())) )
                 for fname, m in filter( lambda m: m[1] is not None,
                                         ( ( fname, re.match(pat, fname) )
                                           for fname in os.listdir('.') ) ) ]
      tup2fname = dict( (tup, fname) for fname, tup in fnames )
      keys, reps, nodes = map(lambda xs: sorted(set(xs)),
                              zip(*(tup for fname, tup in fnames)))

      raw_table = []
      print '== raw data =='
      raw_table.append( [ keyname, 'rep', 'node', 'tput' ] + ( ['lat'] if do_pubs else [] ) + ['sum/mean tput', 'mean lat'] )
      for key in keys:
        for rep in reps:
          tmptputs = []
          tmplats = []
          for node in nodes:
            if (key, rep, node) in tup2fname:
              with file(tup2fname[key, rep, node]) as f:
                try:
                  if do_pubs:
                    m = re.search(r'finished acked pubs, tput = ([\d\.]+) ops/s, avg latency = (\d+)', f.readlines()[-2])
                    tput, lat = map(float, m.groups())
                  else:
                    m = re.search(r'finished recvs, tput = ([\d\.]+) ops/s', f.read())
                    [tput] = map(float, m.groups())
                except AttributeError:
                  print >> sys.stderr, "While processing", tup2fname[key, rep, node]
                  raise
              raw_table.append( [ key, rep, node, tput ] + ( [lat] if do_pubs else [] ) + ['',''] )
              tmptputs.append(tput)
              if do_pubs: tmplats.append(lat)
          if keyname == 'npubs': tputs[key].append(sum(tmptputs))
          else: tputs[key].append(array(tmptputs).mean())
          if do_pubs: lats[key].append(array(tmplats).mean())
          if len(nodes) > 1:
            raw_table.append( [''] * (len(raw_table[0]) - 2) + [tputs[key][-1]] + ( [lats[key][-1]] if do_pubs else [] ) )
      print strs.show_table_by_rows(raw_table)
      print

      print '== aggregated over reps =='
      agg_table = []
      agg_table.append( ( keyname, 'mean', 'sd' ) )
      for d in tputs, lats:
        for k in d:
          d[k] = array(d[k]).mean(), array(d[k]).std()
          agg_table.append( ( k, d[k][0], d[k][1] ) )
      print strs.show_table_by_rows(agg_table)
      print

      #
      # Plot.
      #

      if do_pubs:
        plots = [ ('Publishing throughput over three trials', 'Publishes per second', '%s-pub-tput' % keyname, tputs),
                  ('Publishing latency over three trials', 'Round-trip time in ms', '%s-pub-lat' % keyname, lats) ]
      else:
        plots = [ ('Receiving throughput over three trials', 'Receives per second', '%s-recv-tput' % keyname, tputs) ]
      for title, ylabel, fname, d in plots:
        means = dict((k, v[0]) for k,v in d.iteritems())
        sdevs = dict((k, v[1]) for k,v in d.iteritems())

        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 500, 400)
        dataset = [ ( 'main',
                      [ ( i, means[key], sdevs[key] )
                        for i, key in enumerate(keys) ] ) ]
        options = {'legend.position':
                    {'top': None, 'left': None, 'bottom': 100, 'right': 20},
                   'axis.x.ticks': [{'v': x, 'label': k}
                                    for k,(x,y,e) in zip(keys, dataset[0][1])],
                   'axis.x.label': xlabel,
                   'axis.y.label': ylabel,
                   'padding.left': 50,
                   'title': title,
                   'background.color': '#f0f0f0'}
        chart = VerticalBarChart(surface, structs.sparse_dict(options))
        chart.addDataset(dataset)
        chart.render()
        surface.write_to_png(fname + '.png')

      print
      print
      print