Майнинг Blocknet на серверах и ригах

· 5 мин чтения

Это руководство посвящено запуску seine на больших машинах и на стойке ригов для майнинга: как он размещает потоки на многоядерных серверах, как запускать его без терминала под менеджером служб и как запускать, останавливать и отслеживать каждый риг через его локальный API управления, поток событий в реальном времени и метрики Prometheus.

Как seine использует большой сервер?

Краткий ответ

В Linux seine распределяет потоки майнинга по узлам NUMA и по группам кеша L3 внутри каждого узла, используя по одному потоку на физическое ядро, прежде чем занимать какого-либо SMT-соседа. Каждый поток закрепляется за своим ядром до выделения своей 2 GiB арены, поэтому память оказывается рядом с ним. Это поведение по умолчанию, так что настраивать ничего не нужно.

Доказательство работы Argon2id в Blocknet — это в основном обмен данными с памятью. Каждый поток заполняет и читает обратно свою 2 GiB арену для каждого хеша, поэтому хешрейт зависит от того, сколько контроллеров памяти и групп кеша ваши потоки загружают одновременно. Почему так, разбирается в статье об Argon2id.

Если потоки просто следуют порядку CPU операционной системы, они занимают первые ядра в списке, а все они находятся на одном узле и в одних и тех же нескольких группах кеша. На двухузловой машине EPYC восемь потоков в порядке ОС оказались на узле 0, и почти все 16 GiB арен легли в память этого узла. Автоматическое размещение seine поставило по четыре потока на каждый узел и около 8 GiB арен на каждый, так что память обоих узлов использовалась одновременно. На одноузловом EPYC 8434P с восемью группами L3 24 потока в порядке ОС легли по шесть в каждую из четырёх групп. seine задействовал все восемь групп, по три потока в каждой.

Размещение учитывает ограничения, которые вы задаёте процессу. Оно соблюдает маски CPU и памяти процесса, поэтому работает внутри taskset, cgroups и контейнеров и использует только разрешённые вами ядра. В нативной Windows та же настройка auto заполняет физические ядра, прежде чем занимать SMT-соседей.

Насколько быстрее размещение с учётом NUMA?

Разработчики seine измерили это 24 октября 2026 года, запуская один и тот же бинарный файл двумя способами попеременными парами: с автоматическим размещением seine и с закреплением в простом порядке ОС (--cpu-affinity os):

Машина Потоки Страницы памяти Прирост от автоматического размещения
Двухузловой AMD EPYC · Zen 3 (EPYC 7R13, AWS c6a.8xlarge) 8 Обычные +73%
Двухузловой AMD EPYC · Zen 3 (EPYC 7R13, AWS c6a.8xlarge) 8 Huge pages 2 MiB +108%
Сервер AMD EPYC (EPYC 8434P, 48 ядер, восемь групп L3) 24 Обычные +16,7%

Каждая попеременная пара была в пользу автоматического размещения, а полная методика и исходные результаты приведены в руководстве seine по большим серверам и в журнале оптимизации CPU.

Прирост проявляется, когда seine запускает меньше потоков, чем у машины ядер. Так бывает всякий раз, когда число потоков ограничивает ОЗУ, а не число ядер: каждому потоку нужно около 2 GB, поэтому чтобы занять 48-ядерный сервер, только для арен нужно около 96 GB. Размещение гарантирует, что потоки, которые вы можете себе позволить, распределены по всем узлам NUMA и группам кеша.

Размещение и huge pages складываются, как показывает вторая строка. Если вы резервируете huge pages, резервируйте их на каждом узле, где работают потоки, потому что достаточно большой общий объём не гарантирует локальных страниц. Настройка страниц описана в руководстве по huge pages, а в Linux пул 2 MiB страниц каждого узла задаётся в /sys/devices/system/node/node<N>/hugepages/hugepages-2048kB/nr_hugepages.

Чтобы проверить эффект на своей машине, сравните auto с os при одинаковом числе потоков и одинаковой настройке страниц. --cpu-affinity off полностью оставляет размещение планировщику.

Запас памяти на общих серверах

Автоматический подбор числа потоков оставляет свободными 5% всего ОЗУ сверх любого резерва для GPU. Изменить это можно через --cpu-memory-reserve-percent. Если другие службы начинают использовать память, автоматические потоки seine освобождают свои арены и возвращаются, когда память освобождается, так что майнинг уживается с остальной нагрузкой машины. Результаты настройки кешируются для каждой машины, и кеш сбрасывается при изменении разрешённого набора CPU или структуры NUMA и L3, например после изменения размера виртуальной машины.

Как запустить seine без терминала?

Краткий ответ

Передайте адрес для выплат и пул в командной строке, например --address со своим адресом или @name и --pool-url stratum+tcp://bntpool.com:3333. Тогда seine стартует без вопросов, сохраняет настройки в свой каталог данных и выводит простые строки журнала, если терминал не подключён, так что его может запускать менеджер служб.

На настольном компьютере seine при первом запуске спрашивает адрес и пул. На сервере без подключённого терминала передайте оба значения заранее:

./seine --address '@yourname' \
  --pool-url stratum+tcp://bntpool.com:3333 \
  --pool-worker rack1-node04 \
  --data-dir /var/lib/seine

Под именем рига (здесь rack1-node04) эта машина отображается в пуле. seine сохраняет адрес, пул и имя рига в seine.config.json в каталоге данных (по умолчанию ./seine-data), поэтому последующим запускам с тем же каталогом данных другие флаги не нужны. С настройкой по умолчанию --ui auto он показывает панель в терминале и простые строки журнала во всех остальных случаях; --ui plain принудительно включает простой вывод. В командах оболочки заключайте @name и $name в кавычки.

В Linux юнит systemd запускает seine при загрузке и перезапускает его, если он завершится:

