in linux, network

NFV 網路技術介紹 – SR-IOV

以 KVM 為主的虛擬化技術,現今常見的網卡虛擬化及加速技術不外乎有以下選項

  • virtio
  • PCI Paththrough
  • DPDK
  • SR-IOV
  • OpenvSwitch

而本篇文章將會著重在 SR-IOV 於網卡上的介紹上面

What is SR-IOV?

根據 Intel 所出的 PCI-SIG SR-IOV Primer 入門書,為了讓硬體設備資源能夠在同一硬體上被多個 VM 共享使用,PCI-SIG (PCI Special Interest Group) 規範出標準 Signal Root I/O Virtualzation (SR-IOV) 出來供各設備商可以遵循,普遍廣泛應用是在網卡上。想當然爾,SR-IOV 也能適用在其他設備,譬如 AMD GPU

Architecture

以上圖為例,由下至上,從實體主機 (Host) 的角度來看,SR-IOV Enabled PCIe 實體裝置會放置在 Host,也能被偵測到及使用。開啟 SR-IOV 功能後,該 PCIe 將會轉變成邏輯角色 PF (Physical Function),而在 Host 之上的 OS 依然有相對應的 driver 可以管理該設備。從虛擬主機 (Guest) 的角度來看,PF 所產生的 VF (Virtual Function) 放置到虛擬主機內,很像是在虛擬主機直接介接了一張實體網卡,而不是透過 veth 或 virtio 的方式模擬網卡及 bridge,能大幅提升效率。也因為這個特性,Live Migration 是無法辦到的,但有支援熱插拔 (hot-unplugged),可以彌補這個天生缺陷,若搭配自動化流程,在設計得當的流程之下,應能降低 RTO (Recovery Time Objective)。

類型

SR-IOV 基於 PCIe 提供兩個不同的功能:

  1. PF (Physical Functions)
    指支援及管理 SR-IOV 功能的 PCIe 設備,擁有完全配置物理資源的權限

  2. VF (Virtual Functions)
    從 PF 分離出來的 PCIe 設備,只處理 I/O 功能,僅能控制從 PF 所分配來的資源;每一個 PF 所支援的 VF 皆有數量的限制,此數量由各 PCIe 廠商所定義

優缺點

優點

  • 在一個物理伺服器上的每一個虛擬機所介接的虛擬 PCIe 都會接近原生性能
  • 實現設備共享,讓物理設備資源能做到最有效的利用

缺點

  • 對設備有依賴性
  • 無法做 Live migration

Enabling SR-IOV on RHEL 7 with Intel NIC

Activate Intel VT-d in the kernel

# Append the parameter to the end of GRUB_CMDLINE_LINUX
cat /etc/sysconfig/grub |grep GRUB_CMDLINE_LINUX
> GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=rhel_rhel/root rd.lvm.lv=rhel_rhel/swap rhgb quiet" intel_iommu=on iommu=pt

# Update Grub menu
grub2-mkconfig -o /etc/grub2.cfg

# Reload for activate kernel
reboot

# Verify that IOMMU is enabled
dmesg | grep IOMMU | grep enabled

Create VF from PF

# Check the driver on specific NIC
ethtool -i eth0 | grep ^driver
> driver: igb

# Check maximum number of VFs on specific NIC (example: eth0)
cat /sys/class/net/eth0/device/sriov_totalvfs
> 7

# Setting the maximum VFs number in the kernel module
echo "options igb max_vfs=7" >>/etc/modprobe.d/igb.conf

# Create 4s VF on eth0 ***temporary***
echo 4 > /sys/class/net/eth0/device/sriov_numvfs

Verify VF is work well

lspci | grep -i 'Virtual Function'

References