Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions asap-tools/experiments/classes/process_monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ def __init__(
assert len(self.pids_to_monitor) == len(self.keywords)

self.psutil_handles = {pid: psutil.Process(pid) for pid in self.pids_to_monitor}
# children() returns a fresh Process object each call, which would reset
# cpu_percent()'s internal delta tracking every poll. Cache one handle per
# child pid so cpu_percent() deltas accumulate across polls like they do
# for the seed pids above.
self.child_handles = {}

self.pid_monitor_map = {}
for pid, keyword in zip(self.pids_to_monitor, self.keywords):
Expand Down Expand Up @@ -202,13 +207,15 @@ def run(self):
for child in p.children(recursive=True):
if child.pid not in self.pid_monitor_map:
self.add_child_pid_to_map(pid, child.pid)
iteration_info += self.update_pid_monitor_map(child)
self.child_handles[child.pid] = child
handle = self.child_handles[child.pid]
iteration_info += self.update_pid_monitor_map(handle)
if (
self.thread_attribution_keyword is not None
and self.pid_monitor_map[child.pid]["keyword"]
and self.pid_monitor_map[handle.pid]["keyword"]
== self.thread_attribution_keyword
):
self._compute_thread_group_cpu(child.pid, elapsed)
self._compute_thread_group_cpu(handle.pid, elapsed)

self.update_hooks(iteration_info)
stop = self.pipe.poll(self.interval)
Expand Down
Loading