Якщо зарезервувати 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 виміряно з явно зарезервованими huge pages по 2 MiB. Результат 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 враховує зарезервований пул як доступну пам’ять, коли визначає кількість потоків, тож резервування сторінок не зменшує кількість потоків.
Як налаштувати huge pages по 2 MiB у 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 huge pages по 1 GiB автоматично?
Режим сторінок 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.