Files
dragonpilot/selfdrive/test/test_cpu_usage.py

107 lines
3.2 KiB
Python
Raw Normal View History

2020-07-14 21:26:01 +00:00
#!/usr/bin/env python3
2020-08-13 00:37:05 +00:00
import os
2020-07-14 21:26:01 +00:00
import time
import sys
2020-08-13 00:37:05 +00:00
import subprocess
2020-07-14 21:26:01 +00:00
import cereal.messaging as messaging
2020-08-13 00:37:05 +00:00
from common.basedir import BASEDIR
from common.params import Params
from selfdrive.test.helpers import set_params_enabled
2020-07-14 21:26:01 +00:00
def cputime_total(ct):
return ct.cpuUser + ct.cpuSystem + ct.cpuChildrenUser + ct.cpuChildrenSystem
def print_cpu_usage(first_proc, last_proc):
procs = [
2020-10-02 01:45:44 +00:00
("selfdrive.controls.controlsd", 45.0),
2020-07-14 21:26:01 +00:00
("./loggerd", 33.90),
2020-10-02 01:45:44 +00:00
("selfdrive.locationd.locationd", 29.5),
("selfdrive.controls.plannerd", 11.84),
("selfdrive.locationd.paramsd", 10.5),
("./_modeld", 7.12),
2020-07-14 21:26:01 +00:00
("./camerad", 7.07),
("./_sensord", 6.17),
2020-10-02 01:45:44 +00:00
("./_ui", 5.82),
2020-10-21 06:33:00 -07:00
("selfdrive.controls.radard", 5.67),
2020-07-14 21:26:01 +00:00
("./boardd", 3.63),
("./_dmonitoringmodeld", 2.67),
2020-10-21 06:33:00 -07:00
("selfdrive.logmessaged", 1.7),
2020-07-14 21:26:01 +00:00
("selfdrive.thermald.thermald", 2.41),
2020-10-02 01:45:44 +00:00
("selfdrive.locationd.calibrationd", 2.0),
("selfdrive.monitoring.dmonitoringd", 1.90),
2020-07-14 21:26:01 +00:00
("./proclogd", 1.54),
("./_gpsd", 0.09),
("./clocksd", 0.02),
("./ubloxd", 0.02),
("selfdrive.tombstoned", 0),
("./logcatd", 0),
]
2020-08-13 00:37:05 +00:00
r = True
2020-07-14 21:26:01 +00:00
dt = (last_proc.logMonoTime - first_proc.logMonoTime) / 1e9
result = "------------------------------------------------\n"
for proc_name, normal_cpu_usage in procs:
try:
first = [p for p in first_proc.procLog.procs if proc_name in p.cmdline][0]
last = [p for p in last_proc.procLog.procs if proc_name in p.cmdline][0]
cpu_time = cputime_total(last) - cputime_total(first)
cpu_usage = cpu_time / dt * 100.
if cpu_usage > max(normal_cpu_usage * 1.1, normal_cpu_usage + 5.0):
result += f"Warning {proc_name} using more CPU than normal\n"
2020-08-13 00:37:05 +00:00
r = False
2020-10-02 01:45:44 +00:00
elif cpu_usage < min(normal_cpu_usage * 0.65, max(normal_cpu_usage - 1.0, 0.0)):
2020-07-14 21:26:01 +00:00
result += f"Warning {proc_name} using less CPU than normal\n"
2020-08-13 00:37:05 +00:00
r = False
2020-07-14 21:26:01 +00:00
result += f"{proc_name.ljust(35)} {cpu_usage:.2f}%\n"
except IndexError:
result += f"{proc_name.ljust(35)} NO METRICS FOUND\n"
2020-08-13 00:37:05 +00:00
r = False
2020-07-14 21:26:01 +00:00
result += "------------------------------------------------\n"
print(result)
return r
2020-08-13 00:37:05 +00:00
def test_cpu_usage():
cpu_ok = False
2020-07-14 21:26:01 +00:00
2020-08-13 00:37:05 +00:00
# start manager
manager_path = os.path.join(BASEDIR, "selfdrive/manager.py")
manager_proc = subprocess.Popen(["python", manager_path])
try:
proc_sock = messaging.sub_sock('procLog', conflate=True, timeout=2000)
2020-07-14 21:26:01 +00:00
2020-10-02 01:45:44 +00:00
# wait until everything's started
2020-08-13 00:37:05 +00:00
start_time = time.monotonic()
2020-10-02 01:45:44 +00:00
while time.monotonic() - start_time < 210:
2020-08-13 00:37:05 +00:00
if Params().get("CarParams") is not None:
break
time.sleep(2)
2020-10-02 01:45:44 +00:00
# take first sample
time.sleep(5)
2020-08-13 00:37:05 +00:00
first_proc = messaging.recv_sock(proc_sock, wait=True)
if first_proc is None:
raise Exception("\n\nTEST FAILED: progLog recv timed out\n\n")
2020-07-14 21:26:01 +00:00
2020-08-13 00:37:05 +00:00
# run for a minute and get last sample
time.sleep(60)
last_proc = messaging.recv_sock(proc_sock, wait=True)
cpu_ok = print_cpu_usage(first_proc, last_proc)
finally:
manager_proc.terminate()
ret = manager_proc.wait(20)
if ret is None:
manager_proc.kill()
return cpu_ok
2020-07-14 21:26:01 +00:00
if __name__ == "__main__":
2020-08-13 00:37:05 +00:00
set_params_enabled()
Params().delete("CarParams")
2020-07-14 21:26:01 +00:00
2020-08-13 00:37:05 +00:00
passed = False
try:
passed = test_cpu_usage()
finally:
sys.exit(int(not passed))