commit 34f488ddb32d8a4745d03ca8e8f861ee78c950a1 Author: Damian Johnson atagar@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(), + )
tor-commits@lists.torproject.org