SR-IOV を有効にする (2)
前回の続編.
- lspciでデバイスの情報を調べます.Intel 82576 を積んだ NIC ですので
$ lspci | grep 82576
01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
02:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
02:10.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
02:10.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
02:10.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
02:10.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
02:10.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
02:10.6 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
02:10.7 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
02:11.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
02:11.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
02:11.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
02:11.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
02:11.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
02:11.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) - libvirt 上での情報を取得.とりあえず Virtual Function(VF) の一つ目のを使うとして,BUS の番号 "02" をキーワードに.
$ virsh nodedev-list | grep 02
pci_0000_00_02_0
pci_0000_02_10_0 <-これかな?
pci_0000_02_10_1
: (snip)
pci_0000_02_11_4
pci_0000_02_11_5
: (snip) - 2で当たりをつけた "pci_0000_02_10_0" をキーワードに libvirt の xml を取得します.
$ virsh nodedev-dumpxml pci_0000_02_10_0
<device>
<name>pci_0000_02_10_0</name>
<parent>pci_0000_00_1c_0</parent>
<driver>
<name>igbvf</name>
</driver>
<capability type='pci'>
<domain>0</domain>
<bus>2</bus>
<slot>16</slot>
<function>0</function>
<product id='0x10ca'>82576 Virtual Function</product>
<vendor id='0x8086'>Intel Corporation</vendor>
<capability type='phys_function'>
<address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</capability>
</capability>
</device> - 目的のVFをゲストから使えるようにホストから dettach します.
$ virsh nodedev-dettach pci_0000_02_10_0
このコマンドを実行した後,ホストで ip link show とかしてみると,対応するデバイスが見えなくなっていました.
Device pci_0000_02_10_0 dettached - おもむろに対応するVMの設定ファイルを編集します.
$ virsh edit VM01
<device>セクションの最後に以下のように対象となるデバイスの設定を追加します.<hostdev mode='subsystem' type='pci' managed='yes'>
bus, slot, function は 3 で調べた xml のそれぞれの要素の値を 16 進数にしたものです.
<source>
<address bus='0x02' slot='0x10' function='0x0'/>
</source>
</hostdev>
これで VM を起動すると,きちんと認識されています.igbvfドライバが 82576 の VF 用のドライバ,e1000 は元々VMに作成してあった仮想NICです.
[ 2.102129] e1000: Intel(R) PRO/1000 Network Driver - version 7.3.21-k8-NAPI [ 2.119907] e1000: Copyright (c) 1999-2006 Intel Corporation. [ 2.156948] igbvf 0000:00:07.0: Intel(R) 82576 Virtual Function [ 2.173402] igbvf 0000:00:07.0: Address: 3e:5c:08:cf:17:f3 [ 2.189737] igbvf 0000:00:07.0: MAC: 1 [ 2.237890] ACPI: PCI Interrupt Link [LNKC] enabled at IRQ 10 [ 2.254417] e1000 0000:00:03.0: PCI INT A -> Link[LNKC] -> GSI 10 (level, high) -> IRQ 10 [ 2.271023] e1000 0000:00:03.0: setting latency timer to 64 [ 2.590602] e1000 0000:00:03.0: eth1: (PCI:33MHz:32-bit) 52:54:00:7f:98:80 [ 2.624792] e1000 0000:00:03.0: eth1: Intel(R) PRO/1000 Network Connection
おまけ
さて,設定を終えてパフォーマンスを測定してみようかと思ったのですが,手元に 100M のスイッチしかありません.仕方ないのでVMが稼働しているホスト上からゲストOSに向けてnetperfを実行してみました.とりあえずのテストだったので,以下のような感じで実行しています.
$ netperf -H 172.16.44.12
テスト対象は
- e1000
- virtio-net
- vhost-net (ホスト上で vhost_net ドライバをロードしておいてVMを起動すればコレで動作します)
- SR-IOV
でやってみました.
結果は「vhost-net > virtio-net > SR-IOV > e1000」で,「あれ?意外に SR-IOV 遅いぞ」とつぶやいていたら @peo3 さんから
その構成だとvirtioはオンメモリ処理だけど、SR-IOVだとパケットがNICまで行ってUターンしてくるのでvirtioに負けるのも仕様がない気がします
https://twitter.com/#!/peo3/status/144749113496449024
とリプライを.そりゃそうだ.ありがとうございました.
ちゃんとした測定はまた後日...