Демон мониторинга видеопамяти и телеметрии видеокарт AMD RDNA 2 (Navi 22 / RX 6700 XT) под Linux.
Сервис считывает метрики драйвера amdgpu через виртуальную файловую систему sysfs (kernfs): объем используемой VRAM, системной памяти GTT, процент занятости вычислительных блоков и температуру ядра. Основная задача: детекция вытеснения буферов памяти менеджером DRM TTM при локальной работе LLM (llama.cpp / ROCm).
- Чтение через
pread(): дескрипторы узлов/sys/class/drm/card*/device/открываются один раз при запуске. Чтение выполняется системным вызовомpread(fd, buf, size, 0)со смещением 0, что исключает обновление позицииf_posи обходит блокировкуf_pos_lockв ядре. - Событийный цикл: период опроса 1.0 с задается аппаратным таймером
timerfd_create(CLOCK_MONOTONIC)через демультиплексорepoll_pwait2. - Обработка сигналов: сигналы
SIGINTиSIGTERMблокируются в потоке и обрабатываются синхронно через дескрипторsignalfd4. - Устойчивость к смене состояний питания: при переходе шины PCIe в режимы энергосбережения (GFXOFF, BACO, Runtime D3cold) драйвер может возвращать
-EAGAINили-EBUSY. Демон сохраняет последнее валидное значение и выставляет флаг деградации телеметрии. - Потребление памяти: сборка с флагами
-fno-exceptions,-fno-rtti, LTO и стриппингом дает около 420 КБ RSS при лимите cgroups v2MemoryMax=16M. - IPC через
/dev/shm: состояние публикуется в/dev/shm/vram_guardчерез 64-байтную структуру с Seqlock.
+-------------------------------------------------------------------------+
| Linux Kernel Space |
| |
| +-----------------------+ +-------------------+ +---------+ |
| | amdgpu (TTM Manager) | | SMU11 / DPM Core | | hwmon | |
| +-----------+-----------+ +---------+---------+ +----+----+ |
| | | | |
| v v v |
| /sys/class/drm/cardX/device/ .../gpu_busy_percent .../temp1_ |
| mem_info_{vram,gtt}_* input |
+---------------+---------------------------+--------------------+--------+
| | |
| pread(fd, buf, 64, 0) | (Persistent FDs) |
v v v
+-------------------------------------------------------------------------+
| amdgpu-sentinel |
| |
| [ timerfd (1.0s) ] ──┐ |
| ├──> [ epoll_pwait2 ] ──> [ std::from_chars ] |
| [ signalfd (UNIX) ] ─┘ │ │ |
| │ v |
| [ Zero-Alloc Hot Path ] ──> [ TTM Math Engine ] |
+------------------------------------+------------------------------------+
│
v (write: STDOUT_FILENO)
systemd --user Sandbox (cgroups v2: MemoryMax=16M, Seccomp BPF)
- VRAM (
TTM_PL_VRAM): 12 ГБ GDDR6, 192-битная шина, пропускная способность ~384 ГБ/с. - GTT (
TTM_PL_TT): оперативная память хоста (DDR4-3600 в двухканальном режиме, ~50 ГБ/с). Обмен идет по шине PCIe 4.0 x16 с пределом ~31.5 ГБ/с.
Если модель превышает физический объем видеопамяти, менеджер TTM ядра Linux перемещает буферные объекты (BO) в системную память GTT.
Снижение скорости вычисляется по формуле:
Падение ПСП в 12.2 раза вызывает задержки при обработке токенов. Демон фиксирует факт вытеснения по предикату:
TTM_ALERT = (vram_used_pct > 85.0) && (gtt_used_bytes > 500 * 1024 * 1024)Требования: Arch Linux / EndeavourOS (ядро 6.x), членство в группах render и video.
git clone https://github.com/BannedForWhat/amdgpu-sentinel.git
cd amdgpu-sentinel
make clean && make
make install
# Запуск службы в сеансе пользователя
systemctl --user daemon-reload
systemctl --user enable --now amdgpu-sentinel.service
# Просмотр статуса и журнала
systemctl --user status amdgpu-sentinel.service
journalctl --user -u amdgpu-sentinel.service -f| Директива | Назначение |
|---|---|
MemoryMax=16M |
Жесткий лимит физической памяти. При превышении процесс завершается OOM-киллером группы. |
MemoryHigh=12M |
Мягкое ограничение с троттлингом аллокаций. |
NoNewPrivileges=yes |
Блокировка повышения привилегий через SUID бинарники. |
RestrictAddressFamilies=AF_UNIX |
Отключение сетевых сокетов IPv4 и IPv6 на уровне ядра. |
SystemCallFilter=@system-service ... |
Белый список сисколлов (включает pread64, epoll_pwait2, signalfd4). |
[2026-10-08T13:48:45.181Z] VRAM: 2.11/11.98 GiB ( 17.6%) | GTT: 0.33/15.63 GiB | GPU: 41% | TEMP: 50.0 C | TTM: OPTIMAL
[2026-10-08T13:48:46.181Z] VRAM: 2.09/11.98 GiB ( 17.5%) | GTT: 0.33/15.63 GiB | GPU: 16% | TEMP: 50.0 C | TTM: OPTIMAL
- Период опроса 1.0 с: шаг таймера снижает нагрузку на CPU хоста (около 13 мс процессорного времени за сессию), но не фиксирует импульсные аллокации KV-кэша длительностью менее секунды.
- Парсинг kernfs: чтение виртуальных файлов sysfs требует форматирования строк ядром в буфер страницы памяти.
Планы (v1.1):
- Переход на чтение через
ioctl(DRM_IOCTL_AMDGPU_INFO)без участия kernfs. - Интеграция eBPF-трейспоинта
tracepoint:amdgpu:amdgpu_ttm_bo_moveдля отслеживания миграции страниц по событию.