Huge pages (большие страницы) для ускорения майнинга Blocknet

· 5 мин чтения

Если зарезервировать huge pages, seine размещает память каждого потока майнинга в нескольких больших страницах вместо сотен тысяч маленьких. В этом руководстве объясняется, почему это ускоряет доказательство работы Argon2id в Blocknet, сколько страниц резервировать, и приведены точные команды для Linux, WSL2 и Windows.

Почему huge pages ускоряют майнинг Blocknet?

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

Каждый поток seine хеширует внутри 2 GiB арены Argon2id и читает блоки из непредсказуемых мест в ней. С обычными страницами по 4 KiB эта арена занимает 524 288 страниц — гораздо больше трансляций адресов, чем может закешировать TLB процессора. Huge pages покрывают её 1 024 или всего 2 страницами, поэтому меньше чтений простаивает на обходе таблиц страниц.

Каждое обращение к памяти начинается с виртуального адреса, который процессор должен перевести в физический. Недавние трансляции хранятся в буфере ассоциативной трансляции (TLB), который документация ядра Linux описывает как «кеш трансляций виртуальных адресов в физические» и «очень дефицитный ресурс процессора». Если адреса нет в TLB, процессор обходит таблицы страниц в памяти, прежде чем вообще начать загрузку данных.

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

Размер страницы Страниц на 2 GiB арену
4 KiB (обычные) 524 288
2 MiB 1 024
1 GiB 2

С huge pages одна запись TLB покрывает в 512 или 262 144 раза больше памяти, поэтому намного большая часть арены остаётся в пределах досягаемости TLB и больше времени каждого потока уходит на хеширование.

Насколько быстрее майнинг с huge pages?

Руководство seine по huge pages называет их самым важным параметром настройки CPU-майнинга в Linux. На тестовом хосте зарезервированные 2 MiB страницы добавили около 4–6%, а 1 GiB страницы — ещё примерно 2%. В руководстве также отмечено, что при большом числе потоков покрытие huge pages обычно важнее, чем настройка под набор инструкций.

Результаты серверов на графике производительности seine измерены с явно зарезервированными 2 MiB huge pages. 49,4 H/s на AMD EPYC Zen 5 (EPYC 9R45) с 32 потоками, измеренные в октябре 2026 года, получены с 34 407 зарезервированными страницами — тем же числом, что и в строке для 32 потоков в таблице ниже. В руководстве по оборудованию для майнинга собраны все результаты по поколениям.

Даже без резервирования seine запрашивает у ядра Linux прозрачные huge pages. Зарезервированный пул даёт больше, потому что страницы выделяются заранее, и каждый поток получает их, как бы сильно ни была фрагментирована память.

Сколько huge pages нужно seine?

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

Каждому потоку seine нужно 1 024 huge pages по 2 MiB для его 2 GiB арены или две страницы по 1 GiB. Для 2 MiB страниц резервируйте потоки × 1 024 × 1,05 с округлением вверх — это даёт 5% запаса. Восьми потокам нужно 8 602 страницы, около 16,8 GiB. Если резервирования не хватает, seine выводит точное число при запуске.

Число потоков — это значение Threads на панели seine. seine выбирает его по объёму ОЗУ и числу ядер процессора, поэтому запустите seine один раз без huge pages и запомните его. Если резервирование слишком маленькое, в журнале запуска seine появится строка hugepages | с нужным числом страниц и командой sysctl для их резервирования.

Потоки Страницы 2 MiB (с запасом 5%) Зарезервировано памяти Страницы 1 GiB
4 4 301 8,4 GiB 8
8 8 602 16,8 GiB 16
16 17 204 33,6 GiB 32
24 25 805 50,4 GiB 48
32 34 407 67,2 GiB 64

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

Как настроить 2 MiB huge pages в Linux?

Зарезервируйте страницы под своё число потоков. Этот пример — для 4 потоков:

sudo sysctl -w vm.nr_hugepages=4301

Проверьте, что ядро выделило их все:

grep -E 'HugePages_Total|HugePages_Free|Hugepagesize' /proc/meminfo

Если HugePages_Total меньше запрошенного, память фрагментирована. Сбросьте кеши, уплотните память и попробуйте снова:

echo 3 | sudo tee /proc/sys/vm/drop_caches
echo 1 | sudo tee /proc/sys/vm/compact_memory
sudo sysctl -w vm.nr_hugepages=4301

Сделайте резервирование постоянным:

echo 'vm.nr_hugepages=4301' | sudo tee /etc/sysctl.d/99-seine-hugepages.conf
sudo sysctl --system

Для больших резервирований самый надёжный путь — сохранённая настройка плюс перезагрузка, потому что ядро резервирует страницы в начале загрузки, пока память ещё не фрагментирована. Затем запустите seine как обычно. Его режим страниц по умолчанию, auto, размещает арену каждого потока в зарезервированном пуле без дополнительных флагов.

Как добавить 1 GiB страницы?

1 GiB страницы требуют чуть больше настройки и добавляют около 2% поверх 2 MiB страниц. Каждой 2 GiB арене нужно ровно две такие страницы, так что запас считать не нужно. Они работают в Linux и WSL на x86_64.

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

