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
Комментарии
Отправить комментарий