[tor-commits] [arm/master] Moving ps resource usage lookups to a helper function

atagar at torproject.org atagar at torproject.org
Wed Oct 30 16:17:21 UTC 2013


commit 34f488ddb32d8a4745d03ca8e8f861ee78c950a1
Author: Damian Johnson <atagar at torproject.org>
Date:   Wed Oct 30 09:08:30 2013 -0700

    Moving ps resource usage lookups to a helper function
    
    Moving the ps queries out of the class and to a _ps_for_process() helper. This
    doesn't have much impact on code readability, but it will make testing this
    sucker easier.
---
 arm/util/tracker.py |   91 +++++++++++++++++++++++++++++++--------------------
 1 file changed, 56 insertions(+), 35 deletions(-)

diff --git a/arm/util/tracker.py b/arm/util/tracker.py
index eb29a69..ec51af4 100644
--- a/arm/util/tracker.py
+++ b/arm/util/tracker.py
@@ -90,6 +90,49 @@ def get_resource_tracker():
   return RESOURCE_TRACKER
 
 
+def _ps_for_process(pid):
+  """
+  Fetches resource usage information about a given process via ps. This returns
+  a tuple of the form...
+
+    (total_cpu_time, uptime, memory_in_bytes, memory_in_percent)
+
+  :param int pid: process to be queried
+
+  :returns: **tuple** with the resource usage information
+
+  :raises: **IOError** if unsuccessful
+  """
+
+  # ps results are of the form...
+  #
+  #     TIME     ELAPSED   RSS %MEM
+  # 3-08:06:32 21-00:00:12 121844 23.5
+  #
+  # ... or if Tor has only recently been started...
+  #
+  #     TIME      ELAPSED    RSS %MEM
+  #  0:04.40        37:57  18772  0.9
+
+  ps_call = system.call("ps -p {pid} -o cputime,etime,rss,%mem".format(pid = pid))
+
+  if ps_call and len(ps_call) >= 2:
+    stats = ps_call[1].strip().split()
+
+    if len(stats) == 4:
+      try:
+        total_cpu_time = str_tools.parse_short_time_label(stats[0])
+        uptime = str_tools.parse_short_time_label(stats[1])
+        memory_bytes = int(stats[2]) * 1024  # ps size is in kb
+        memory_precent = float(stats[3]) / 100.0
+
+        return (total_cpu_time, uptime, memory_bytes, memory_precent)
+      except ValueError:
+        pass
+
+  raise IOError("unrecognized output from ps: %s" % ps_call)
+
+
 class Daemon(threading.Thread):
   """
   Daemon that can perform a given action at a set rate. Subclasses are expected
@@ -434,40 +477,18 @@ class ResourceTracker(Daemon):
     :throws: **IOError** if unable to retrieve information from proc
     """
 
-    # ps results are of the form...
-    #
-    #     TIME     ELAPSED   RSS %MEM
-    # 3-08:06:32 21-00:00:12 121844 23.5
-    #
-    # ... or if Tor has only recently been started...
-    #
-    #     TIME      ELAPSED    RSS %MEM
-    #  0:04.40        37:57  18772  0.9
-
-    ps_call = system.call("ps -p {pid} -o cputime,etime,rss,%mem".format(pid = process_pid))
+    total_cpu_time, uptime, memory_in_bytes, memory_in_percent = _ps_for_process(process_pid)
 
-    if ps_call and len(ps_call) >= 2:
-      stats = ps_call[1].strip().split()
-
-      if len(stats) == 4:
-        try:
-          total_cpu_time = str_tools.parse_short_time_label(stats[0])
-          uptime = str_tools.parse_short_time_label(stats[1])
+    if self._resources:
+      cpu_sample = (total_cpu_time - self._resources.cpu_total) / self._resources.cpu_total
+    else:
+      cpu_sample = 0.0  # we need a prior datapoint to give a sampling
 
-          if self._resources:
-            cpu_sample = (total_cpu_time - self._resources.cpu_total) / self._resources.cpu_total
-          else:
-            cpu_sample = 0.0  # we need a prior datapoint to give a sampling
-
-          return Resources(
-            cpu_sample = cpu_sample,
-            cpu_average = total_cpu_time / uptime,
-            cpu_total = total_cpu_time,
-            memory_bytes = int(stats[2]) * 1024,  # ps size is in kb
-            memory_precent = float(stats[3]) / 100.0,
-            timestamp = time.time(),
-          )
-        except ValueError:
-          pass
-
-    raise IOError("unrecognized output from ps: %s" % ps_call)
+    return Resources(
+      cpu_sample = cpu_sample,
+      cpu_average = total_cpu_time / uptime,
+      cpu_total = total_cpu_time,
+      memory_bytes = memory_in_bytes,
+      memory_precent = memory_in_percent,
+      timestamp = time.time(),
+    )





More information about the tor-commits mailing list