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()
 | |
| 
 |