| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -27,8 +27,15 @@ from openpilot.selfdrive.test.helpers import set_params_enabled, release_only | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from openpilot.system.hardware.hw import Paths | 
					 | 
					 | 
					 | 
					from openpilot.system.hardware.hw import Paths | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from openpilot.tools.lib.logreader import LogReader | 
					 | 
					 | 
					 | 
					from openpilot.tools.lib.logreader import LogReader | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					# Baseline CPU usage by process | 
					 | 
					 | 
					 | 
					""" | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					CPU usage budget | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					* each process is entitled to at least 8% | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					* total CPU usage of openpilot (sum(PROCS.values()) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  should not exceed MAX_TOTAL_CPU | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					""" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					MAX_TOTAL_CPU = 250.  # total for all 8 cores | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					PROCS = { | 
					 | 
					 | 
					 | 
					PROCS = { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  # Baseline CPU usage by process | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  "selfdrive.controls.controlsd": 46.0, | 
					 | 
					 | 
					 | 
					  "selfdrive.controls.controlsd": 46.0, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  "./loggerd": 14.0, | 
					 | 
					 | 
					 | 
					  "./loggerd": 14.0, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  "./encoderd": 17.0, | 
					 | 
					 | 
					 | 
					  "./encoderd": 17.0, | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -274,6 +281,7 @@ class TestOnroad(unittest.TestCase): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      result += f"{proc_name.ljust(35)}  {cpu_usage:5.2f}% ({exp}%) {err}\n" | 
					 | 
					 | 
					 | 
					      result += f"{proc_name.ljust(35)}  {cpu_usage:5.2f}% ({exp}%) {err}\n" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if len(err) > 0: | 
					 | 
					 | 
					 | 
					      if len(err) > 0: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        cpu_ok = False | 
					 | 
					 | 
					 | 
					        cpu_ok = False | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    result += "------------------------------------------------\n" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    # Ensure there's no missing procs | 
					 | 
					 | 
					 | 
					    # Ensure there's no missing procs | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    all_procs = {p.name for p in self.service_msgs['managerState'][0].managerState.processes if p.shouldBeRunning} | 
					 | 
					 | 
					 | 
					    all_procs = {p.name for p in self.service_msgs['managerState'][0].managerState.processes if p.shouldBeRunning} | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -281,7 +289,14 @@ class TestOnroad(unittest.TestCase): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      with self.subTest(proc=p): | 
					 | 
					 | 
					 | 
					      with self.subTest(proc=p): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        assert any(p in pp for pp in PROCS.keys()), f"Expected CPU usage missing for {p}" | 
					 | 
					 | 
					 | 
					        assert any(p in pp for pp in PROCS.keys()), f"Expected CPU usage missing for {p}" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    # total CPU check | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    procs_tot = sum([(max(x) if isinstance(x, tuple) else x) for x in PROCS.values()]) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    with self.subTest(name="total CPU"): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      assert procs_tot < MAX_TOTAL_CPU, "Total CPU budget exceeded" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    result +=  "------------------------------------------------\n" | 
					 | 
					 | 
					 | 
					    result +=  "------------------------------------------------\n" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    result += f"Total allocated CPU usage is {procs_tot}%, budget is {MAX_TOTAL_CPU}%, {MAX_TOTAL_CPU-procs_tot:.1f}% left\n" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    result +=  "------------------------------------------------\n" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    print(result) | 
					 | 
					 | 
					 | 
					    print(result) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.assertTrue(cpu_ok) | 
					 | 
					 | 
					 | 
					    self.assertTrue(cpu_ok) | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |