はじめに
VM の性能を最適化するうえで、CPU と並んで重要になるのがメモリです。
仮想化環境では、ゲスト OS・ハイパーバイザー・ホスト OS の複数レイヤがメモリ管理に関与するため、物理サーバーよりも複雑な構造になっています。この複雑さが遅延やオーバーヘッドを生み、結果として VM の性能低下につながります。
本記事では、メモリに関する主要なボトルネックを整理しつつ、次の 3 点を中心に最適化のポイントを解説します。
- HugePages
- TLB(Translation Lookaside Buffer)
- NUMA ノードの整合性
これらは、ハイパーバイザーにおけるメモリパフォーマンスの基盤です。
HugePages によるページ管理の効率化
仮想環境では、通常 4KB ページを大量に扱います。しかし、4KB ページを多量に保持することは、TLB(後述)の負担を増やし、ページウォークにも余計なコストがかかります。
HugePages を利用すると、メモリを 2MB や 1GB のページで扱えるようになり、管理コストが大幅に削減されます。
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 最適化の効果が最大化されます。

