手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 26.04 KVM HugePages の基本 – VM 用メモリを起動時に予約する

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
done

HugePages_TotalHugePages_FreeHugepagesize を見ます。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 reboot

AMD 環境では、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_hugepages

nr_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.com

VM のメモリサイズと 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 HugePages の基本 – VM 用メモリを起動時に予約する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る