Списанный офисный компьютер на четырёхъядерном процессоре обычно пылится в кладовке. Между тем его ресурсов хватает на сервер домашней автоматизации: платформа управления устройствами, файловое хранилище, панель мониторинга и несколько контейнеров со службами. Удерживает от такого превращения только счёт за электричество, ведь машина работает круглосуточно. Ниже расчёт стоимости владения, способы её снизить и состав программного наполнения.

Экономика затеи и расчёт стоимости круглосуточной работы

Прежде чем что-то делать, стоит посчитать. Формула простая: мощность в ваттах умножается на часы работы, делится на тысячу и умножается на тариф.

Старый офисный системный блок в покое потребляет от 35 до 60 Вт, под нагрузкой до 120 Вт. Среднее за сутки при эпизодических задачах укладывается примерно в 45 Вт. Считаем год:

45 Вт x 24 ч x 365 дн = 394 кВт·ч
394 кВт·ч x 6 руб = 2364 руб в год

За три года набегает около семи тысяч рублей. Аренда виртуального сервера с двумя ядрами и четырьмя гигабайтами памяти обходится в 400-600 рублей в месяц, то есть 14-22 тысячи за три года, причём данные лежат вне дома. Готовая одноплатная система потребляет 5-8 Вт, что даёт 260-420 рублей в год, но плата с блоком питания стоят сопоставимо с подержанным системным блоком.

Старый офисный ПК проигрывает одноплатному по расходу, но выигрывает по цене входа и по количеству одновременно работающих служб. Четыре полноразмерных ядра и возможность поставить 16 ГБ памяти дают запас, которого одноплатнику не хватает.

Снизить расход реально, и ниже разобраны способы от простого к сложному.

Что замерить, докупить и почистить перед вводом сервера в эксплуатацию

Оптимизировать неизмеренное занятие бессмысленное, поэтому начинают с цифры из розетки. Точный способ один: ваттметр между стеной и блоком питания, полчаса работы в типичном режиме и показания. Прибор стоит недорого и окупается тем, что сразу показывает, есть ли смысл заниматься настройкой.

Без прибора помогают показания процессора. На машинах с поддержкой RAPL ядро публикует потребление доменов:

ls /sys/class/powercap/
cat /sys/class/powercap/intel-rapl:0/name
cat /sys/class/powercap/intel-rapl:0/energy_uj

Значение в микроджоулях монотонно растёт, и разница двух замеров, делённая на интервал в секундах, даёт ватты. RAPL не учитывает вентиляторы, накопители и потери блока питания, поэтому реальная цифра из розетки окажется на 10-20 Вт выше.

Замерять стоит в двух состояниях: сразу после загрузки, когда система ничего не делает, и под созданной нагрузкой. Разница между ними показывает, сколько добавляет каждая оптимизация и сколько забирает полезная работа.

Настройки BIOS, которые решают больше, чем софт

Половину экономии дают параметры прошивки, и до них стоит добраться до установки системы.

Первое, отключение неиспользуемого. Звуковой кодек, последовательный и параллельный порты, второй сетевой интерфейс. Каждый забирает единицы ватт, а на сервере они не нужны вовсе.

Второе, поведение после пропадания питания. Параметр с названиями вроде Restore on AC Power Loss или AC Back Function должен стоять в положение включения. Без него машина после короткого скачка напряжения останется выключенной, и автоматизация в доме встанет до ручного вмешательства.

Третье, режимы простоя процессора. Пакетные C-состояния должны быть разрешены, иначе ядра не уходят в глубокий сон и потребление в покое остаётся высоким. На некоторых платах встречается параметр энергетической политики, где принудительно выставлен режим производительности, и его стоит переключить.

Четвёртое, загрузка по расписанию. Если сервер нужен не круглосуточно, таймер включения в прошивке экономит больше всех программных трюков вместе взятых.

Отдельно про вентиляторы. Профиль охлаждения в серверном сценарии лучше выставить тихим, а не агрессивным: машина стоит в углу, нагрузка на неё неровная, а постоянный шум раздражает сильнее, чем лишний градус.

