Skip to content

Commit

Permalink
Custom setproctitle (#32667)
Browse files Browse the repository at this point in the history
* 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]>
  • Loading branch information
3 people committed Jun 12, 2024
1 parent 0bdab82 commit e76e8bf
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 14 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 ""
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(THREAD_NAME)
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
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 e76e8bf

Please sign in to comment.