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

[tor-commits] [stem/master] Close control socket faster when under load



commit 02760c0638ee57b456920beccba178669a378537
Merge: d138f557 7d639f21
Author: Damian Johnson <atagar@xxxxxxxxxxxxxx>
Date:   Thu Sep 21 10:23:36 2017 -0700

    Close control socket faster when under load
    
    When receiving a high volume of traffic (such as DEBUG events on a busy relay)
    our controller can take seconds or even minutes to close. This is because we
    send a QUIT signal, then wait for the response which is stuck behind
    potentially thousands of events.
    
    From what I can tell there's little point in issuing a QUIT so dropping that,
    and setting a time limit for processing backlogged events.
    
    I've done what I can to lighten our socket's recv() method, and even without
    the timeout we now process events much faster. But on busy relays under DEBUG
    load we simply cannot keep up. Clearly an edge case though, hence this
    compromise. The timeout is high enough that users will effectively never hit
    it, but when the controller connection is saturated we still work.
    
    Tested via the following script on my relay...
    
      import os
      import time
    
      import stem.control
      import stem.util.proc
      import stem.util.str_tools
    
      start_time = time.time()
      samplings = []
      last_sample = None
    
      with stem.control.Controller.from_port() as controller:
        controller.authenticate()
        controller.add_event_listener(lambda *args: None, 'DEBUG')
    
        while True:
          utime, stime = stem.util.proc.stats(os.getpid(), stem.util.proc.Stat.CPU_UTIME, stem.util.proc.Stat.CPU_STIME)
          total_cpu_time = float(utime) + float(stime)
    
          if last_sample:
            samplings.append(total_cpu_time - last_sample)
            print '%0.1f%% (%s)' % (sum(samplings) / len(samplings) * 100, stem.util.str_tools.time_label(time.time() - start_time))
    
          last_sample = total_cpu_time
          time.sleep(1)

 docs/change_log.rst                   |   4 +-
 stem/control.py                       |  29 +++++----
 stem/response/__init__.py             |   2 +-
 stem/socket.py                        | 115 +++++++++++++++++-----------------
 stem/util/log.py                      |  19 ++++++
 stem/util/system.py                   |  18 +++---
 test/settings.cfg                     |   1 +
 test/unit/response/control_message.py |  15 ++---
 test/unit/util/__init__.py            |   1 +
 test/unit/util/log.py                 |  23 +++++++
 10 files changed, 141 insertions(+), 86 deletions(-)

_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits