手当たり次第に書くんだ

飽きっぽいのは本能

CPU / NUMA / pinning で VM パフォーマンスを安定させる考え方

VM パフォーマンス最適化の設計ハブへ戻る

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 で処理されているかは分かりません。

要素意味見るべきこと
vCPUVM に見せる仮想 CPUVM に何個割り当てるか
pCPUhost の物理 CPU threadどの pCPU で vCPU thread を実行するか
QEMU threademulator、I/O、管理系の処理vCPU と混ぜるか分けるか
IRQNIC や 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/interrupts

CPU / NUMA と I/O 最適化の関係

後続の技術CPU / NUMA 側で効く前提
vhost-net / vhost-uservCPU、QEMU thread、dataplane thread の CPU 配置
SR-IOVNIC の NUMA node と VM の vCPU / memory 配置
PCI Passthrough渡すデバイスの PCIe / NUMA 配置と VM の専有設計
DPDKPMD 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 パフォーマンスシリーズ

関連する記事

まとめ

CPU / NUMA / pinning は、VM の CPU 性能だけでなく、I/O 性能の土台にもなります。vCPU 数を増やすだけではなく、どの pCPU で動くのか、メモリがどこにあるのか、NIC や IRQ がどの CPU と NUMA node に紐づくのかを見る必要があります。

VM パフォーマンスを安定させるには、CPU pinning、HugePages、emulatorpin、IRQ、PCIe / NUMA 配置を、個別の設定ではなく一つの実行モデルとして考えることが重要です。

VM パフォーマンス最適化の設計ハブへ戻る

CPU / NUMA / pinning で VM パフォーマンスを安定させる考え方

コメントを残す

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

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

トップへ戻る