Ubuntu 26.04 上の KVM VM で性能を確認する時は、いきなりベンチマークの数字を見るのではなく、まず VM がどの構成で起動しているかを確認します。vCPU、NUMA、HugePages、virtio、disk driver、cache mode、io_uring、network device が意図した状態でなければ、測定結果を正しく読めません。
この記事では、KVM / libvirt / QEMU の VM パフォーマンス確認を、構成確認、ホスト側の状態確認、ゲスト側の確認、簡易ベンチマークの順に整理します。目的は最高値を競うことではなく、設定が効いているか、どこにボトルネックがあるかを切り分けられる状態にすることです。
この記事の位置づけ
KVM VM の性能確認は、virtio、HugePages、io_uring、OVS、OVN などの設定が、実際の VM に反映されているかを見る作業です。ベンチマークは最後の確認材料であり、最初に見るものではありません。
性能確認はベンチマークの前に状態を見る
VM が遅い場合、原因は guest OS の中だけにあるとは限りません。host 側の CPU、メモリ、ディスク、ネットワーク、QEMU process、libvirt XML、OVS / OVN のどこかに原因があることもあります。
| 見る場所 | 確認する内容 |
|---|---|
| libvirt XML | vCPU、memoryBacking、disk driver、interface model |
| host CPU | NUMA、CPU 使用率、QEMU thread、steal / wait の傾向 |
| memory | HugePages の予約数、消費量、空き量 |
| storage | virtio、io_uring、cache mode、backend I/O |
| network | virtio-net、tap、OVS / OVN、host NIC、packet drop |
| guest OS | CPU wait、I/O wait、throughput、latency |
libvirt XML を確認する
まず VM の libvirt XML を確認します。ここには、VM がどの仮想デバイス、disk driver、network interface、memory backing で定義されているかが出ます。
sudo virsh list --all
sudo virsh dumpxml vm-example > /tmp/vm-example.xml
grep -E "vcpu|memoryBacking|driver|interface|model|target|source" /tmp/vm-example.xmlmemoryBacking に hugepages があるか、disk の driver が qemu / qcow2 / io_uring など意図した値になっているか、network interface が virtio になっているかを確認します。
CPU と NUMA の状態を確認する
vCPU の数だけを見ても、VM の CPU 性能は判断できません。物理 CPU、NUMA node、QEMU process の配置、host 側の負荷を合わせて見る必要があります。
lscpu
numactl --hardware
sudo virsh vcpuinfo vm-example
ps -eLo pid,tid,psr,comm,args | grep -E "qemu-system|CPU"NUMA をまたぐ構成では、CPU とメモリの距離が性能に影響します。単一 VM に多くの vCPU を割り当てる場合は、物理コア数、SMT、NUMA node、他 VM との競合を見て判断します。
HugePages の予約と消費を確認する
HugePages を使う VM では、VM 起動前に host 側で HugePages が予約されている必要があります。予約が足りなければ VM が起動できないことがあり、予約しすぎれば host の通常メモリを圧迫します。
grep -E "Huge|AnonHuge" /proc/meminfo
find /sys/devices/system/node -name "hugepages-*" -type d -print
cat /sys/devices/system/node/node*/hugepages/hugepages-1048576kB/free_hugepagesHugePages_Total、HugePages_Free、NUMA node ごとの空き数を見ます。VM 起動前後で値を比較すると、その VM がどの程度 HugePages を消費しているか確認できます。
ストレージ I/O の経路を確認する
KVM のストレージ性能は、仮想ディスク形式だけでは決まりません。guest filesystem、virtio device、QEMU driver、cache mode、host filesystem、物理ディスクまで含めた経路で見ます。
sudo virsh domblklist vm-example
sudo virsh domblkinfo vm-example vda
qemu-img info /var/lib/libvirt/images/vm-example.qcow2
iostat -xz 1qcow2 は管理しやすい一方で、用途によっては raw よりオーバーヘッドがあります。io_uring や cache mode を使っている場合も、設定値だけではなく host 側の I/O wait や device utilization を合わせて確認します。
ゲスト側で I/O を確認する
host 側だけでなく、guest OS から見た I/O も確認します。guest で遅く見えていても、host 側では別 VM との競合や storage backend の詰まりとして見えることがあります。
lsblk
cat /sys/block/vda/queue/scheduler
vmstat 1
iostat -xz 1ここでは数値そのものより、I/O wait が増えているのか、device utilization が張り付いているのか、queue が詰まっているのかを見ます。
ネットワーク I/O を確認する
VM のネットワーク性能を見る時は、guest の仮想 NIC、host の tap device、OVS / OVN、物理 NIC の順に経路を追います。virtio-net が使われていても、host 側の bridge、Open vSwitch、OVN の設計によって性能や遅延は変わります。
ip -s link
sudo virsh domiflist vm-example
sudo ovs-vsctl show
sudo ovs-ofctl dump-ports br-int
sudo ovn-nbctl showpacket drop、error、OVS port、logical switch port、external path を確認します。VM 内だけで iperf3 を実行しても、どの区間が詰まっているかは分かりません。
QEMU process と host 側の負荷を見る
VM は host から見ると QEMU process です。guest OS の中だけを見ていると、host 側の CPU wait、I/O wait、他 VM との競合、QEMU thread の偏りを見落とします。
top -H -p $(pgrep -f "qemu-system.*vm-example" | head -n 1)
pidstat -p $(pgrep -f "qemu-system.*vm-example" | head -n 1) -t 1
mpstat -P ALL 1CPU 使用率が高いこと自体は異常ではありません。どの thread が動いているのか、特定 CPU に偏っていないか、host 全体に余力があるかを合わせて見ます。
簡易ベンチマークは確認範囲を決めて実行する
ベンチマークは、構成確認の後に使います。何を測っているのかを決めずに実行すると、数字だけが残り、設計判断につながりません。
fio --name=randread --filename=/tmp/fio-test.img --size=1G --rw=randread --bs=4k --iodepth=32 --runtime=30 --time_based --direct=1
iperf3 -s
iperf3 -c 10.0.0.10 -P 4 -t 30fio はストレージ I/O、iperf3 はネットワーク throughput の確認に使えます。ただし、短時間の結果だけで性能を断定せず、host 側の CPU、I/O、network counter と合わせて読みます。
よくある見落とし
- VM 内の CPU 使用率だけを見て、host 側の QEMU process を見ていない
- vCPU を増やせば速くなると思い、NUMA と物理コア数を見ていない
- HugePages を設定したつもりで、実際の予約数と消費量を確認していない
- qcow2 / raw / cache mode / io_uring の違いを見ずに、disk benchmark の数字だけを見る
- guest 側の
iperf3だけで、OVS / OVN / host NIC の counter を見ていない - ベンチマークの値を比較しているだけで、どの設計判断に使う数値なのかを決めていない
書籍
作って理解する仮想化技術
KVM / QEMU のような仮想化基盤を、CPU、メモリ、仮想デバイス、I/O の観点から理解したい場合の参考書籍です。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
まとめ
Ubuntu 26.04 で KVM VM のパフォーマンスを確認する時は、ベンチマークの数字を見る前に、VM の構成が意図通りになっているかを確認します。libvirt XML、vCPU、NUMA、HugePages、virtio、io_uring、OVS / OVN、QEMU process を見てからでなければ、性能測定の結果は正しく読めません。
VM の中だけを見るのではなく、host 側の CPU、メモリ、ディスク、ネットワークまで合わせて見ることが重要です。性能確認とは、速い数字を出すことではなく、どこまでが正常で、どこからがボトルネックなのかを切り分けるための作業です。

