[tor-commits] [doctor/master] Free memory prior to sending email

atagar at torproject.org atagar at torproject.org
Sat Oct 11 19:38:51 UTC 2014

commit 53277867865a0192dc30d29c35e9558d85082421
Author: Damian Johnson <atagar at torproject.org>
Date:   Sat Oct 11 12:36:49 2014 -0700

    Free memory prior to sending email
    Frequently we run into OOM issues when sending a notification email at the end
    of our run...
      Traceback (most recent call last):
        File "/srv/doctor.torproject.org/doctor/consensus_health_checker.py", line 705, in <module>
          util.send("Script Error", body_text = msg, destination = util.ERROR_ADDRESS)
        File "/srv/doctor.torproject.org/doctor/util.py", line 97, in send
          stderr = subprocess.PIPE,
        File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
          errread, errwrite)
        File "/usr/lib/python2.7/subprocess.py", line 1153, in _execute_child
          self.pid = os.fork()
      OSError: [Errno 12] Cannot allocate memory
    This is because we call subprocess.Popen which forks our process, doubling the
    amount of memory we use. Sending an email obviously doesn't require much, but
    since we're using hundreds of megs for all the consensuses we download that's
    what is allocated.
    Attempting to address this by freeing descriptor content prior to forking our
 consensus_health_checker.py |   10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/consensus_health_checker.py b/consensus_health_checker.py
index 54c50da..8254dc5 100755
--- a/consensus_health_checker.py
+++ b/consensus_health_checker.py
@@ -7,6 +7,7 @@ Performs a variety of checks against the present votes and consensus.
 import datetime
+import gc
 import time
 import traceback
@@ -219,6 +220,15 @@ def main():
     for issue in issues:
+    # Reclaim memory of the consensus documents. This is ebecause sending an
+    # email forks our process, doubling memory usage. This can easily be a
+    # trigger of an OOM if we're still gobbling tons of memory for the
+    # descriptor content.
+    del consensuses
+    del votes
+    gc.collect()
     if TEST_RUN:
       print '\n'.join(map(str, issues))

More information about the tor-commits mailing list