VM の CPU 性能は、vCPU 数を増やせば単純に上がるものではありません。vCPU がどの pCPU で動くのか、メモリがどの NUMA node に確保されるのか、QEMU の emulator thread や IRQ がどこで動くのかによって、同じリソース量でも挙動は変わります。
この記事では、CPU / NUMA / pinning を、単なる高速化設定ではなく、VM の実行場所を安定させる設計として整理します。後続の vhost-user、SR-IOV、DPDK のような I/O 最適化も、この土台が崩れていると効果が見えにくくなります。
vCPU と pCPU を分けて考える
VM に割り当てる vCPU は、物理 CPU そのものではありません。host 側の scheduler が、vCPU thread をどの pCPU で実行するかを決めます。つまり、vCPU 数だけを見ても、実際にどの CPU で処理されているかは分かりません。
| 要素 | 意味 | 見るべきこと |
|---|---|---|
| vCPU | VM に見せる仮想 CPU | VM に何個割り当てるか |
| pCPU | host の物理 CPU thread | どの pCPU で vCPU thread を実行するか |
| QEMU thread | emulator、I/O、管理系の処理 | vCPU と混ぜるか分けるか |
| IRQ | NIC や storage の割り込み処理 | dataplane と同じ CPU に載せるか分けるか |
CPU pinning は専用化の設計である
CPU pinning は、単に性能を上げる設定ではありません。vCPU thread を特定の pCPU に固定し、host scheduler による揺らぎや他 VM との競合を減らすための設計です。
その代わり、CPU の柔軟な共有は難しくなります。best effort な VM では overcommit と scheduler に任せる方が扱いやすい場合がありますが、NFV や低遅延処理のように決定性を重視する VM では pinning の意味が大きくなります。
NUMA を跨ぐと CPU が速くても遅くなる
NUMA 環境では、CPU socket ごとに近いメモリ領域が存在します。vCPU が node 0 の CPU で動いているのに、VM のメモリが node 1 に確保されていると、remote memory access が増えます。CPU 自体が速くても、メモリアクセスで遅くなることがあります。
NIC や NVMe などの PCIe デバイスも NUMA node と関係します。SR-IOV、PCI Passthrough、DPDK を使う場合は、NIC、CPU、HugePages、VM の vCPU 配置を合わせて見る必要があります。
HugePages はメモリ配置の安定にも効く
HugePages は TLB miss を減らすだけでなく、VM のメモリをどの NUMA node にどれだけ確保するかを設計しやすくします。特に DPDK や NFV 系の workload では、HugePages と CPU pinning、NUMA 配置をセットで扱うことが多くなります。
Transparent HugePages は便利ですが、性能決定性を求める VM では明示的な HugePages を使う方が挙動を読みやすい場合があります。
emulatorpin と IRQ を無視しない
vCPU を pinning しても、QEMU の emulator thread や I/O thread、IRQ 処理が同じ CPU に載ると、意図しない揺らぎが出ることがあります。特に packet forwarding 系 VM では、dataplane 用 CPU と管理・補助処理用 CPU を分ける設計が重要になります。
emulatorpin は、QEMU の emulator thread をどの CPU に置くかを指定するための考え方です。vCPU だけでなく、VM を支える host 側 thread も含めて配置を考えます。
現在のホストで確認すること
まずは、CPU、NUMA、HugePages、PCIe / NIC の配置を確認します。ここを見ずに VM の性能だけを測っても、どこが律速しているか分かりにくくなります。
lscpu
numactl --hardware
grep -i huge /proc/meminfo
lspci -tv
cat /proc/interruptsCPU / NUMA と I/O 最適化の関係
| 後続の技術 | CPU / NUMA 側で効く前提 |
|---|---|
| vhost-net / vhost-user | vCPU、QEMU thread、dataplane thread の CPU 配置 |
| SR-IOV | NIC の NUMA node と VM の vCPU / memory 配置 |
| PCI Passthrough | 渡すデバイスの PCIe / NUMA 配置と VM の専有設計 |
| DPDK | PMD thread、HugePages、NIC、CPU pinning の整合性 |
つまり、CPU / NUMA の設計は単独の最適化ではありません。ネットワーク I/O や storage I/O を高速化する場合でも、最終的には CPU がどこで処理し、メモリとデバイスがどこにあるかに戻ってきます。
設計時の確認ポイント
- VM は best effort でよいのか、決定性が必要なのか
- CPU overcommit を許容するのか、専有に近づけるのか
- vCPU、emulator thread、IRQ、I/O thread を同じ CPU に置くのか分けるのか
- VM のメモリと vCPU が同じ NUMA node に寄っているか
- NIC / NVMe / HBA の PCIe 配置と VM の CPU 配置が合っているか
- HugePages を明示的に使う必要があるか
参考書籍
書籍
ハイパーバイザ、CPU 仮想化支援、メモリ仮想化、割り込み、仮想デバイスなど、VM の性能設計を低レイヤから理解したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
VM パフォーマンスシリーズ
- VM パフォーマンス最適化の設計ハブ
シリーズ全体の入口です。CPU、NUMA、I/O、ネットワークを設計テーマ別に整理しています。 - vhost-net / vhost-user で VM ネットワークを高速化する考え方
virtio-net、vhost-net、vhost-user の違いを kernel bypass の観点で整理します。 - SR-IOV / PCI Passthrough で VM ネットワークを高速化する考え方
仮想化レイヤを迂回して物理デバイスへ近づける設計を整理します。 - DPDK で VM ネットワークを高速化する考え方
userspace dataplane と NFV の観点から DPDK を整理します。
関連する記事
- CPU pinning を外すことはサービスモデルを変える
CPU pinning を外す変更が、専有実行から共有実行への変更になるという観点で整理した記事です。
まとめ
CPU / NUMA / pinning は、VM の CPU 性能だけでなく、I/O 性能の土台にもなります。vCPU 数を増やすだけではなく、どの pCPU で動くのか、メモリがどこにあるのか、NIC や IRQ がどの CPU と NUMA node に紐づくのかを見る必要があります。
VM パフォーマンスを安定させるには、CPU pinning、HugePages、emulatorpin、IRQ、PCIe / NUMA 配置を、個別の設定ではなく一つの実行モデルとして考えることが重要です。