[Unit]
Description=seine Blocknet miner
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/opt/seine/seine --data-dir /var/lib/seine --address @yourname --pool-url stratum+tcp://bntpool.com:3333 --ui plain
DynamicUser=yes
StateDirectory=seine
Restart=always

[Install]
WantedBy=multi-user.target

seine определяет адрес по короткому имени при запуске, поэтому юнит ждёт появления сети. Каждый риг настраивается сам во время майнинга и сохраняет выбранные настройки в своём каталоге данных для следующего запуска.

Как управлять seine через API?

У seine есть локальный REST API с потоком событий в реальном времени и метриками Prometheus, предназначенный для панелей мониторинга и инструментов управления фермой. Запустить его можно двумя способами:

# API only: seine waits for a start request
./seine --service --api-bind 127.0.0.1:9977

# Mine right away and serve the API
./seine --api-server --api-bind 127.0.0.1:9977

Режим --service запускает API и оставляет майнер в ожидании, пока контроллер не отправит POST /v1/miner/start, в котором можно передать адрес, пул, число потоков и другие настройки для этого запуска. Ваш контроллер решает, когда каждая машина майнит и с какими настройками.

Токен API

Начиная с seine v0.2.23, каждая конечная точка, кроме GET /v1/health, требует Authorization: Bearer <token>. При каждом запуске seine записывает новый случайный токен в control-api.cookie в каталоге данных (в Unix его может прочитать только владелец) и удаляет его при завершении работы. Для инструментов управления фермой, которым нужно постоянное значение, задайте его через --api-token или перенесите файл с помощью --api-cookie. Кроме того, по умолчанию API не отправляет заголовки CORS, а при привязке к loopback отклоняет запросы с нелокальным Host, что не даёт сайтам, которые вы посещаете, изменить ваш адрес для выплат или настройки.

По умолчанию API привязан к 127.0.0.1:9977. Для привязки к другому интерфейсу нужен --api-allow-unsafe-bind, так что API остаётся на машине, если вы не решите иначе.

export SEINE_API_TOKEN="$(cat seine-data/control-api.cookie)"

curl -s -X POST http://127.0.0.1:9977/v1/miner/start \
  -H "Authorization: Bearer $SEINE_API_TOKEN" \
  -H 'content-type: application/json' \
  -d '{"mode":"pool","mining_address":"@yourname","pool_url":"stratum+tcp://bntpool.com:3333","pool_worker":"rack1-node04"}'

curl -N -H "Authorization: Bearer $SEINE_API_TOKEN" http://127.0.0.1:9977/v1/events/stream

События в реальном времени

GET /v1/events/stream — это поток server-sent events. Он сообщает об изменениях состояния, фазах бэкендов, ходе и результатах автонастройки, найденных решениях и результатах отправки по мере их появления, так что панель мониторинга может показывать каждый риг в реальном времени. После переподключения GET /v1/runtime/state возвращает полное текущее состояние.

Метрики Prometheus

GET /metrics отдаёт метрики Prometheus, включая seine_miner_running, seine_miner_lifecycle_info, seine_miner_submitted_blocks_total, seine_miner_accepted_blocks_total и seine_miner_stale_submits_total. Поскольку cookie меняется при каждом запуске и прочитать его может только пользователь seine, дайте Prometheus постоянный токен: запустите seine с --api-token и сохраните то же значение в файле, который может прочитать Prometheus. Тогда задание сбора метрик на той же машине выглядит так:

scrape_configs:
  - job_name: seine
    authorization:
      type: Bearer
      credentials_file: /etc/prometheus/seine-token
    static_configs:
      - targets: ['127.0.0.1:9977']

Полный список конечных точек, схемы запросов и каталог событий приведены в документации seine по API управления.

Выбор машин для рига

Размещение потоков, работа без терминала и API работают одинаково и на одном системном блоке, и на стойке серверов. О том, какие процессоры майнят быстрее всего и сколько ОЗУ ставить на поток, читайте в руководстве по оборудованию для майнинга Blocknet. Впервые пользуетесь seine? Начните с руководства как майнить Blocknet.

Часто задаваемые вопросы

Поддерживает ли seine серверы с NUMA?

Да. В Linux автоматическая привязка seine по умолчанию распределяет потоки майнинга по узлам NUMA и группам кеша L3, по одному на физическое ядро, прежде чем занимать SMT-соседей, и каждый поток закрепляется за ядром до выделения своей 2 GiB арены, чтобы память оказалась рядом с ним. На двухузловой машине EPYC это подняло хешрейт на 73 процента на восьми потоках.

Может ли seine работать без терминала, как фоновая служба?

Да. Передайте --address и --pool-url при первом запуске, и seine стартует без вопросов, сохранит оба значения в seine.config.json в своём каталоге данных и перейдёт на простые строки журнала, если терминал не подключён. Поэтому его легко запускать под systemd или другим менеджером служб, который автоматически его перезапускает.

Экспортирует ли seine метрики Prometheus?

Да. Запустите seine с --api-server или --service, и он будет отдавать метрики Prometheus по адресу /metrics на своём локальном API управления, который по умолчанию слушает 127.0.0.1, порт 9977. Метрики показывают, работает ли майнер, его состояние жизненного цикла, отправленные, принятые и устаревшие решения, а также карантин бэкендов. Запросы на сбор метрик передают bearer-токен API.

Почему API управления seine запрашивает токен?

Начиная с seine v0.2.23, каждая конечная точка API управления, кроме проверки состояния, требует bearer-токен. Это не даёт сайтам, которые вы посещаете, изменить ваш адрес для выплат или настройки. При каждом запуске seine записывает новый токен в control-api.cookie в своём каталоге данных, или же можно задать постоянный токен через --api-token.