[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] [torperf/master] Add script to verify our guard choice is behaving as expected.



commit c29da5d5a98f3663c5b08afb925a058f05dfd1a9
Author: Mike Perry <mikeperry-git@xxxxxxxxxx>
Date:   Tue Feb 15 05:58:16 2011 -0800

    Add script to verify our guard choice is behaving as expected.
---
 analyze_guards.py |   96 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 96 insertions(+), 0 deletions(-)

diff --git a/analyze_guards.py b/analyze_guards.py
new file mode 100755
index 0000000..365d658
--- /dev/null
+++ b/analyze_guards.py
@@ -0,0 +1,96 @@
+#!/usr/bin/python
+#
+# This script takes a list of $idhex=nickname OR nickname=idhex lines and
+# prints out min, avg, dev, max statistics based on the current consensus.
+#
+# Be sure to include ratio in the filenames of idhexes that are supposedly
+# chosen by consensus to descriptor ratio values.
+#
+# Here is an example scriptlet for extracting the guards from an extrainfo
+# file:
+#   awk '{ print $3; }' < torperfslowratio-50kb.extradata > slowratio50kb.extra
+#
+# Use this result like this:
+# ./analyze_guards.py slowratio50kb.extra
+#
+# It should then print out ranking stats. Use your brain to determine if these
+# stats make sense for the run you selected.
+
+import sys
+import math
+
+import TorCtl.TorCtl
+import TorCtl.TorUtil
+
+TorCtl.TorUtil.loglevel = "NOTICE"
+HOST="127.0.0.1"
+PORT=9051
+
+def analyze_list(router_map, idhex_list):
+  min_rank = len(router_map)
+  tot_rank = 0
+  max_rank = 0
+  absent = 0
+  for idhex in idhex_list:
+    if idhex not in router_map:
+      absent += 1
+      continue
+
+    rank = router_map[idhex].list_rank
+    tot_rank += rank
+    if rank < min_rank: min_rank = rank
+    if rank > max_rank: max_rank = rank
+
+  avg = float(tot_rank)/(len(idhex_list)-absent)
+  varience = 0
+
+  for idhex in idhex_list:
+    if idhex not in router_map: continue
+    rank = router_map[idhex].list_rank
+    varience += (rank-avg)*(rank-avg)
+
+  return (min_rank, avg, math.sqrt(varience/(len(idhex_list)-absent-1)), max_rank, absent)
+
+def main():
+  f = file(sys.argv[1], "r")
+  idhex_list = f.readlines()
+
+  for i in xrange(len(idhex_list)):
+    if "~" in idhex_list[i]: char = "~"
+    else: char = "="
+
+    split = idhex_list[i].split(char)
+
+    if split[0][0] == "$":
+      idhex_list[i] = split[0]
+    else:
+      idhex_list[i] = "$"+split[1]
+
+  c = TorCtl.TorCtl.connect(HOST, PORT)
+  nslist = c.get_network_status()
+  sorted_rlist = filter(lambda r: r.desc_bw > 0, c.read_routers(c.get_network_status()))
+  router_map = {}
+  for r in sorted_rlist: router_map["$"+r.idhex] = r
+
+  if "ratio" in sys.argv[1]:
+    print "Using ratio rankings"
+    def ratio_cmp(r1, r2):
+      if r1.bw/float(r1.desc_bw) > r2.bw/float(r2.desc_bw):
+        return -1
+      elif r1.bw/float(r1.desc_bw) < r2.bw/float(r2.desc_bw):
+        return 1
+      else:
+        return 0
+    sorted_rlist.sort(ratio_cmp)
+  else:
+    print "Using consensus bw rankings"
+    sorted_rlist.sort(lambda x, y: cmp(y.bw, x.bw))
+
+  for i in xrange(len(sorted_rlist)): sorted_rlist[i].list_rank = i
+
+  print "Guard rank stats (min, avg, dev, total, absent): "
+  print str(analyze_list(router_map, idhex_list))
+
+if __name__ == '__main__':
+  main()
+