@@ -76,6 +76,8 @@ class Kernel(SingletonConfigurable):
76
76
# attribute to override with a GUI
77
77
eventloop = Any (None )
78
78
79
+ processes : t .Dict [str , psutil .Process ] = {}
80
+
79
81
@observe ("eventloop" )
80
82
def _update_eventloop (self , change ):
81
83
"""schedule call to eventloop from IOLoop"""
@@ -953,10 +955,8 @@ async def debug_request(self, stream, ident, parent):
953
955
reply_msg = self .session .send (stream , "debug_reply" , reply_content , parent , ident )
954
956
self .log .debug ("%s" , reply_msg )
955
957
956
- # Taken from https://github.com/jupyter-server/jupyter-resource-usage/blob/e6ec53fa69fdb6de8e878974bcff006310658408/jupyter_resource_usage/metrics.py#L16
957
958
def get_process_metric_value (self , process , name , attribute = None ):
958
959
try :
959
- # psutil.Process methods will either return...
960
960
metric_value = getattr (process , name )()
961
961
if attribute is not None : # ... a named tuple
962
962
return getattr (metric_value , attribute )
@@ -971,12 +971,22 @@ async def usage_request(self, stream, ident, parent):
971
971
reply_content = {"hostname" : socket .gethostname (), "pid" : os .getpid ()}
972
972
current_process = psutil .Process ()
973
973
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
+ }
975
979
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
+ ]
977
984
)
978
985
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
+ ]
980
990
)
981
991
cpu_percent = psutil .cpu_percent ()
982
992
# https://psutil.readthedocs.io/en/latest/index.html?highlight=cpu#psutil.cpu_percent
0 commit comments