From af742a8c154ff301394f0e6188c63ed85a344cd9 Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Thu, 12 Mar 2020 16:27:52 -0700 Subject: [PATCH] live_cpu_and_temp flag to show cpu usgage per process --- selfdrive/debug/live_cpu_and_temp.py | 46 ++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/selfdrive/debug/live_cpu_and_temp.py b/selfdrive/debug/live_cpu_and_temp.py index 4f324711da..6e10296204 100755 --- a/selfdrive/debug/live_cpu_and_temp.py +++ b/selfdrive/debug/live_cpu_and_temp.py @@ -14,9 +14,24 @@ def cputime_busy(ct): return ct.user + ct.nice + ct.system + ct.irq + ct.softirq +def proc_cputime_total(ct): + return ct.cpuUser + ct.cpuSystem + ct.cpuChildrenUser + ct.cpuChildrenSystem + + +def proc_name(proc): + name = proc.name + if len(proc.cmdline): + name = proc.cmdline[0] + if len(proc.exe): + name = proc.exe + " - " + name + + return name + + if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument('--mem', action='store_true') + parser.add_argument('--cpu', action='store_true') args = parser.parse_args() sm = SubMaster(['thermal', 'procLog']) @@ -26,6 +41,9 @@ if __name__ == "__main__": total_times = [0., 0., 0., 0.] busy_times = [0., 0., 0.0, 0.] + prev_proclog = None + prev_proclog_t = None + while True: sm.update() @@ -37,7 +55,6 @@ if __name__ == "__main__": if sm.updated['procLog']: m = sm['procLog'] - cores = [0., 0., 0., 0.] total_times_new = [0., 0., 0., 0.] busy_times_new = [0., 0., 0.0, 0.] @@ -57,16 +74,33 @@ if __name__ == "__main__": print("CPU %.2f%% - RAM: %.2f - Temp %.2f" % (100. * np.mean(cores), last_mem, last_temp)) + if args.cpu and prev_proclog is not None: + procs = {} + dt = (sm.logMonoTime['procLog'] - prev_proclog_t) / 1e9 + for proc in m.procs: + try: + name = proc_name(proc) + prev_proc = [p for p in prev_proclog.procs if proc.pid == p.pid][0] + cpu_time = proc_cputime_total(proc) - proc_cputime_total(prev_proc) + cpu_usage = cpu_time / dt * 100. + procs[name] = cpu_usage + except IndexError: + pass + + print("Top CPU usage:") + for k, v in sorted(procs.items(), key=lambda item: item[1], reverse=True)[:10]: + print(f"{k.rjust(70)} {v:.2f} %") + print() + if args.mem: mems = {} for proc in m.procs: - name = proc.name - if len(proc.cmdline): - name = proc.cmdline[0] - if len(proc.exe): - name = proc.exe + " - " + name + name = proc_name(proc) mems[name] = float(proc.memRss) / 1e6 print("Top memory usage:") for k, v in sorted(mems.items(), key=lambda item: item[1], reverse=True)[:10]: print(f"{k.rjust(70)} {v:.2f} MB") print() + + prev_proclog = m + prev_proclog_t = sm.logMonoTime['procLog']