手当たり次第に書くんだ

飽きっぽいのは本能

VM パフォーマンス Day3: メモリ最適化

はじめに

VM の性能を最適化するうえで、CPU と並んで重要になるのがメモリです。

仮想化環境では、ゲスト OS・ハイパーバイザー・ホスト OS の複数レイヤがメモリ管理に関与するため、物理サーバーよりも複雑な構造になっています。この複雑さが遅延やオーバーヘッドを生み、結果として VM の性能低下につながります。

本記事では、メモリに関する主要なボトルネックを整理しつつ、次の 3 点を中心に最適化のポイントを解説します。

  • HugePages
  • TLB(Translation Lookaside Buffer)
  • NUMA ノードの整合性

これらは、ハイパーバイザーにおけるメモリパフォーマンスの基盤です。

HugePages によるページ管理の効率化

仮想環境では、通常 4KB ページを大量に扱います。しかし、4KB ページを多量に保持することは、TLB(後述)の負担を増やし、ページウォークにも余計なコストがかかります。

HugePages を利用すると、メモリを 2MB1GB のページで扱えるようになり、管理コストが大幅に削減されます。

HugePages を使うと何が改善されるか

HugePages による効果は明確です。

  • TLB ミスが減る
  • ページウォークが短くなる
  • アクセスの局所性が改善される
  • メモリ全体のレイテンシが低下する

KVM 環境では、HugePages を利用しただけで 5〜20% 程度の性能向上が見られるケースも珍しくありません。特に io_uring、DPDK、ストレージ仮想化(Ceph / NVMe パススルー)など、メモリアクセスが頻繁に発生するワークロードでは効果が大きくなります。

2MB と 1GB HugePages の使い分け

2MB HugePages

  • 汎用的で扱いやすい(多くの Linux 環境におけるデフォルト)
  • 多くのワークロードで十分に効果がある
  • メモリ断片化のリスクが低い

1GB HugePages

  • TLB 効率がさらに改善
  • メモリ集約型の VM(DB・NFV・分析系)で効果が大きい
  • ただし 事前予約が必要で、確保に失敗しやすい

高パフォーマンスが必要な VM には積極的に検討できますが、運用では 2MB HugePages が現実的な選択肢になることも多いです。

HugePages の注意点

  • 動的確保ができない(事前確保が必要)
  • メモリ割り当ての柔軟性が下がる
  • NUMA 単位で割り当てが必要(後述)

これらに注意しつつ、VM 用に専用の HugePages を割り当てると効果が最大化されます。

TLB(Translation Lookaside Buffer)の理解

TLB は、メモリアドレス変換結果をキャッシュする仕組みです。仮想環境ではページテーブルが二重化されるため、TLB の役割がさらに重要になります。

HugePages を使うかどうかは「TLB ミスをどれだけ減らせるか」という議論と密接に関係しています。

TLB ミスが増えると何が起こるか

  • ページウォークの回数が増える
  • CPU がアドレス変換に専念し、本来の処理が遅れる
  • ネットワーク、ストレージ、DB の処理にも影響が波及する

TLB ミスは見えづらいボトルネックですが、性能に直結するため HPC やクラウド基盤では重視されます。

HugePages と TLB の関係

  • HugePages を使うと TLB に載るページ数が減り、効率が大幅に改善する
  • 4KB ページを大量に扱う状況では、TLB がすぐに溢れる

そのため、メモリアクセスが多い VM では HugePages の利用が基本戦略となります。

NUMA メモリ配置の最適化

NUMA 環境では、CPU・メモリ・PCIe デバイスが物理的にノード単位で分かれています。適切に配置しないと、メモリアクセスが“遠回り”になり、レイテンシが大きく悪化します。

NUMA を跨ぐと起こる問題

  • メモリアクセスが遅くなる
  • 帯域が低下する
  • CPU キャッシュの無効化が増える
  • ネットワークやストレージ性能にも間接的な影響が出る

特に CPU ピニング済みの VM では、vCPU を NUMA 0、メモリを NUMA 1 といった配置ミスが簡単に性能劣化を生みます。CPU とメモリは一体で扱うべきリソースです。

PCIe デバイス(SR-IOV / NVMe)の NUMA ノードにも注意

SR-IOV の VF や NVMe SSD は、特定の NUMA ノードに物理的に接続されていますが、以下のような構成になると、ネットワークパスが 2 倍以上のレイテンシになるケースもあります。

  • vCPU:NUMA0
  • メモリ:NUMA0
  • NIC(VF):NUMA1

最適化の基本は、これらを必ず同じ NUMA ノードに寄せることが重要です。

  • vCPU:NUMA0
  • メモリ:NUMA0
  • NIC(VF):NUMA0

バルーニング(メモリオーバーコミット)の禁止

CPU と同様、メモリのオーバーコミットも性能面ではデメリットが大きくなります。

  • balloon が動くと頻繁にページが移動する
  • TLB の状態が乱れる
  • スワップ発生時に性能が壊滅する

性能を最優先する VM では、メモリはホスト側で事前固定(HugePages)し、オーバーコミットしない
ことが基本です。

まとめ

メモリ最適化は、CPU と同じくらい重要な最適化領域です。

  • HugePages による TLB 効率化
  • NUMA ノードの整合性
  • メモリオーバーコミットの排除
  • 1GB / 2MB ページの使い分け

これらの最適化が正しく行われることで、後続の SR-IOV、DPDK、NVMe パススルーなどの I/O 最適化の効果が最大化されます。

次回(Day4)は ストレージ最適化に進みます。

VM パフォーマンス Day3: メモリ最適化

コメントを残す

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

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

トップへ戻る