1,816 瀏覽數

RHEL5 – KVM – VT-C (VMDq , VMDc,SR-IOV)

在 Intel 官方網站上的 Intel® 82575 Gigabit Ethernet 有支援 VMDq 和 SR-IOV 新版的 10G網卡 igb 版本 2.2.9
http://downloadcenter.intel.com/default.aspx?lang=zht&iid=gg_support-ZH_01+home_downloadctr

在 RHEL5 編譯 driver 時,需要 kernel-devel 的套件才可以做編譯的動作.

[root@benjr ~]# rpm -aq |grep -i kernel-devel
kernel-devel-2.6.18-194.el5
[root@benjr ~]# tar zxvf igb-2.2.9.tar.gz
[root@benjr ~]# cd src
[root@benjr src]# make ; make install

看一下這一版的 10G網卡 igb driver 有支援什麼功能.

[root@benjr src]# modinfo -p igb
debug:Debug level (0=none, …, 16=all)
QueuePairs:QueuePairs – TX/RX queue pairs for interrupt handling
max_vfs:max_vfs – SR-IOV VF devices
VMDQ:VMDQ – VMDq multiqueue receive
RSS:RSS – multiqueue receive count
LLISize:Low Latency Interrupt on Packet Size
LLIPush:Low Latency Interrupt on TCP Push flag
LLIPort:Low Latency Interrupt TCP Port
IntMode:Interrupt Mode
InterruptThrottleRate:Interrupt Throttling Rate

可以清楚看到他提供了 max_vfs:max_vfs – SR-IOV VF devices 以及 VMDQ:VMDQ – VMDq multiqueue receive 不過目前手邊沒有 Intel® 82575 Gigabit Ethernet 找時間再來試試看.

昨天和同事試了一張板子有 Intel® 82575 10 Gigabit Ethernet 網卡,但是怎麼試都不對,雖然 VMDq 和 VMDc(SR-IOV) 的參數可以啟動,但是這張卡怎麼就是無法同時指派給多個 VM 來使用,到底是出了什麼問題.

上 Intel 網站詳細查詢了一下,
http://www.intel.com/Assets/PDF/general/linecard_ec.pdf
原來 Intel® 82575 10 Gigabit Ethernet 網卡只支援 VMDq 並不支援 VMDc(SR-IOV),如果要同時支援 VMDq 和 VMDc(SR-IOV) 需要的是 Intel® 82576 10 Gigabit Ethernet 網卡

