Bandwidth Heuristics
********************

[image]

To select the relays it will use Tor consults several factors. Exit
policies, flags, as well as bandwidth heuristics so our circuits are
zippy without overtaxing individual relays.

These statistics are collected by a special subset of our directory
authorites called **bandwidth authorities**. See our bandwidth file
specification for details. Statistics are publicly available and
generated each hour…

   import stem.descriptor.remote

   bandwidth_file = stem.descriptor.remote.get_bandwidth_file().run()[0]

   for fingerprint, measurement in bandwidth_file.measurements.items():
     print('Relay %s' % fingerprint)

     for attr, value in measurement.items():
       print('  %s = %s' % (attr, value))

     print('')

   % python bandwidth_stats.py

   Relay 6AD3EA55B87C80971F353EBA710F6550202A9355
     scanner = /scanner.5/scan-data/bws-59.4:60.1-done-2019-05-29-05:44:10
     measured_at = 1559123050
     pid_delta = -0.360692869958
     updated_at = 1559123050
     pid_error_sum = -0.178566523071
     nick = OrphanOrOften
     node_id = $6AD3EA55B87C80971F353EBA710F6550202A9355
     pid_bw = 538334
     bw = 538
     pid_error = -0.178566523071
     circ_fail = 0.0

   Relay 11B6727E38D249C83E20EEB0647BAD4FACECBEB6
     scanner = /scanner.8/scan-data/bws-92.4:93.1-done-2019-05-23-16:06:26
     measured_at = 1558641986
     pid_delta = 0.0352270644197
     updated_at = 1558641986
     pid_error_sum = -0.822158700788
     nick = snap269
     node_id = $11B6727E38D249C83E20EEB0647BAD4FACECBEB6
     pid_bw = 21124
     bw = 21
     pid_error = -0.822158700788
     circ_fail = 0.0
