Skip to content

Commit 322e65c

Browse files
authored
Merge pull request #937 from datalayer-externals/fix/kernel-cpu-usage
2 parents b75fc29 + 361bd90 commit 322e65c

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

ipykernel/kernelbase.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ class Kernel(SingletonConfigurable):
7676
# attribute to override with a GUI
7777
eventloop = Any(None)
7878

79+
processes: t.Dict[str, psutil.Process] = {}
80+
7981
@observe("eventloop")
8082
def _update_eventloop(self, change):
8183
"""schedule call to eventloop from IOLoop"""
@@ -953,10 +955,8 @@ async def debug_request(self, stream, ident, parent):
953955
reply_msg = self.session.send(stream, "debug_reply", reply_content, parent, ident)
954956
self.log.debug("%s", reply_msg)
955957

956-
# Taken from https://github.com/jupyter-server/jupyter-resource-usage/blob/e6ec53fa69fdb6de8e878974bcff006310658408/jupyter_resource_usage/metrics.py#L16
957958
def get_process_metric_value(self, process, name, attribute=None):
958959
try:
959-
# psutil.Process methods will either return...
960960
metric_value = getattr(process, name)()
961961
if attribute is not None: # ... a named tuple
962962
return getattr(metric_value, attribute)
@@ -971,12 +971,22 @@ async def usage_request(self, stream, ident, parent):
971971
reply_content = {"hostname": socket.gethostname(), "pid": os.getpid()}
972972
current_process = psutil.Process()
973973
all_processes = [current_process] + current_process.children(recursive=True)
974-
process_metric_value = self.get_process_metric_value
974+
# Ensure 1) self.processes is updated to only current subprocesses
975+
# and 2) we reuse processes when possible (needed for accurate CPU)
976+
self.processes = {
977+
process.pid: self.processes.get(process.pid, process) for process in all_processes
978+
}
975979
reply_content["kernel_cpu"] = sum(
976-
[process_metric_value(process, "cpu_percent", None) for process in all_processes]
980+
[
981+
self.get_process_metric_value(process, "cpu_percent", None)
982+
for process in self.processes.values()
983+
]
977984
)
978985
reply_content["kernel_memory"] = sum(
979-
[process_metric_value(process, "memory_info", "rss") for process in all_processes]
986+
[
987+
self.get_process_metric_value(process, "memory_info", "rss")
988+
for process in self.processes.values()
989+
]
980990
)
981991
cpu_percent = psutil.cpu_percent()
982992
# https://psutil.readthedocs.io/en/latest/index.html?highlight=cpu#psutil.cpu_percent

0 commit comments

Comments
 (0)