[tor-commits] [arm/master] Moving proc resource resolution to a helper too
atagar at torproject.org
atagar at torproject.org
Wed Oct 30 16:17:21 UTC 2013
commit ff27d2ae24afedc603dc519961c81309157fbc31
Author: Damian Johnson <atagar at torproject.org>
Date: Wed Oct 30 09:18:33 2013 -0700
Moving proc resource resolution to a helper too
On reflection both ps and proc are pretty similar. Moving proc resolution to a
helper that hides the differences which in turn lets us drop our
resolver-specific helper methods.
---
arm/util/tracker.py | 110 ++++++++++++++++++++++-----------------------------
1 file changed, 47 insertions(+), 63 deletions(-)
diff --git a/arm/util/tracker.py b/arm/util/tracker.py
index ec51af4..0304a6c 100644
--- a/arm/util/tracker.py
+++ b/arm/util/tracker.py
@@ -90,7 +90,7 @@ def get_resource_tracker():
return RESOURCE_TRACKER
-def _ps_for_process(pid):
+def _resources_via_ps(pid):
"""
Fetches resource usage information about a given process via ps. This returns
a tuple of the form...
@@ -133,6 +133,37 @@ def _ps_for_process(pid):
raise IOError("unrecognized output from ps: %s" % ps_call)
+def _resources_via_proc(pid):
+ """
+ Fetches resource usage information about a given process via proc. 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
+ """
+
+ utime, stime, start_time = proc.get_stats(
+ pid,
+ proc.Stat.CPU_UTIME,
+ proc.Stat.CPU_STIME,
+ proc.Stat.START_TIME,
+ )
+
+ total_cpu_time = float(utime) + float(stime)
+ memory_in_bytes = proc.get_memory_usage(process_pid)[0]
+ total_memory = proc.get_physical_memory()
+
+ uptime = time.time() - float(start_time)
+ memory_in_percent = float(mem_usage) / total_memory
+
+ return (total_cpu_time, uptime, memory_in_bytes, memory_in_percent)
+
+
class Daemon(threading.Thread):
"""
Daemon that can perform a given action at a set rate. Subclasses are expected
@@ -393,10 +424,22 @@ class ResourceTracker(Daemon):
def _task(self, process_pid, process_name):
try:
- if self._use_proc:
- self._resources = self._proc_results(process_pid)
+ resolver = _resources_via_proc if self._use_proc else _resources_via_ps
+ total_cpu_time, uptime, memory_in_bytes, memory_in_percent = resolver(process_pid)
+
+ if self._resources:
+ cpu_sample = (total_cpu_time - self._resources.cpu_total) / self._resources.cpu_total
else:
- self._resources = self._ps_results(process_pid)
+ cpu_sample = 0.0 # we need a prior datapoint to give a sampling
+
+ self._resources = 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(),
+ )
self._failure_count = 0
return True
@@ -433,62 +476,3 @@ class ResourceTracker(Daemon):
log.debug(CONFIG['msg.unable_to_get_resources'].format(resolver = 'ps', exc = exc))
return False
-
- def _proc_results(self, process_pid):
- """
- Resolves the process resource usage via proc.
-
- :returns: **Resource** instance for its present resource usage
-
- :throws: **IOError** if unable to retrieve information from proc
- """
-
- utime, stime, start_time = proc.get_stats(
- process_pid,
- proc.Stat.CPU_UTIME,
- proc.Stat.CPU_STIME,
- proc.Stat.START_TIME,
- )
-
- total_cpu_time = float(utime) + float(stime)
- mem_usage = proc.get_memory_usage(process_pid)[0]
- total_memory = proc.get_physical_memory()
-
- 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 / (time.time() - float(start_time)),
- cpu_total = total_cpu_time,
- memory_bytes = mem_usage,
- memory_precent = float(mem_usage) / total_memory,
- timestamp = time.time(),
- )
-
- def _ps_results(self, process_pid):
- """
- Resolves the process resource usage via ps.
-
- :returns: **Resource** instance for its present resource usage
-
- :throws: **IOError** if unable to retrieve information from proc
- """
-
- total_cpu_time, uptime, memory_in_bytes, memory_in_percent = _ps_for_process(process_pid)
-
- 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 = memory_in_bytes,
- memory_precent = memory_in_percent,
- timestamp = time.time(),
- )
More information about the tor-commits
mailing list