napd — App Nap для Linux (плюс виджет для трея)

 

napd — App Nap для Linux (плюс виджет для трея)

На macOS давно есть App Nap: система сама придерживает фоновые процессы, которые не в фокусе, и экономит батарею. На Linux такого нет. Есть power-profiles-daemon, который крутит частоты и профили железа, но никто не смотрит, какое конкретно приложение сейчас жрёт CPU в фоне просто потому, что забыло, что его свернули.

napd — юзерспейсный демон под KDE Plasma 6 / Wayland, который это делает:

  • следит за фокусом окна через KWin-скрипт (FocusChanged по D-Bus);
  • находит cgroup конкретного приложения и подрезает ему CPU через cpu.max, если оно ушло в фон (по умолчанию — до 10% одного ядра);
  • мгновенно отпускает лимит, как только окно снова в фокусе;
  • никогда не трогает то, что держит камеру/микрофон, играет звук, входит в системный allowlist (шелл, kwin, konsole…) или было в фокусе последние 30 секунд;
  • считает реальное энергопотребление в ваттах с калибровкой watts ≈ base + k·cpu%, чтобы честно показывать, сколько из потребления вообще можно «отжать» throttling'ом, а сколько — несократимая база (экран, GPU, wifi, простой SoC).

Важный момент: napd работает поверх существующего стека, не конфликтуя с TLP/PPD — они управляют железом (частоты, профили), napd — распределением CPU по фокусу окна. Полностью в юзерспейсе: ни root, ни патчей ядра, используются делегированные systemd cgroup v2.

power: BATTERY · power-saver · ENFORCE · focus: org.kde.konsole
────────────────────────────────────────────────────────────────
POWER  (~W calibrated · 16 cores)
  total (real)             6.5 W   135%
  SoC/GPU (amdgpu)         4.2 W
  ├ addressable            3.3 W   135%   ← throttling can reduce
  │   apps                 2.8 W   114%
  │   system/kernel        0.5 W    21%
  └ fixed baseline         3.2 W          screen/GPU/wifi/idle

Есть готовый .deb для Debian/Ubuntu/KDE neon и установка из исходников через install.sh (ставит systemd --user юнит, без root). Управление — тонкий D-Bus-контракт (INTERFACE.md), поверх которого уже написан CLI (napctl).

napd-kde-applet — та же информация, но в трее

 

Смотреть на статус демона через journalctl и CLI быстро надоедает, поэтому рядом написан отдельный Plasma-виджет. Он подчёркнуто тонкий: только дёргает Status() и DailyUsage() у napd по D-Bus и рисует результат — никакой логики и хранения состояния внутри, весь контракт живёт в самом napd.

Что показывает:

  • В трее (свёрнутый вид) — «пончик» мощности: текущие ватты в центре, кольцо разделено на то, чем napd управляет, и то, что ему неподвластно; красная точка загорается, если что-то держит камеру или микрофон.
  • В развёрнутом виде — суммарное потребление системы, список приложений, которые сейчас едят CPU, флаги аномалий (⚠, когда приложение работает выше своей обычной нормы), и раскрывающаяся разбивка «расход батареи за сегодня» по каждому приложению.

 

Значок в трее активен только на батарее — на переменном токе прячется в пассивный режим, чтобы не отвлекать, когда экономить незачем. Из требований — только сам napd как systemd --user сервис и qdbus6, который и так идёт в комплекте с Qt 6 / Plasma 6.

Ставится стандартно для Plasma-апплетов:

kpackagetool6 -t Plasma/Applet --install .
kquitapp6 plasmashell && kstart plasmashell

Нюанс для тех, кто пилит такое сам: тему нужно проверять именно в реальной панели/трее — plasmawindowed не применяет полную тему Plasma, и то, что выглядит нормально в нём, в реальном трее может выглядеть иначе.

Оба живут и работают на авторском ThinkPad с AMD и Plasma 6 на Wayland — пока личный инструмент, но с прицелом на пакет для дистрибутивов.

Репозитории: github.com/metallcorn/napd и github.com/metallcorn/napd-kde-applet

Комментарии

Популярные сообщения из этого блога

Делаем себя развидеть это, или Право на предварительную правку

HP2727 сканирование в сеть

Mikrotik и Ubiquiti

Ubuntu без Unity. Как все начиналось, и что имеем сейчас

Xubuntu Unity-like