読者です 読者をやめる 読者になる 読者になる

TenForward

技術ブログ。はてなダイアリーから移転しました

SR-IOV を有効にする (2)

Linux Virtualization

前回の続編.

  1. 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)
  2. 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)
  3. 2で当たりをつけた "pci_0000_02_10_0" をキーワードに libvirtxml を取得します.
    $ 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>
  4. 目的のVFをゲストから使えるようにホストから dettach します.
    $ virsh nodedev-dettach pci_0000_02_10_0
    Device pci_0000_02_10_0 dettached
    このコマンドを実行した後,ホストで ip link show とかしてみると,対応するデバイスが見えなくなっていました.
  5. おもむろに対応するVMの設定ファイルを編集します.
    $ virsh edit VM01
    <device>セクションの最後に以下のように対象となるデバイスの設定を追加します.
        <hostdev mode='subsystem' type='pci' managed='yes'>
    <source>
    <address bus='0x02' slot='0x10' function='0x0'/>
    </source>
    </hostdev>
    bus, slot, function は 3 で調べた xml のそれぞれの要素の値を 16 進数にしたものです.

これで 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

とリプライを.そりゃそうだ.ありがとうございました.

ちゃんとした測定はまた後日...