Майнінг 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']

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

Вибір машин для ригу

Розподіл потоків, робота без терміналу й 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.