ヒュージページを確保すると、seine は各マイニングスレッドのメモリを、数十万個の小さなページではなく少数の大きなページで扱えるようになります。このガイドでは、それによって Blocknet の Argon2id プルーフ・オブ・ワークが速くなる理由、確保すべきページ数、そして Linux、WSL2、Windows での具体的なコマンドを説明します。
ヒュージページで Blocknet のマイニングが速くなるのはなぜですか?
seine の各スレッドは 2 GiB の Argon2id アリーナの中でハッシュを計算し、その中の予測できない場所からブロックを読み出します。通常の 4 KiB ページでは、このアリーナは 524,288 ページにまたがり、CPU の TLB にキャッシュできる数をはるかに超えるアドレス変換が必要になります。ヒュージページなら 1,024 ページ、またはわずか 2 ページで済むため、ページテーブルの参照で読み出しが止まる回数が減ります。
メモリへのアクセスはすべて仮想アドレスから始まり、CPU はそれを物理アドレスに変換する必要があります。最近の変換結果はトランスレーション・ルックアサイド・バッファ(TLB)に保持されます。Linux カーネルのドキュメントは TLB を「仮想アドレスから物理アドレスへの変換のキャッシュ」であり、「プロセッサ上の非常に乏しいリソース」と説明しています。アドレスが TLB にない場合、CPU はデータの読み出しを始める前に、メモリ上のページテーブルをたどる必要があります。
Blocknet のプルーフ・オブ・ワークでは、このページテーブルの参照が頻繁に起こります。1 回のハッシュで 2 GiB のアリーナを 1 KiB のブロックで埋め、パスの後半では新しいブロックごとに、直前に計算したデータで位置が決まる以前のブロックを読み出します。Argon2id の解説記事で示しているとおり、これはハッシュ 1 回あたり約 2 GiB の分散した読み出しになります。その読み出しに必要なアドレス変換の数は、ページサイズで決まります。
| ページサイズ | 2 GiB アリーナあたりのページ数 |
|---|---|
| 4 KiB(通常) | 524,288 |
| 2 MiB | 1,024 |
| 1 GiB | 2 |
ヒュージページでは、1 つの TLB エントリが 512 倍または 262,144 倍のメモリをカバーします。そのためアリーナのはるかに多くの部分が TLB の届く範囲に収まり、各スレッドがハッシュ計算に使える時間が増えます。
ヒュージページでマイニングはどれくらい速くなりますか?
seine のヒュージページガイドは、ヒュージページを Linux での CPU マイニングにおける最も効果の大きいチューニング項目としています。検証ホストでは、確保した 2 MiB ページで約 4〜6%、1 GiB ページでさらに約 2% 向上しました。このガイドは、多数のスレッドを動かしている場合、命令セットのチューニングよりもヒュージページのカバー範囲のほうが通常は重要になるとも述べています。
seine のパフォーマンスチャートに載っているサーバーの結果は、明示的に確保した 2 MiB ヒュージページで測定したものです。2026 年 10 月に AMD EPYC Zen 5(EPYC 9R45)の 32 スレッドで測定した 49.4 H/s は、34,407 ページを確保して実行しました。これは下の表の 32 スレッドの行と同じ数です。世代ごとの全結果はマイニングハードウェアガイドにあります。
ページを確保していなくても、seine は Linux でカーネルに透過的ヒュージページを要求します。確保したプールはページをあらかじめ取り分けておくため、メモリの断片化が進んでいても、すべてのスレッドが確実にヒュージページを使えます。
seine に必要なヒュージページはいくつですか?
seine の各スレッドが 2 GiB のアリーナを収めるには、2 MiB のヒュージページが 1,024 ページ、または 1 GiB ページが 2 ページ必要です。2 MiB ページの場合は、スレッド数 × 1,024 × 1.05 を確保して切り上げると、5% の余裕が残ります。8 スレッドなら 8,602 ページ、約 16.8 GiB です。確保が足りないときは、seine が起動時に正確な数を表示します。
スレッド数は、seine のダッシュボードの Threads に表示される数です。seine は RAM とコア数からこの数を決めるので、まずヒュージページなしで一度 seine を起動し、その数を控えておきます。確保が少なすぎる場合、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 |
確保したページはヒュージページを要求するプログラム用に取り分けられるので、実際にマイニングするスレッド数に合わせて確保量を決めてください。seine はスレッド数を決める際に確保済みのプールを利用可能なメモリとして数えるため、ページを確保してもスレッド数はそのまま維持されます。
Linux で 2 MiB のヒュージページを設定するには?
スレッド数に合わせてページを確保します。次の例は 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 MiB ページよりさらに約 2% 速くなります。2 GiB のアリーナ 1 つにちょうど 2 ページ必要なので、余裕を計算する必要はありません。x86_64 の Linux と WSL で使えます。
これほど大きなページを確保するには、カーネルパラメータで起動時に確保するのが最も確実です。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
/proc/meminfo の HugePages_* の行はデフォルトの 2 MiB サイズしか対象にしないので、1 GiB のプールは /sys から読み取ります。その後、1 GiB モードで seine を起動します。
./seine --cpu-page-mode large-1g
このモードでは、すべてのスレッドが 1 GiB のプールからアリーナをマッピングするので、実行全体で 1 GiB ページが使われたことが確実にわかります。
WSL2 でヒュージページを確保するには?
WSL2 は本物の Linux カーネルで動いているので、上記の Linux のコマンドがそのまま使えます。1 GiB ページの場合は、Windows 側の %UserProfile%\.wslconfig で起動パラメータを渡します。VM には、確保するページに加えて Windows と WSL のサービス分のメモリも必要です。seine の検証に使った 64 GiB のホストでは、次の設定を使いました。
[wsl2]
memory=48GB
processors=32
swap=8GB
kernelCommandLine = hugepagesz=1G hugepages=18
ファイルを保存し、Windows から wsl --shutdown を実行して、ディストリビューションをもう一度開きます。マイニングを始める前に、空きページ数がすべてのスレッド分あることを確認してください。
Windows でラージページを有効にするには?
同じハードウェアなら、通常は WSL よりネイティブの Windows でマイニングするほうが速く、seine はそこで Windows のラージページを使います。必要な権限は Lock pages in memory(メモリ内のページのロック)の 1 つだけです。
secpol.mscを開き、ローカル ポリシー → ユーザー権利の割り当て に進みます。- Lock pages in memory(メモリ内のページのロック)にお使いのユーザーを追加します。
- この権利は新しいセッションに適用されるので、サインアウトしてもう一度サインインします。
secpol.msc は Windows の Pro、Enterprise、Education に付属しています。Home エディションでは、ntrights などのツールで同じ権利を付与します。
設定はこれだけです。seine は起動時にこの権利を自身で有効にし、Microsoft がドキュメント化しているラージページメモリの確保方法である VirtualAlloc と MEM_LARGE_PAGES で、各スレッドの 2 GiB アリーナを確保します。ラージページが使えない場合、seine は通常のページでマイニングし、その理由と具体的な解決方法をログに出力します。seine がアカウントの権利を変更したり、ユーザーをサインアウトさせたりすることはありません。
どのページモードを使えばよいですか?
ほとんどの人にはデフォルトが最適です。その他のモードは、1 GiB ページを使う場合や測定用に用意されています。
| モード | 動作 |
|---|---|
--cpu-page-mode auto(デフォルト) |
確保済みのヒュージページまたは Windows のラージページを使い、次に透過的ヒュージページ、最後に通常のページを使います |
--cpu-page-mode large |
すべてのスレッドに確保済みのヒュージページまたは Windows のラージページを必須とし、足りない場合は起動時に停止します |
--cpu-page-mode large-1g |
すべてのスレッドに 1 GiB ページを必須とします(x86_64 の Linux と WSL) |
--cpu-page-mode regular |
通常のページのみを使います。導入前後のベンチマーク用です |
お使いのマシンで効果を測るには、--cpu-page-mode regular でしばらくマイニングし、次に auto または large-1g でマイニングして、ダッシュボードのハッシュレートを比べます。NUMA ノードが複数あるサーバーでは、確保したページがスレッドを動かすノード上にある必要もあります。詳しくはサーバーでのマイニングガイドで説明しています。
よくある質問
seine で Blocknet をマイニングするのにヒュージページは必要ですか?
いいえ。seine は起動するとすぐに通常のメモリでマイニングを始め、Linux には自動で透過的ヒュージページを要求します。ヒュージページの確保は最後の数パーセントを引き出すための追加設定で、検証ホストでは 2 MiB ページで約 4〜6%、1 GiB ページではさらに約 2% の効果がありました。
seine の 1 スレッドあたり何ページのヒュージページが必要ですか?
1 スレッドあたり 2 MiB ページが 1,024 ページ必要で、これで 2 GiB の Argon2id アリーナがちょうど収まります。1 GiB ページなら 2 ページです。2 MiB ページの場合は、スレッド数に 1,024 を掛け、5% の余裕を加えて切り上げます。8 スレッドなら 8,602 ページで、約 16.8 GiB の RAM を確保します。
seine は 1 GiB のヒュージページを自動で使いますか?
seine のデフォルトのページモードは、確保済みの 2 MiB プールを使い、次に透過的ヒュージページを使います。1 GiB ページを使うには、1 スレッドあたり 2 ページを、できれば起動時に hugepagesz=1G hugepages=N で確保し、seine を --cpu-page-mode large-1g で起動します。このモードは x86_64 の Linux と WSL で動作し、2 MiB ページよりさらに約 2% 速くなります。
Windows で seine のラージページを有効にするには?
secpol.msc の「ローカル ポリシー」→「ユーザー権利の割り当て」で、お使いの Windows アカウントに Lock pages in memory(メモリ内のページのロック)の権利を付与し、サインアウトしてもう一度サインインします。seine は起動時にこの権利を自身で有効にし、各スレッドの 2 GiB アリーナをラージページで確保します。Home エディションでは ntrights などのツールで権利を付与します。