最近 FreeBSD 用の virtio ドライバに割と情熱を注いでいるのですが(そろそろ公開したい!)、
ドライバの性能が出ないという状況になって調査したときに多少ノウハウが得られたのでメモがてら掲載しておきます。
まずの一つ目のネタ。kvm_statコマンド。
kvm statistics
efer_reload 0 0
exits 401230913 2152
fpu_reload 52997 0
halt_exits 133189538 757
halt_wakeup 5259576 15
host_state_reload 170030018 977
hypercalls 0 0
insn_emulation 252392427 1359
insn_emulation_fail 0 0
invlpg 2684292 0
io_exits 4130425 17
irq_exits 8935347 39
irq_injections 3195682 0
irq_window 0 0
largepages 0 0
mmio_exits 28482276 179
mmu_cache_miss 698023 0
mmu_flooded 40079 0
mmu_pde_zapped 216076 0
mmu_pte_updated 180285 0
mmu_pte_write 1931218 0
mmu_recycled 0 0
mmu_shadow_zapped 696204 0
mmu_unsync 877 0
nmi_injections 0 0
nmi_window 0 0
pf_fixed 4719781 0
pf_guest 817765 0
remote_tlb_flush 234452 0
request_irq 0 0
signal_exits 0 0
tlb_flush 4903428 0
性能が出ていない場合には非常に参考になる内容です。ソースコードなどを見て何をしてくれているのか調査したわけではないのですが・・・
exits発生したVMEXITすべての回数を示します。VMEXITとはIntel VT/AMD-VのCPU仮想化支援技術においてVMを実行し、何らかの理由(I/Oとかメモリ管理で何かがおきてVMMの介入が必要になったとか、タイムスライスを使い切ったとか色々)によりゲストを停止させた回数になります。仮想化支援技術があったとしてもVMMモード/ゲストモードの切り替えは非常にコストの高いものなので、これをいかに削減するかがポイントになります。
insn_emulationそれまでに発生したハードウェアエミュレーションの回数?を示しているようですが、細かいことは未調査。
io_exitsI/Oポートに対するアクセスで発生したVMEXITの回数を示します。
この値が大きくなる場合はハードウェアへのI/Oが頻発しており
性能劣化につながっていることが予想されます。
このような操作は全てVMEXITを引き起こしますので、いかにI/Oポートアクセスなどを少ない回数で済まさせるかが、VMの実質実効時間をのばすためにVMEXIT回数を削減するという観点で気になる数字です。
irq_exitsVMの実行中、物理ハードウェアにからの割り込みによってVMEXITした回数を示しているようです。この数字が大きい場合は物理ハードウェア側のIRQ割り込みをいかに減らすかの検討が必要になりそうです……。
irq_injectionsハードウェアエミュレータ(qemu-kvm)がVMに対して発行した割り込みの回数を示します。
IRQを使用している場合、IRQが発生すると、IRQをシェアするデバイスドライバ群が
ISR(Interrupt Status Register)をポーリングします。
このため割り込み回数×IRQ・・・と、共有するデバイス数が多いほどVMEXITの発生回数も増加にも繋がることから、ドライバを作るのであればこれをいかに低く抑えるかがポイントになります。
mmio_exitsメモリマップドI/OのためのVMEXIT回数です。
mmu_pte_writeシャドウページテーブル利用時、VM内のページテーブルのエントリ(Page Table Entry)を更新した数を示すようです。この値は、たとえばゲストOS上でmalloc()やfree()を行った場合にも実装次第で発生します。値が大きい場合は仮想マシン上のメモリ管理機構について再検討する余地があると言えます。この値はEPT/NPTが利用できないハードウェアでシャドウページテーブルによる負荷を見るのに利用できます。ここはゲスト内のプログラムのメモリ管理を工夫することで削減が可能です。ドライバなどであれば普段利用中にゼロから動かさせない、ぐらい高い目標を持ってもよいでしょう。