Browse Source

For relays, keep track of bytes sent and received relative to the relay bw

That value makes sense to average/stddev across relays of widely
different bw, unlike raw numbers of bytes sent and received.
Ian Goldberg 4 years ago
parent
commit
4e5eebff40
3 changed files with 25 additions and 7 deletions
  1. 21 3
      network.py
  2. 1 1
      relay.py
  3. 3 3
      simulator.py

+ 21 - 3
network.py

@@ -69,11 +69,13 @@ class PerfStats:
     public-key operations of various types.  We will reset these every
     epoch."""
 
-    def __init__(self, ent_type):
+    def __init__(self, ent_type, bw=None):
         # Which type of entity is this for (DIRAUTH, RELAY, CLIENT)
         self.ent_type = ent_type
         # A printable name for the entity
         self.name = None
+        # The relay bandwidth, if appropriate
+        self.bw = bw
         self.reset()
 
     def __str__(self):
@@ -122,10 +124,15 @@ class PerfStatsStats:
                     / (self.N - 1))
             return "%f \pm %f" % (mean, stddev)
 
-    def __init__(self):
+    def __init__(self, usebw=False):
+        self.usebw = usebw
         self.bytes_sent = PerfStatsStats.SingleStat()
         self.bytes_received = PerfStatsStats.SingleStat()
         self.bytes_tot = PerfStatsStats.SingleStat()
+        if self.usebw:
+            self.bytesperbw_sent = PerfStatsStats.SingleStat()
+            self.bytesperbw_received = PerfStatsStats.SingleStat()
+            self.bytesperbw_tot = PerfStatsStats.SingleStat()
         self.keygens = PerfStatsStats.SingleStat()
         self.sigs = PerfStatsStats.SingleStat()
         self.verifs = PerfStatsStats.SingleStat()
@@ -136,6 +143,10 @@ class PerfStatsStats:
         self.bytes_sent.accum(stat.bytes_sent)
         self.bytes_received.accum(stat.bytes_received)
         self.bytes_tot.accum(stat.bytes_sent + stat.bytes_received)
+        if self.usebw:
+            self.bytesperbw_sent.accum(stat.bytes_sent/stat.bw)
+            self.bytesperbw_received.accum(stat.bytes_received/stat.bw)
+            self.bytesperbw_tot.accum((stat.bytes_sent + stat.bytes_received)/stat.bw)
         self.keygens.accum(stat.keygens)
         self.sigs.accum(stat.sigs)
         self.verifs.accum(stat.verifs)
@@ -144,7 +155,14 @@ class PerfStatsStats:
 
     def __str__(self):
         if self.N > 0:
-            return "sent=%s recv=%s bytes=%s keygen=%s sig=%s verif=%s dh=%s N=%s" % \
+            if self.usebw:
+                return "sent=%s recv=%s bytes=%s sentperbw=%s recvperbw=%s bytesperbw=%s keygen=%s sig=%s verif=%s dh=%s N=%s" % \
+                    (self.bytes_sent, self.bytes_received, self.bytes_tot,
+                    self.bytesperbw_sent, self.bytesperbw_received,
+                    self.bytesperbw_tot,
+                    self.keygens, self.sigs, self.verifs, self.dhs, self.N)
+            else:
+                return "sent=%s recv=%s bytes=%s keygen=%s sig=%s verif=%s dh=%s N=%s" % \
                     (self.bytes_sent, self.bytes_received, self.bytes_tot,
                     self.keygens, self.sigs, self.verifs, self.dhs, self.N)
         else:

+ 1 - 1
relay.py

@@ -1031,7 +1031,7 @@ class Relay(network.Server):
 
     def __init__(self, dirauthaddrs, bw, flags):
         # Gather performance statistics
-        self.perfstats = network.PerfStats(network.EntType.RELAY)
+        self.perfstats = network.PerfStats(network.EntType.RELAY, bw)
         self.perfstats.is_bootstrapping = True
 
         # Create the identity and onion keys

+ 3 - 3
simulator.py

@@ -149,9 +149,9 @@ class Simulator:
             dirastats.accum(d.perfstats)
         totsent += dirasent
         totrecv += dirarecv
-        relaystats = network.PerfStatsStats()
-        relaybstats = network.PerfStatsStats()
-        relaynbstats = network.PerfStatsStats()
+        relaystats = network.PerfStatsStats(True)
+        relaybstats = network.PerfStatsStats(True)
+        relaynbstats = network.PerfStatsStats(True)
         for r in self.relays:
             logging.debug("%s", r.perfstats)
             relaysent += r.perfstats.bytes_sent