Андервольтинг и ограничение турбо как главный рычаг экономии

Андервольтинг это снижение напряжения питания процессора при сохранении частоты. Потребление ядра растёт пропорционально квадрату напряжения, поэтому уменьшение на 50-100 мВ даёт заметную экономию и более низкую температуру.

Инструмент intel-undervolt работает через регистры процессора. Сборка стандартная:

git clone https://github.com/kitsunyan/intel-undervolt
cd intel-undervolt
./configure && make
sudo make install

Конфигурация лежит в /etc/intel-undervolt.conf, и правки в ней выглядят как смещения в милливольтах для каждого домена:

undervolt 0 'CPU' -80
undervolt 1 'GPU' -80
undervolt 2 'CPU Cache' -80
undervolt 3 'System Agent' 0
undervolt 4 'Analog I/O' 0
interval 5000

Применять стоит постепенно: начать с -50 мВ, сутки понаблюдать, затем шагнуть до -80. Признак перебора это внезапные перезагрузки и ошибки вычислений под нагрузкой. Кэш процессора обычно требует того же смещения, что и ядра.

Поддерживается это не везде. Смещение напряжения через регистры доступно на мобильных и части настольных процессоров, начиная примерно с четвёртого поколения. На совсем старых машинах и на ряде настольных линеек функция заблокирована, и тогда остаётся только ограничение частоты.

Второй рычаг, отключение турбо-режима. Пик потребления офисного процессора приходится именно на разгон одного ядра выше базовой частоты, а серверу автоматизации этот пик не нужен: задачи там короткие и не требуют максимальной скорости.

# отключить турбо
echo 1 | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo

# проверить базовую и текущую частоты
cat /sys/devices/system/cpu/cpu0/cpufreq/base_frequency
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

Чтобы настройка пережила перезагрузку, её оформляют юнитом:

[Unit]
Description=Disable CPU turbo boost
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo'
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Вместе андервольтинг и отключение турбо дают снижение потребления под нагрузкой на 20-40 Вт на типовом офисном процессоре. В покое выигрыш скромнее, поскольку там и так почти всё выключено.

Со стороны программ остаётся включить профиль энергосбережения и выставить планировщик:

sudo cpupower frequency-set -g powersave

Название профиля вводит в заблуждение: он не тормозит систему, а позволяет процессору снижать частоту, когда работы нет. На задачах автоматизации потеря производительности незаметна.

Три вещи дают больший эффект, чем любая программная настройка, и все они стоят недорого.

Первая, память. Восемь гигабайт это практический минимум для контейнерного стека, а шестнадцать позволяют держать платформу автоматизации, брокер сообщений, файловое хранилище и пару экспериментальных служб одновременно. Подержанные планки для старых офисных машин стоят в разы меньше новых, и это самая выгодная статья расходов во всём проекте.

Вторая, твердотельный накопитель вместо штатного диска. Система с него грузится быстрее, база данных платформы автоматизации перестаёт зависеть от скорости случайных операций, а потребление падает на несколько ватт. Ресурс перезаписи у бюджетных моделей многократно превышает то, что реально напишет домашний сервер за годы работы.

Третья, обслуживание охлаждения. Машина из офиса обычно забита пылью, а термопаста под радиатором высохла. Чистка и замена пасты занимают двадцать минут и снижают температуру на пять-десять градусов. На охлаждение напрямую завязано потребление: при перегреве процессор сбрасывает частоту, а вентилятор раскручивается, и оба эффекта увеличивают расход.

После сборки стоит зафиксировать исходные цифры, чтобы потом было с чем сравнивать:

sensors | egrep -i 'core|package|fan'
sudo smartctl -a /dev/sda | egrep -i 'temperature'
uptime

Показания стоит записать в файл вместе с датой. Через месяц сравнение покажет, дало ли смещение напряжения экономию или процессор работает на грани.

Выбор дистрибутива и минимальная базовая установка

Для сервера, который должен годами работать без вмешательства, дистрибутив выбирают по двум критериям: предсказуемость обновлений и низкие требования к ресурсам.

