PowerEdge:在 VMware ESXi SR-IOV 中安裝多個 Intel X520 或 X540 配接卡時,發生不正確的連接埠虛擬功能列舉
摘要: Intel X520/X540 VMware ESXi SR-IOV 組態max_vfs
症狀
在單一 PowerEdge 伺服器中使用多張 Intel X520 或 Intel X540 網路卡時,可能會導致 VMware ESXi SR-IOV 出現訊息。
VMware 報告有不正確的連接埠虛擬功能列舉。
根據 Intel 的白皮書嘗試設定 SR-IOV 時可能會遇到此問題,網址為:
http://www.intel.com/content/dam/www/public/us/en/documents/technology-briefs/converged-network-adapter-sr-iov-on-esxi-5-1-brief.pdf
http://www.intel.com/content/dam/www/public/us/en/documents/reference-guides/sr-iov-guide-ethernet-can-x710-xl710-vmware-vsphere-6-brief.pdf
出現此問題時,在從命令列公用程式 (CLI) 使用 max_vfs 參數啟用虛擬功能後,連接埠虛擬功能列舉 會顯示與嘗試指派不一致的內容。在以這種方式從 CLI 啟用虛擬功能後,檢視 Web UI 也可能會顯示 不一致的連接埠虛擬功能列舉 。
原因
無原因
解析度
VMware 已察覺此問題,目前正在調查修正方法。VMware 說明文件建議使用者使用 vSphere Web Client 啟用 SR-IOV 虛擬功能。
使用命令行介面 (CLI) 設定 SR-IOV 時,請確定備妥最新的驅動程式和 Web 用戶端,才建議使用 Web 用戶端方法啟用虛擬功能。
進階 CLI 因應措施
此 CLI 因應措施為進階使用者提供。
視使用的命令而定,ESXi 核心會以三種不同的方式掃描和排序 PCI 裝置。
瓣:公共汽車:裝置:功能 (區段 = 網域,在 Linux 術語中為 0)
- PCI 樹狀結構掃描順序,即為裝置附加順序
- VMkernel 會從 Root 橋接器進行掃描,並從組態空間以「depth-first-search」的遞迴方式讀取所有子節點。
沒有文檔,但它類似於 http://wiki.osdev.org/PCI#Recursive_Scan_With_Bus_Configuration。
- Vmnic 名稱:亦為 vmnic1、vmnic1x,...VMNIC2、VMNIC2X,...,VMNIC3
接著,可遵循以下三種方法中的任何一種,以運用各種工具列出裝置:
-
Lspci依 S、B、D、F 排序 esxcfg-nics-l' 是依 vmnicX 名稱排序。- Web 用戶端按 S、B、D、F 排序。
Esxcfg-module -s max_vsf=依 PCI 樹狀結構掃描排序orderDmesg顯示根據 PCI 樹狀結構掃描順序排序的 PCI 裝置。
為了正確設定/啟用 SR-IOV (設定 max_vfs 使用命令列),使用者應根據 PCI 樹狀結構掃描順序啟用 PCI 裝置,可透過以下方式達成:
-流動的 dmesg 以取得資訊並將資訊解析為PCI設備資訊,然後設定 max_vfs 根據 dmesg 產量。
-執行 lspci.py 文稿(如下)並設定 max_vfs 根據指令檔列出的順序。
此指令檔會查詢 PCI,並根據 PCI 樹狀結構掃描順序排序。
例如,僅執行此指令檔,且可能無法在所有 ESXi 核心版本上執行。
這已通過 ESXi 6.0U3 測試。
將以下指令檔儲存在具有 .py 副檔名 (例如 lspci.py) 的個別檔案中。
#!/usr/bin/env python
import vmware
import vmware.vsi as vsi
VSI_HW_PCI_DEVICES = '/hardware/pci/devices'
VSI_HW_PCI_ROOT = '/hardware/pci'
VSI_SYS_MOD_ROOT = '/system/modules'
modInfo = {}
for m in vsi.list(VSI_SYS_MOD_ROOT):
general = vsi.get("%s/%s/general" % (VSI_SYS_MOD_ROOT, m))
id = int(general['moduleId'])
modInfo[id] = m
for ptr in vsi.list(VSI_HW_PCI_DEVICES):
dev = vsi.get("%s/%s/info" % (VSI_HW_PCI_DEVICES, ptr.strip()))
s, b, d, f = dev['seg'], dev['bus'], dev['dev'], dev['func']
nodePath = "%s/seg/%d/bus/%d/slot/%d/func/%d" % (VSI_HW_PCI_ROOT, s, b, d, f)
cfg = vsi.get("%s/seg/%d/bus/%d/slot/%d/func/%d/pciConfigHeader" % (VSI_HW_PCI_ROOT, s, b, d, f))
modName = modInfo[cfg['moduleID']] if cfg['moduleID'] != 0xffffffff else " " * 8
print("%04d:%02d:%02d:%d\t%-16s\t%s" % (s, b, d, f, modName, cfg['name']))