You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
2.8 KiB
107 lines
2.8 KiB
import os
|
|
import sys
|
|
|
|
import zmq
|
|
from lru import LRU
|
|
|
|
from cereal import log
|
|
from common.realtime import Ratekeeper
|
|
import cereal.messaging as messaging
|
|
from cereal.services import service_list
|
|
|
|
def cputime_total(ct):
|
|
return ct.user+ct.nice+ct.system+ct.idle+ct.iowait+ct.irq+ct.softirq
|
|
|
|
def cputime_busy(ct):
|
|
return ct.user+ct.nice+ct.system+ct.irq+ct.softirq
|
|
|
|
def cpu_dtotal(l1, l2):
|
|
t1_total = sum(cputime_total(ct) for ct in l1.cpuTimes)
|
|
t2_total = sum(cputime_total(ct) for ct in l2.cpuTimes)
|
|
return t2_total - t1_total
|
|
|
|
def cpu_percent(l1, l2):
|
|
dtotal = cpu_dtotal(l1, l2)
|
|
t1_busy = sum(cputime_busy(ct) for ct in l1.cpuTimes)
|
|
t2_busy = sum(cputime_busy(ct) for ct in l2.cpuTimes)
|
|
|
|
dbusy = t2_busy - t1_busy
|
|
|
|
if dbusy < 0 or dtotal <= 0:
|
|
return 0.0
|
|
return dbusy / dtotal
|
|
|
|
def proc_cpu_percent(proc1, proc2, l1, l2):
|
|
dtotal = cpu_dtotal(l1, l2)
|
|
|
|
dproc = (proc2.cpuUser+proc2.cpuSystem) - (proc1.cpuUser+proc1.cpuSystem)
|
|
if dproc < 0:
|
|
return 0.0
|
|
|
|
return dproc / dtotal
|
|
|
|
def display_cpu(pl1, pl2):
|
|
l1, l2 = pl1.procLog, pl2.procLog
|
|
|
|
print(cpu_percent(l1, l2))
|
|
|
|
procs1 = dict((proc.pid, proc) for proc in l1.procs)
|
|
procs2 = dict((proc.pid, proc) for proc in l2.procs)
|
|
|
|
procs_print = 4
|
|
|
|
procs_with_percent = sorted((proc_cpu_percent(procs1[proc.pid], proc, l1, l2), proc) for proc in l2.procs
|
|
if proc.pid in procs1)
|
|
for percent, proc in procs_with_percent[-1:-procs_print-1:-1]:
|
|
print(percent, proc.name)
|
|
|
|
print()
|
|
|
|
|
|
def main():
|
|
frame_cache = LRU(16)
|
|
md_cache = LRU(16)
|
|
plan_cache = LRU(16)
|
|
|
|
frame_sock = messaging.sub_sock('frame')
|
|
md_sock = messaging.sub_sock('model')
|
|
plan_sock = messaging.sub_sock('plan')
|
|
controls_state_sock = messaging.sub_sock('controlsState')
|
|
|
|
proc = messaging.sub_sock('procLog')
|
|
pls = [None, None]
|
|
|
|
rk = Ratekeeper(10)
|
|
while True:
|
|
|
|
for msg in messaging.drain_sock(frame_sock):
|
|
frame_cache[msg.frame.frameId] = msg
|
|
|
|
for msg in messaging.drain_sock(md_sock):
|
|
md_cache[msg.logMonoTime] = msg
|
|
|
|
for msg in messaging.drain_sock(plan_sock):
|
|
plan_cache[msg.logMonoTime] = msg
|
|
|
|
controls_state = messaging.recv_sock(controls_state_sock)
|
|
if controls_state is not None:
|
|
plan_time = controls_state.controlsState.planMonoTime
|
|
if plan_time != 0 and plan_time in plan_cache:
|
|
plan = plan_cache[plan_time]
|
|
md_time = plan.plan.mdMonoTime
|
|
if md_time != 0 and md_time in md_cache:
|
|
md = md_cache[md_time]
|
|
frame_id = md.model.frameId
|
|
if frame_id != 0 and frame_id in frame_cache:
|
|
frame = frame_cache[frame_id]
|
|
print("controls lag: %.2fms" % ((controls_state.logMonoTime - frame.frame.timestampEof) / 1e6))
|
|
|
|
|
|
pls = (pls+messaging.drain_sock(proc))[-2:]
|
|
if None not in pls:
|
|
display_cpu(*pls)
|
|
|
|
rk.keep_time()
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|