hugepagesz=1G hugepages=18

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

echo 18 | sudo tee /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages
cat /sys/kernel/mm/hugepages/hugepages-1048576kB/free_hugepages

Строки HugePages_* в /proc/meminfo относятся только к размеру по умолчанию 2 MiB, поэтому пул 1 GiB страниц смотрите в /sys. Затем запустите seine в режиме 1 GiB:

./seine --cpu-page-mode large-1g

В этом режиме каждый поток размещает свою арену в пуле 1 GiB страниц, так что вы точно знаете, что весь запуск использовал 1 GiB страницы.

Как зарезервировать huge pages в WSL2?

WSL2 работает на настоящем ядре Linux, поэтому команды для Linux выше работают и в нём. Для 1 GiB страниц передайте параметры загрузки через %UserProfile%\.wslconfig на стороне Windows. Виртуальной машине также нужно достаточно памяти для резервирования плюс для служб Windows и WSL. На проверенном хосте seine с 64 GiB использовалась такая конфигурация:

[wsl2]
memory=48GB
processors=32
swap=8GB
kernelCommandLine = hugepagesz=1G hugepages=18

Сохраните файл, выполните wsl --shutdown в Windows и снова откройте свой дистрибутив. Перед началом майнинга убедитесь, что свободных страниц хватает на все потоки.

Как включить large pages в Windows?

Нативный майнинг в Windows обычно быстрее, чем в WSL на том же оборудовании, и там seine использует large pages Windows. Для этого нужно одно разрешение — Блокировка страниц в памяти (Lock pages in memory):

  1. Откройте secpol.msc, затем Локальные политики → Назначение прав пользователя.
  2. Добавьте своего пользователя в Блокировка страниц в памяти.
  3. Выйдите из системы и войдите снова: право применяется к новым сеансам.

secpol.msc входит в Windows Pro, Enterprise и Education. В редакциях Home выдайте то же право с помощью утилиты, например ntrights.

На этом настройка закончена. При запуске seine сам включает это право и выделяет 2 GiB арену каждого потока через VirtualAlloc с MEM_LARGE_PAGES — способом, который документирует Microsoft для памяти на больших страницах. Если large pages недоступны, seine майнит на обычных страницах и записывает в журнал причину вместе с точным способом исправления. seine никогда сам не меняет права учётной записи и не выводит вас из системы.

Какой режим страниц выбрать?

Режим по умолчанию подходит почти всем. Остальные режимы нужны для 1 GiB страниц и для измерений:

Режим Что делает
--cpu-page-mode auto (по умолчанию) Использует зарезервированные huge pages или large pages Windows, затем прозрачные huge pages, затем обычные страницы
--cpu-page-mode large Требует зарезервированные huge pages или large pages Windows для каждого потока и останавливается при запуске, если их нет
--cpu-page-mode large-1g Требует 1 GiB страницы для каждого потока (Linux и WSL на x86_64)
--cpu-page-mode regular Только обычные страницы, для сравнительного бенчмарка «до и после»

Чтобы измерить прирост на своей машине, помайните некоторое время с --cpu-page-mode regular, затем с auto или large-1g и сравните хешрейт на панели. На серверах с несколькими узлами NUMA зарезервированные страницы также должны находиться на тех узлах, где работают ваши потоки; об этом рассказывает руководство по майнингу на серверах.

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

Нужны ли huge pages, чтобы майнить Blocknet с seine?

Нет. seine начинает майнить на обычной памяти сразу после запуска и сам запрашивает у Linux прозрачные huge pages. Резервирование huge pages — дополнительная опция для последних нескольких процентов: около 4–6% с 2 MiB страницами на тестовом хосте и примерно ещё 2% с 1 GiB страницами.

Сколько huge pages нужно каждому потоку seine?

Каждому потоку нужно 1 024 страницы по 2 MiB, в которые ровно помещается его 2 GiB арена Argon2id, или две страницы по 1 GiB. Для 2 MiB страниц умножьте число потоков на 1 024, добавьте 5% запаса и округлите вверх. Восьми потокам нужно 8 602 страницы, это резервирует около 16,8 GiB ОЗУ.

Использует ли seine 1 GiB huge pages автоматически?

Режим страниц seine по умолчанию использует зарезервированный пул 2 MiB страниц, а затем прозрачные huge pages. Чтобы использовать 1 GiB страницы, зарезервируйте по две на поток, лучше при загрузке через hugepagesz=1G hugepages=N, и запустите seine с --cpu-page-mode large-1g. Этот режим работает в Linux и WSL на x86_64 и добавляет около 2% поверх 2 MiB страниц.

Как включить large pages для seine в Windows?

Выдайте своей учётной записи Windows право «Блокировка страниц в памяти» (Lock pages in memory) в secpol.msc в разделе «Локальные политики» → «Назначение прав пользователя», затем выйдите из системы и войдите снова. seine сам включает это право при запуске и выделяет 2 GiB арену каждого потока с large pages. В редакциях Home выдайте право с помощью утилиты, например ntrights.