Ubuntu 26.04 の KVM ホストで HugePages を使うための基本を整理します。HugePages は、VM のメモリを通常の 4 KiB page ではなく大きな page として扱い、TLB の負荷を下げるための仕組みです。
ただし HugePages は、入れれば必ず速くなる魔法ではありません。特に 1 GiB HugePages は起動時にまとまったメモリを予約する設計なので、ホストの物理メモリ、VM 数、VM サイズを見て計画的に割り当てる必要があります。
書籍
作って理解する仮想化技術 ── ハイパーバイザを実装しながら仕組みを学ぶ
ハイパーバイザ、CPU 仮想化支援、メモリ仮想化、割り込み、仮想デバイスなど、VM の性能設計を低レイヤから理解したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
HugePages を使う理由
VM は大きなメモリ領域を持つため、通常 page のまま大量に扱うと page table や TLB の負荷が増えます。HugePages を使うと、より大きな単位でメモリを管理できるため、仮想化環境のメモリアクセス効率を改善できる場合があります。
- TLB miss を減らしやすい
- VM の大容量メモリ割り当てと相性が良い
- メモリ性能の揺らぎを抑えやすい
- ホスト起動時に予約するため、VM 用メモリを明示的に確保できる
HugePages は汎用設定ではない
HugePages はすべての KVM ホストで必須ではありません。小さな検証 VM やメモリに余裕がないホストでは、通常 page のまま運用する方が扱いやすいこともあります。
特に 1 GiB HugePages は、予約した分だけ通常用途に使えるメモリが減ります。たとえば 32 GiB のホストで 1 GiB HugePages を 24 個予約すると、24 GiB を VM 用に固定的に確保することになります。
現在の HugePages 状態を確認する
まず、ホストが現在どの HugePages を持っているかを確認します。
grep -i huge /proc/meminfo
find /sys/kernel/mm/hugepages -maxdepth 2 -type f -name 'nr_hugepages' -o -name 'free_hugepages'
for d in /sys/kernel/mm/hugepages/hugepages-*; do
echo "== $d =="
cat "$d"/nr_hugepages "$d"/free_hugepages 2>/dev/null || true
doneHugePages_Total、HugePages_Free、Hugepagesize を見ます。1 GiB HugePages を使う場合、/sys/kernel/mm/hugepages/hugepages-1048576kB/ 側も確認します。
GRUB で 1 GiB HugePages を予約する
1 GiB HugePages は、起動時に予約するのが基本です。以下は Intel 環境で、1 GiB HugePages を 24 個予約する例です。
sudo cp -a /etc/default/grub /etc/default/grub.bak.$(date +%Y%m%d%H%M%S)
sudo sed -i \
's/^GRUB_CMDLINE_LINUX=.*/GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt default_hugepagesz=1G hugepagesz=1G hugepages=24"/' \
/etc/default/grub
sudo update-grub
sudo rebootAMD 環境では、IOMMU の指定は amd_iommu=on にします。HugePages の予約数はホストごとに決めます。32 GiB ホストで 24 個、より大きなメモリのホストで 96 個のように、物理メモリと VM 配置に合わせて設計します。
再起動後に予約状態を確認する
再起動後、カーネルコマンドラインと HugePages の状態を確認します。
cat /proc/cmdline
grep -i huge /proc/meminfo
cat /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages
cat /sys/kernel/mm/hugepages/hugepages-1048576kB/free_hugepagesnr_hugepages が期待値になっていない場合、物理メモリ不足、連続領域不足、カーネルパラメータの指定ミスを疑います。1 GiB HugePages は後から柔軟に増やせるものではないため、起動時の予約が重要です。
libvirt XML で HugePages を使う
VM 側では、libvirt XML に memoryBacking を追加します。これにより、VM のメモリ割り当てで HugePages を使うように指定します。
<memoryBacking>
<hugepages/>
</memoryBacking>この指定を入れた VM は、HugePages が不足していると起動に失敗することがあります。これは不具合ではなく、VM 用に予約した HugePages が足りないという意味です。
VM 起動時の確認
VM を起動したあと、HugePages の空き数が減るかを確認します。
before="$(cat /sys/kernel/mm/hugepages/hugepages-1048576kB/free_hugepages)"
echo "before=$before"
sudo virsh --connect qemu:///system start ubuntu-test-g01-n001-v.mgmt.s01.example.com
after="$(cat /sys/kernel/mm/hugepages/hugepages-1048576kB/free_hugepages)"
echo "after=$after"
sudo virsh --connect qemu:///system dommemstat ubuntu-test-g01-n001-v.mgmt.s01.example.comVM のメモリサイズと HugePages の消費量が対応しているかを見ます。4 GiB VM で 1 GiB HugePages を使うなら、おおむね 4 個分を消費する、という見方になります。
予約しすぎに注意する
HugePages を予約しすぎると、ホスト OS や VM 以外のプロセスが使える通常メモリが減ります。KVM ホスト専用機であっても、ホスト OS、libvirt、OVS / OVN、監視 agent などのメモリは必要です。
- 物理メモリすべてを HugePages にしない
- VM の最大同時起動数から必要量を見積もる
- ホスト OS と管理サービス用の通常メモリを残す
- VM を減らしたときに HugePages が余ることも考慮する
- NUMA を意識する場合は、どの node に HugePages があるかも確認する
NUMA と HugePages
複数 NUMA node を持つホストでは、HugePages がどの NUMA node に予約されるかも重要です。VM の CPU / メモリ配置と HugePages の node がずれると、期待した性能が出ない場合があります。
numactl --hardware
find /sys/devices/system/node -path '*hugepages*' -name nr_hugepages -print -exec cat {} \;小規模なホストでは深く考えなくてもよい場合がありますが、VM パフォーマンスを詰める場合は NUMA、CPU pinning、HugePages をセットで見ます。
確認ポイント
- HugePages を使う目的が明確である
- 1 GiB HugePages は起動時予約として扱っている
- ホスト OS 用の通常メモリを残している
- libvirt XML に
memoryBackingを設定している - VM 起動後に HugePages の消費量を確認している
- NUMA があるホストでは node ごとの HugePages も確認している
まとめ
Ubuntu 26.04 の KVM で HugePages を使う場合、単に XML に hugepages を書くだけでは不十分です。ホスト起動時に VM 用メモリを予約し、その予約量と VM 配置を対応させる必要があります。
HugePages は KVM の性能設計に効く重要な要素ですが、設定するとメモリ管理の自由度は下がります。VM 数、VM サイズ、NUMA、ホスト側の通常メモリを見ながら、必要な分だけ予約するのが現実的です。
関連記事
- Ubuntu 26.04 KVM VM の作成 – テンプレート qcow2 から libvirt domain を定義する
- Ubuntu 26.04 KVM の基本構築 – libvirt / OVS / OVN の土台を作る
- VM パフォーマンス Day3 – メモリ最適化と HugePages / TLB / NUMA の考え方
- VM パフォーマンス Day2 – CPU 最適化と NUMA / CPU ピニングの考え方
- VM パフォーマンス Day1 – VM の性能ボトルネックとは何か
- VM パフォーマンス最適化 – NUMA / CPU / I/O / ネットワークの設計ハブ
- KVM の io_uring はどれだけ効くのか – QEMU ストレージ I/O の検証



