Ubuntu 26.04 の KVM 環境で、作成した仮想マシンが意図した性能前提で動いているかを確認します。ここでの目的は、単発のベンチマーク数値を競うことではなく、CPU、メモリ、ストレージ I/O、ネットワークの各層で、設定した前提が反映されているかを見ることです。
この環境では、libvirt XML に host-passthrough、virtio、io_uring、cache=none、HugePages、Open vSwitch / OVN 接続などを含めています。性能確認では、まずそれらが実際の VM に入っているかを確認します。
書籍
作って理解する仮想化技術 ── ハイパーバイザを実装しながら仕組みを学ぶ
ハイパーバイザ、CPU 仮想化支援、メモリ仮想化、割り込み、仮想デバイスなど、VM の性能設計を低レイヤから理解したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
性能確認はベンチマークの前に状態を見る
VM の性能が出ない場合、いきなり fio や iperf3 の数値を見るより、先に構成状態を確認した方が原因を追いやすくなります。
- VM が想定した vCPU / memory で定義されているか
- CPU mode が
host-passthroughになっているか - ディスク bus が
virtioになっているか - disk driver の
io、cache、discardが意図通りか - HugePages が使われているか
- 仮想 NIC が
virtioになっているか - OVS / OVN 側で VM interface が見えているか
libvirt XML を確認する
まず、VM の libvirt XML を確認します。VM 作成時に定義した CPU、メモリ、ディスク、NIC が反映されているかを見ます。
VM_NAME="ubuntu-test-g01-n001-v.mgmt.s01.example.com"
sudo virsh --connect qemu:///system dumpxml "$VM_NAME" > "/tmp/${VM_NAME}.xml"
grep -E '<vcpu|<memory|<currentMemory|<cpu|<topology|<memoryBacking|<hugepages' "/tmp/${VM_NAME}.xml"
grep -E '<disk|<driver|<target dev|<interface|<model|<virtualport|interfaceid' "/tmp/${VM_NAME}.xml"XML 上で host-passthrough、hugepages、virtio、io_uring が見えるかを確認します。ここで見えない場合、ベンチマーク以前に VM 定義が意図と異なっています。
VM の CPU とメモリを確認する
ホスト側から VM のリソース状態を確認します。
VM_NAME="ubuntu-test-g01-n001-v.mgmt.s01.example.com"
sudo virsh --connect qemu:///system dominfo "$VM_NAME"
sudo virsh --connect qemu:///system vcpuinfo "$VM_NAME"
sudo virsh --connect qemu:///system dommemstat "$VM_NAME"
sudo virsh --connect qemu:///system domstats "$VM_NAME" --vcpu --balloonVM 内でも CPU、メモリ、NUMA の見え方を確認します。
lscpu
free -h
numactl --hardware 2>/dev/null || true
cat /proc/meminfo | grep -i hugeHugePages の消費を確認する
HugePages を使う VM では、VM 起動前後で free hugepages が減るかを確認します。
cat /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages
cat /sys/kernel/mm/hugepages/hugepages-1048576kB/free_hugepages
sudo virsh --connect qemu:///system list --allVM が起動しているのに HugePages が消費されていない場合、XML の memoryBacking、HugePages の予約サイズ、VM のメモリサイズを確認します。逆に HugePages が不足している場合、VM は起動に失敗することがあります。
ストレージ I/O を確認する
ストレージ I/O は、VM 内での fio と、ホスト側の disk 定義をセットで見ます。単に IOPS が高いか低いかではなく、virtio / io_uring / cache 設定が意図通りかを確認します。
sudo apt update
sudo apt install -y fio
fio --name=randread \
--filename=/tmp/fio-test.img \
--size=2G \
--direct=1 \
--rw=randread \
--bs=4k \
--iodepth=32 \
--numjobs=1 \
--runtime=60 \
--time_based \
--group_reportingこの結果は VM 内のファイルシステム、ホスト側ストレージ、qcow2、cache 設定、I/O engine の影響を受けます。数値だけを切り出さず、条件を記録して比較します。
ネットワークを確認する
ネットワークは、VM 内の NIC、libvirt の interface、OVS / OVN の port を順に確認します。
# VM 内
ip -br link
ip -br addr
ethtool -i enp1s0 2>/dev/null || true
# ホスト側
VM_NAME="ubuntu-test-g01-n001-v.mgmt.s01.example.com"
sudo virsh --connect qemu:///system domiflist "$VM_NAME"
sudo ovs-vsctl show
sudo ovn-nbctl show帯域を測る場合は iperf3 を使います。ただし、測定先、MTU、OVS / OVN、ACL、上位 network の条件で結果が変わります。
sudo apt install -y iperf3
# 測定先で実行
iperf3 -s
# VM 側で実行
iperf3 -c 10.1.0.10 -P 4 -t 30ホスト側の負荷を見る
VM 内の数値だけでは、ホスト側で何が詰まっているか分かりません。VM 実行中に、ホスト側の CPU、I/O、network の状態も確認します。
top
iostat -xz 1
vmstat 1
sudo ovs-vsctl show
sudo virsh --connect qemu:///system domstats "$VM_NAME"確認結果を比較できる形で残す
性能確認では、結果の数値だけでなく条件を残すことが重要です。同じ VM でも、HugePages の有無、io_uring の有無、cache 設定、MTU、接続先 bridge が変わると結果は変わります。
- VM 名、vCPU、memory、CPU mode
- HugePages の有無と page size
- ディスク形式、bus、driver io、cache
- NIC model、bridge、OVN logical switch
- 測定コマンドと runtime
- ホスト側の負荷状況
よく見る問題
- VM XML ではなく古い domain 定義で起動している
- HugePages が不足して VM が起動しない
- virtio ではなく emulated device になっている
- OVN ACL や routing の問題を性能問題と誤認している
- fio の対象が一時ファイルで、実際に見たい disk と違う
- 測定中にホスト側の別 VM や storage 負荷が重なっている
まとめ
Ubuntu 26.04 の KVM VM 性能確認では、ベンチマークの数値を見る前に、VM が意図した構成で動いているかを確認します。CPU、HugePages、virtio、io_uring、OVS / OVN、ACL、ストレージ条件を分けて見ることで、性能問題を切り分けやすくなります。
VM パフォーマンスは単一の設定で決まるものではありません。KVM ホスト、VM XML、仮想ディスク、仮想 NIC、ネットワーク、ストレージの層を順番に確認することが重要です。
関連記事
- Ubuntu 26.04 KVM VM の作成 – テンプレート qcow2 から libvirt domain を定義する
- Ubuntu 26.04 KVM HugePages の基本 – VM 用メモリを起動時に予約する
- VM パフォーマンス Day4 – ストレージ I/O 最適化と virtio / raw / qcow2 / io_uring の考え方
- KVM の io_uring はどれだけ効くのか – QEMU ストレージ I/O の検証
- VM パフォーマンス Day5 – virtio-net の構造と仮想 NIC の性能特性
- VM パフォーマンス Day2 – CPU 最適化と NUMA / CPU ピニングの考え方
- VM パフォーマンス Day3 – メモリ最適化と HugePages / TLB / NUMA の考え方
- VM パフォーマンス最適化 – NUMA / CPU / I/O / ネットワークの設計ハブ