Intel® 82576EB2 Intel® I/O Acceleration Technology (Intel® QuickData Technology, MSI-X, RSS, Direct Cache Access, checksum and segmentation offload, header splitting/replication, low latency interrupts), 16Rx/16Tx queues/port, jumbo frames, Intel® VT for Connectivity (Virtual Machine Device Queues (VMDq), Virtual Machine Direct Connect (VMDc – PCI-SIG SR-IOV based), Security (IPsec offload, LinkSec3), IEEE 1588 (time stamp)
Intel® 82575EB Intel® I/O Acceleration Technology (Intel® QuickData Technology, MSI-X, RSS, Direct Cache Access, checksum and segmentation offload, header splitting/replication, low latency interrupts), 8Rx/8Tx queues/port, jumbo frames, Intel® VT for Connectivity (Virtual Machine Device Queues (VMDq)

手邊有一張 Intel® 82599 10 Gigabit Ethernet Controller 想說來試試看 VMDQ + SR-IOV 的功能  Intel® 82599 在 Linux 下模組名稱為 ixgbe.ko 在 Intel 官方網站都可以下載編輯 http://downloadcenter.intel.com/default.aspx?lang=zht&iid=gg_support-ZH_01+home_downloadctr
在載入 Intel® 82599 模組前可以透過 #modinfo -p 來查詢這個模組提供了哪一些參數.

[root@benjr ko]# modinfo -p ixgbe.ko
RxBufferMode:0=1 descriptor per packet,
1=use packet split, multiple descriptors per jumbo frame
2 (default)=use 1buf mode for 1500 mtu, packet split for jumbo
LLIVLANP:Low Latency Interrupt on VLAN priority threshold
LLIEType:Low Latency Interrupt Ethernet Protocol Type
LLISize:Low Latency Interrupt on Packet Size (0-1500)
LLIPush:Low Latency Interrupt on TCP Push flag (0,1)
LLIPort:Low Latency Interrupt TCP Port (0-65535)
InterruptThrottleRate:Maximum interrupts per second, per vector, (956-488281), default 8000
max_vfs:Number of Virtual Functions: 0 = disable (default), 1 = default settings, 2-63 = enable this many VFs
VMDQ:Number of Virtual Machine Device Queues: 0/1 = disable, 2-16 enable (default=8)
RSS:Number of Receive-Side Scaling Descriptor Queues, default 1=number of cpus
DCA:Disable or enable Direct Cache Access, 0=disabled, 1=descriptor only, 2=descriptor and data
MQ:Disable or enable Multiple Queues, default 1
Node:set the starting node to allocate memory on, default -1
IntMode:Change Interrupt Mode (0=Legacy, 1=MSI, 2=MSI-X), default 2
InterruptType:Change Interrupt Mode (0=Legacy, 1=MSI, 2=MSI-X), default IntMode (deprecated)

可以看到 ixgbe 模組的確有提供 VMDQ 和 SR-IOV 的功能.先來回想一下什麼是 VMDQ 和 SR-IOV.

  • VMDc Virtual Machine Direct Connect
    傳統的 VM 虛擬機上的虛擬網卡傳送主要透過 VMM (或是 hypervisor) 來進行傳輸, 而 Virtual Machine Direct Connect (VMDc) 允許 VM 可以直接針對實體網路 I/O 進行存取.雖然在 Intel VT-d 虛擬化技術中已經允許 VM 虛擬機可以直接和實體 I/O 連結.不過VMDc 使用了 PCI-SIG 的 Single Root I/O Virtualization (SR-IOV) 的技術. 透過 SR-IOV 這一項技術更進一步提升 VT-d 的功能.他可以同時讓多個 VM 虛擬機與實體 I/O 裝置同時建立通道(communication channels).
    http://benjr.tw/3599
  • VMDq Virtual Machine Device Queues
    目前我們使用的虛擬化不管是 RHEL 的 KVM 或是 Xen 還是 VMware / Citrix ,在處理虛擬機的網卡時都會透過一個由 VMM  (或是叫 Hypervisor) 所管理的虛擬化 switch ,而這 switch 主要的功能就是轉送封包給正確的虛擬機.,但哪一些封包要流向哪一個 Vitual Machine (虛擬機器) 都需要額外的 CPU 資源才能完成這些工作. 而 Intel 所使用的 VMDq 就是為了減少這些額外 CPU 的處理. 透過網卡晶片內建的 Layer 2 classifier / sorter 以加速網路資料的傳送,它可以先行將不同的虛擬機所需的封包,直接在晶片裡面安排好再透過 receive queue,直接給虛擬機.這樣就不需再透過 Virtual switch 轉送封包. 進而達到減少網路的負載與 CPU 的使用率.
    http://benjr.tw/3593
[root@benjr ko]# insmod ixgbe.ko VMDQ=6
PCI: Enabling device 0000:30:00.0 (0000 -> 0003)
PCI: Enabling device 0000:30:00.1 (0000 -> 0003)

VMQD 的使用範圍從 0/1 = disable, 2-16 enable 載入模組時加上參數 VMDQ = 6 就可以產生 6 個 Queue.不過我在載入 SR-IOV 的功能時卻發生錯誤,我的作業環境是 RHEL5.5 x86_64 .

[root@benjr ko]# insmod ixgbe.ko max_vfs=1
PCI: Enabling device 0000:30:00.0 (0000 -> 0003)
PCI: Failed to allocate mem resource #12:100000@fbe00000 for 0000:30:00.0
ixgbe 0000:30:00.0: not enough MMIO resources for SR-IOV
ixgbe: 0000:30:00.0: ixgbe_probe_vf: Failed to enable PCI sriov: -16
PCI: Enabling device 0000:30:00.1 (0000 -> 0003)

在 RedHat 官方網站這個問題 "not enough MMIO resources for SR-IOV" https://bugzilla.redhat.com/show_bug.cgi?id=523341 最快的解決方式就是暫時使用有 patch 核心  http://people.redhat.com/ddutile/.2414719547/ 如果有需要可以同時啟動 VMDQ + SR-IOV 的功能.
max_vfs 的參數可以從 0 = disable (default), 1 = default settings, 支援到 2-63 = enable  VFs

發表迴響