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.
		
		
		
		
			
				
					108 lines
				
				2.8 KiB
			
		
		
			
		
	
	
					108 lines
				
				2.8 KiB
			| 
								 
											6 years ago
										 
									 | 
							
								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()
							 |