Skip to content

Commit

Permalink
Remove setproctitle (commaai#32716)
Browse files Browse the repository at this point in the history
* Custom setproctitle (commaai#32667)

* add custom setproctitle

* add test

* Update poetry.lock

* fix lint

* support only Linux

* test only Linux

* final lint

* Update test_setproctitle.py

* Update setproctitle.py

* convert to threadnames

* delete proctitles

* Check str len and use PR_GET_NAME

* fix poetry.lock

* lint fix

* Update common/threadname.py

---------

Co-authored-by: reddyn12 <[email protected]>
Co-authored-by: Adeeb Shihadeh <[email protected]>

* revert that for now

* use last 15

* fix

* use name

* update those

* and modeld

* rm

---------

Co-authored-by: schlimeszn <[email protected]>
Co-authored-by: reddyn12 <[email protected]>
Co-authored-by: Comma Device <[email protected]>
  • Loading branch information
4 people authored Jun 12, 2024
1 parent 81dc33e commit 83ac80c
Show file tree
Hide file tree
Showing 9 changed files with 61 additions and 137 deletions.
6 changes: 3 additions & 3 deletions common/realtime.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import time
from collections import deque

from setproctitle import getproctitle
from openpilot.common.threadname import getthreadname

from openpilot.system.hardware import PC

Expand Down Expand Up @@ -52,7 +52,7 @@ def __init__(self, rate: float, print_delay_threshold: float | None = 0.0) -> No
self._print_delay_threshold = print_delay_threshold
self._frame = 0
self._remaining = 0.0
self._process_name = getproctitle()
self._thread_name = getthreadname()
self._dts = deque([self._interval], maxlen=100)
self._last_monitor_time = time.monotonic()

Expand Down Expand Up @@ -87,7 +87,7 @@ def monitor_time(self) -> bool:
remaining = self._next_frame_time - time.monotonic()
self._next_frame_time += self._interval
if self._print_delay_threshold is not None and remaining < -self._print_delay_threshold:
print(f"{self._process_name} lagging by {-remaining * 1000:.2f} ms")
print(f"{self._thread_name} lagging by {-remaining * 1000:.2f} ms")
lagged = True
self._frame += 1
self._remaining = remaining
Expand Down
8 changes: 8 additions & 0 deletions common/tests/test_threadname.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from openpilot.common.threadname import setthreadname, getthreadname, LINUX

class TestThreadName:
def test_set_get_threadname(self):
if LINUX:
name = 'TESTING'
setthreadname(name)
assert name == getthreadname()
19 changes: 19 additions & 0 deletions common/threadname.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import ctypes
import os

LINUX = os.name == 'posix' and os.uname().sysname == 'Linux'

if LINUX:
libc = ctypes.CDLL('libc.so.6')

def setthreadname(name: str) -> None:
if LINUX:
name = name[-15:] + '\0'
libc.prctl(15, str.encode(name), 0, 0, 0)

def getthreadname() -> str:
if LINUX:
name = ctypes.create_string_buffer(16)
libc.prctl(16, name)
return name.value.decode('utf-8')
return ""
112 changes: 5 additions & 107 deletions poetry.lock

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,6 @@ future-fstrings = "*"
# these should be removed
psutil = "*"
timezonefinder = "*" # just used for nav ETA
setproctitle = "*"
pycryptodome = "*" # used in updated/casync, panda, body, and a test

[tool.poetry.group.dev.dependencies]
Expand Down
4 changes: 2 additions & 2 deletions scripts/waste.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import time
import numpy as np
from multiprocessing import Process
from setproctitle import setproctitle
from openpilot.common.threadname import setthreadname

def waste(core):
os.sched_setaffinity(0, [core,])
Expand All @@ -16,7 +16,7 @@ def waste(core):
j = 0
while 1:
if (i % 100) == 0:
setproctitle("%3d: %8d" % (core, i))
setthreadname("%3d: %8d" % (core, i))
lt = time.monotonic()
print("%3d: %8d %f %.2f" % (core, i, lt-st, j))
st = lt
Expand Down
12 changes: 6 additions & 6 deletions selfdrive/modeld/modeld.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import cereal.messaging as messaging
from cereal import car, log
from pathlib import Path
from setproctitle import setproctitle
from openpilot.common.threadname import setthreadname
from cereal.messaging import PubMaster, SubMaster
from msgq.visionipc import VisionIpcClient, VisionStreamType, VisionBuf
from openpilot.common.swaglog import cloudlog
Expand All @@ -24,7 +24,7 @@
from openpilot.selfdrive.modeld.constants import ModelConstants
from openpilot.selfdrive.modeld.models.commonmodel_pyx import ModelFrame, CLContext

PROCESS_NAME = "selfdrive.modeld.modeld"
THREAD_NAME = "selfdrive.modeld.modeld"
SEND_RAW_PRED = os.getenv('SEND_RAW_PRED')

MODEL_PATHS = {
Expand Down Expand Up @@ -114,9 +114,9 @@ def run(self, buf: VisionBuf, wbuf: VisionBuf, transform: np.ndarray, transform_
def main(demo=False):
cloudlog.warning("modeld init")

sentry.set_tag("daemon", PROCESS_NAME)
cloudlog.bind(daemon=PROCESS_NAME)
setproctitle(PROCESS_NAME)
sentry.set_tag("daemon", THREAD_NAME)
cloudlog.bind(daemon=THREAD_NAME)
setthreadname("modeld")
config_realtime_process(7, 54)

cloudlog.warning("setting up CL context")
Expand Down Expand Up @@ -286,7 +286,7 @@ def main(demo=False):
args = parser.parse_args()
main(demo=args.demo)
except KeyboardInterrupt:
cloudlog.warning(f"child {PROCESS_NAME} got SIGINT")
cloudlog.warning(f"child {THREAD_NAME} got SIGINT")
except Exception:
sentry.capture_exception()
raise
32 changes: 16 additions & 16 deletions selfdrive/test/test_onroad.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,26 +36,26 @@
# Baseline CPU usage by process
"selfdrive.controls.controlsd": 32.0,
"selfdrive.car.card": 22.0,
"./loggerd": 14.0,
"./encoderd": 17.0,
"./camerad": 14.5,
"./locationd": 11.0,
"loggerd": 14.0,
"encoderd": 17.0,
"camerad": 14.5,
"locationd": 11.0,
"selfdrive.controls.plannerd": 11.0,
"./ui": 18.0,
"ui": 18.0,
"selfdrive.locationd.paramsd": 9.0,
"./sensord": 7.0,
"sensord": 7.0,
"selfdrive.controls.radard": 7.0,
"selfdrive.modeld.modeld": 13.0,
"modeld": 13.0,
"selfdrive.modeld.dmonitoringmodeld": 8.0,
"system.hardware.hardwared": 3.87,
"selfdrive.locationd.calibrationd": 2.0,
"selfdrive.locationd.torqued": 5.0,
"selfdrive.ui.soundd": 3.5,
"selfdrive.monitoring.dmonitoringd": 4.0,
"./proclogd": 1.54,
"proclogd": 1.54,
"system.logmessaged": 0.2,
"system.tombstoned": 0,
"./logcatd": 0,
"logcatd": 0,
"system.micd": 6.0,
"system.timed": 0,
"selfdrive.pandad.pandad": 0,
Expand All @@ -67,12 +67,12 @@

PROCS.update({
"tici": {
"./pandad": 4.0,
"./ubloxd": 0.02,
"pandad": 4.0,
"ubloxd": 0.02,
"system.ubloxd.pigeond": 6.0,
},
"tizi": {
"./pandad": 19.0,
"pandad": 19.0,
"system.qcomgpsd.qcomgpsd": 1.0,
}
}.get(HARDWARE.get_device_type(), {}))
Expand Down Expand Up @@ -247,17 +247,17 @@ def test_cpu_usage(self, subtests):
for pl in self.service_msgs['procLog']:
for x in pl.procLog.procs:
if len(x.cmdline) > 0:
n = list(x.cmdline)[0]
plogs_by_proc[n].append(x)
plogs_by_proc[x.name].append(x)
print(plogs_by_proc.keys())

cpu_ok = True
dt = (self.service_msgs['procLog'][-1].logMonoTime - self.service_msgs['procLog'][0].logMonoTime) / 1e9
for proc_name, expected_cpu in PROCS.items():

err = ""
exp = "???"
cpu_usage = 0.
x = plogs_by_proc[proc_name]
x = plogs_by_proc[proc_name[-15:]]
if len(x) > 2:
cpu_time = cputime_total(x[-1]) - cputime_total(x[0])
cpu_usage = cpu_time / dt * 100.
Expand Down Expand Up @@ -309,7 +309,7 @@ def test_memory_usage(self):
assert max(mems) - min(mems) <= 3.0

def test_gpu_usage(self):
assert self.gpu_procs == {"weston", "ui", "camerad", "selfdrive.modeld.modeld"}
assert self.gpu_procs == {"weston", "ui", "camerad", "modeld"}

def test_camera_processing_time(self):
result = "\n"
Expand Down
4 changes: 2 additions & 2 deletions system/manager/process.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from abc import ABC, abstractmethod
from multiprocessing import Process

from setproctitle import setproctitle
from openpilot.common.threadname import setthreadname

from cereal import car, log
import cereal.messaging as messaging
Expand All @@ -27,7 +27,7 @@ def launcher(proc: str, name: str) -> None:
mod = importlib.import_module(proc)

# rename the process
setproctitle(proc)
setthreadname(proc)

# create new context since we forked
messaging.context = messaging.Context()
Expand Down

0 comments on commit 83ac80c

Please sign in to comment.