Если зарезервировать 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):
- Откройте
secpol.msc, затем Локальные политики → Назначение прав пользователя. - Добавьте своего пользователя в Блокировка страниц в памяти.
- Выйдите из системы и войдите снова: право применяется к новым сеансам.
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.