Установочный образ минимальной версии Debian весит около 650 МБ и ставится с сети. От графического окружения стоит отказаться целиком: экран серверу не нужен, а каждый лишний пакет это память и лишняя точка обновления.

После установки базовая система с сетевым доступом занимает 1,2-1,5 ГБ памяти и около 4 ГБ на диске. Остальное остаётся под контейнеры.

Из пакетов понадобятся только самые необходимые:

sudo apt install curl ca-certificates git htop lm-sensors smartmontools

Отдельно стоит настроить датчики температуры, чтобы видеть результат андервольтинга в цифрах, а не на ощупь:

sudo sensors-detect --auto
sensors

Накопитель перед вводом в строй проверяют, поскольку машина списана из офиса и диск наработал десятки тысяч часов:

sudo smartctl -a /dev/sda | egrep -i 'power_on_hours|reallocated|pending|temperature'

Если счётчик переназначенных секторов ненулевой или растёт, диск меняют до установки системы, а не после первого сбоя. Накопитель это единственная деталь в таком сервере, которая ломается предсказуемо, и экономить на ней неразумно.

Стек автоматизации в контейнерах с лимитами ресурсов и резервным копием

Разумная схема размещения выглядит так: платформа автоматизации в одном контейнере, вспомогательные службы в отдельных, у каждого свои ограничения.

services:
  homeassistant:
    image: ghcr.io/home-assistant/home-assistant:stable
    container_name: ha
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./ha-config:/config
    deploy:
      resources:
        limits:
          memory: 2G

  mqtt:
    image: eclipse-mosquitto:2
    container_name: mqtt
    restart: unless-stopped
    ports:
      - "127.0.0.1:1883:1883"
    volumes:
      - ./mosquitto/config:/mosquitto/config
      - ./mosquitto/data:/mosquitto/data
    deploy:
      resources:
        limits:
          memory: 256M

Сетевой режим host нужен потому, что платформе требуется видеть устройства в локальной сети через широковещательные запросы, а за пробросом отдельных портов они не проходят.

Минимальные требования к памяти у платформы составляют 2 ГБ, поэтому на машине с 8 ГБ остаётся запас под несколько дополнительных служб. С 4 ГБ тоже работает, но одновременно держать тяжёлые контейнеры уже не получится, и лимиты становятся обязательными.

Резервное копирование настраивается на каталоги с конфигурацией, а не на весь диск. Конфигурация платформы занимает десятки мегабайт, и её копия по расписанию закрывает основную потребность:

0 3 * * * tar czf /backup/ha-config-$(date +\%F).tar.gz -C /opt/stack ha-config && find /backup -name 'ha-config-*.tar.gz' -mtime +30 -delete

Копию держат не на том же накопителе, а ротация в тридцать дней защищает от ситуации, когда повреждение заметили спустя месяц и все копии уже испорчены.

Надёжность работы без присмотра и типичные причины простоев

Сервер в кладовке работает по принципу, который легко сформулировать и трудно соблюдать: после любого сбоя всё должно подниматься само.

Минимальный набор мер выглядит так:

  1. Автоматический запуск контейнеров при старте системы закрывается флагом restart со значением unless-stopped, он же поднимает процесс после аварийного завершения;
  2. Поведение при пропадании питания задаётся настройкой в прошивке и дополняется источником бесперебойного питания хотя бы на несколько минут, задача которого не держать машину часами, а дать ей корректно завершить запись на диск;
  3. Контроль накопителя берёт на себя smartmontools, умеющий присылать уведомления о деградации, для чего в /etc/smartd.conf включают оповещение и указывают получателя;
  4. Место на диске ограничивают заранее, поскольку журналы контейнеров растут незаметно и через полгода занимают гигабайты;
  5. Обновления ставят поштучно, начиная с копии конфигурации, затем одна служба, сутки наблюдения и только потом остальные.

Ограничение журналов задаётся в настройках движка:

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "10m", "max-file": "3" }
}

Ресурс такой машины упирается не в процессор, а в накопитель и блок питания. Оба дешевы в замене и диагностируются заранее, и при минимальном внимании старый офисный компьютер работает сервером годами, обходясь в пару тысяч рублей электричества за год.