相關技術
IO虛擬化簡介
全虛擬化
通過VMM來模擬IO設備實現,VMM截獲GuestOS的IO請求,通過軟件模擬真實的硬件。VMM必須處理所有虛機的IO請求,然后將所有的IO情況序列化為可以被底層硬件處理的單一IO流。好處是GuestOS不需要考慮硬件設備的情況。問題是效率相對較低。例如 qemu。
一個完整的數據包從虛擬機到物理機的路徑是:虛擬機--QEMU虛擬網卡--虛擬化層--內核網橋--物理網卡。
半虛擬化
通過前端和后端模擬實現虛擬化。GuestOS中的半虛擬化驅動為前端,VMM 提供的與GuestOS 通訊的驅動程序為后端。前端驅動將GuestOS的請求通過與VMM之間的特殊通信機制發生給VMM后端需求,后端驅動處理完IO請求之后再發送給物理驅動。全虛擬化為了完成一次操作要涉及到多個寄存器的操作,使得VMM要截獲每個寄存器訪問並進行相應的模擬,就會導致多次上下文切換。這種方式能很大程度的減少上下文切換的頻率,提供更大的優化空間。例如 virtio 。
全虛擬化網卡是虛擬化層完全模擬出來的網卡,半虛擬化網卡通過驅動對操作系統做了改造;
軟件的共享IO虛擬化技術
硬件輔助的IO虛擬化主要包括英特爾VT-d, AMD的IOMMU(AMD-Vi)和PCI-SIG 的SR-IOV。前兩種屬於Directed I/O。物理設備直接分配給虛擬機使用,通過硬件芯片完成GPA到MA 的翻譯。IOV 通過在硬件設備中增加一個PCIe 設備,用於呈現一個PF或多個VF,從而可以將每個VF單獨分配給不同的虛機使用。
SR-IOV簡介
SR-IOV 技術是一種基於硬件的虛擬化解決方案,可提高性能和可伸縮性。SR-IOV 標准將一個PCIe的網絡控制器虛擬化成多個PCIe設備,並且每個設備可以直接分配給一個虛擬機,允許在虛擬機之間高效共享 PCIe(Peripheral Component Interconnect Express,快速外設組件互連)設備,並且它是在硬件中實現的,可以獲得能夠與本機性能媲美的 I/O 性能。SR-IOV 規范定義了新的標准,根據該標准,創建的新設備可允許將虛擬機直接連接到 I/O 設備,越過了hypervisor與虛擬交換機層,這樣可以帶來低延遲和接近線纜的速度。SR-IOV 規范由 PCI-SIG 在 http://www.pcisig.com上進行定義和維護。單個 I/O 資源可由許多虛擬機共享。共享的設備將提供專用的資源,並且還使用共享的通用資源。這樣,每個虛擬機都可訪問唯一的資源。因此,啟用了 SR-IOV 並且具有適當的硬件和 OS 支持的 PCIe 設備(例如以太網端口)可以顯示為多個單獨的物理設備,每個都具有自己的 PCIe 配置空間。
SR-IOV 是PCI-SIG的一個IOV的規范,目的是提供一種標准規范,通過為虛擬機提供獨立的內存空間,中斷,DMA流,來繞過VMM實現數據移動。SR-IOV 架構被設計用於將單個設備通過支持多個VF,並減少硬件的開銷。
SR-IOV 兩種功能(function):
物理功能(Physical Functions,PF):包含完整的PCIe 功能,包括SR-IOV的擴張能力,該功能用於SR-IOV的配置和管理。PF 能像普通 PCI 設備那樣被發現、管理和配置。
虛擬功能(Virtual Functions,VF):包含輕量級的PCIe 功能,它只能處理I/O, 包含數據移動所需要的最小的必要的資源。每個 VF 都是從 PF 中分離出來的。每個物理硬件都有一個 VF 數目的限制。一個 PF,能被虛擬成多個 VF 用於分配給多個虛擬機。
一旦在 PF 中啟用了 SR-IOV,就可以通過 PF 的總線、設備和功能編號(路由 ID)訪問各個 VF 的 PCI 配置空間。每個 VF 都具有一個 PCI 內存空間,用於映射其寄存器集。VF 設備驅動程序對寄存器集進行操作以啟用其功能,並且顯示為實際存在的 PCI 設備。創建 VF 后,可以直接將其指定給 IO 來賓域或各個應用程序(如裸機平台上的 Oracle Solaris Zones)。此功能使得虛擬功能可以共享物理設備,並在沒有 CPU 和虛擬機管理程序軟件開銷的情況下執行 I/O。
支持SR-IOV的以太網適配器和控制器
詳細清單參考:
https://www.intel.cn/content/www/cn/zh/support/network-and-i-o/ethernet-products/000005722.html;
SR-IOV的優點
SR-IOV 標准允許在 IO 來賓域之間高效共享 PCIe 設備。SR-IOV 設備可以具有數百個與某個物理功能 (Physical Function, PF) 關聯的虛擬功能 (Virtual Function, VF)。VF的創建可由PF通過設計用來開啟SR-IOV功能的寄存器以動態方式進行控制。缺省情況下,SR-IOV 功能處於禁用狀態,PF 充當傳統 PCIe 設備。
性能提升(從虛擬機環境直接訪問硬件),成本降低(節能、減少了適配器的數量、簡化了布線、減少了交換機端口)。
SR-IOV適用的場景
KVM虛擬機在傳統網橋模式下,網絡穩定是沒有問題的,但它和SR-IOV一個本質的區別是,網橋模式本身會消耗宿主機的CPU,在實際場景下,當宿主機的CPU壓力(>60%)比較大時,虛擬機內部網卡的發包率(PPS)性能會下降,極端情況會出現丟包。SR-IOV最適合的應用場景:
1. 宿主機CPU壓力大(>60%)+虛擬機網卡發包率壓力大(pps >5w)
2. 虛擬機網卡發包率壓力非常大(pps>10w)
KVM虛擬機中使用SR-IOV
硬件與軟件需求
硬件需求
1. CPU必須支持IOMMU(比如英特爾的 VT-d 或者AMD的 AMD-Vi,Power8 處理器默認支持IOMMU),並且在BIOS中已開啟。支持PCI-SIG* Single Root I/O Virtualization and Sharing(SR-IOV),並且在BIOS中已開啟。
2. 支持SR-IOV的網卡必須插在總線帶寬X8以上的擴展槽中。
軟件需求
1. VF驅動程序必須與物理網卡兼容,必須安裝在虛擬機操作系統內
2. 宿主機安裝PF驅動程序
安裝kvm等軟件包
查看系統是否支持虛擬化
查看系統是否支持虛擬化,egrep -c '(vmx|svm)' /proc/cpuinfo
大於1表示開啟了,等於0表示沒開啟,如果沒開啟則需要在BIOS中開啟intel VT-d
安裝軟件包
yum install -y kvm virt-* libvirt bridge-utils qemu-img
kvm:軟件包中含有KVM內核模塊,它在默認linux內核中提供kvm管理程序
libvirts:安裝虛擬機管理工具,使用virsh等命令來管理和控制虛擬機。
bridge-utils:設置網絡網卡橋接。
virt-*:創建、克隆虛擬機命令,以及圖形化管理工具virt-manager
qemu-img:安裝qemu組件,使用qemu命令來創建磁盤等。
查看kvm模塊是否被加載
查看kvm模塊是否被加載lsmod |grep kvm,如果有信息,則表示加載成功。
啟動libvirtd
systemctl start libvirtd.service
開啟SR-IOV功能
開啟IOMMU功能
Centos系統默認沒有啟動IOMMU功能,在/etc/default/grub文件的GRUB_CMDLINE_LINUX后面添加intel_iommu=on
更新grub,grub2-mkconfig -o /boot/grub2/grub.cfg
重啟機器生效,檢測是否生效 sudo virt-host-validate
上圖表示iommu沒有開啟,下圖表示iommu已經啟用。
檢測 igb模塊是否被加載
檢測igb模塊是否被加載,lsmod | grep igb
如果沒有則加載igb,modprobe igb
創建網卡的虛擬功能(VF)====千兆網卡為7萬兆網卡為15,bit數。
創建網卡的虛擬功能,echo '7' > /sys/class/net/{eth}/device/sriov_numvfs,並檢查lspci|grep Ethernet。機器重啟后,創建的虛擬虛擬功能失效,需要重新創建,可以將其寫在啟動腳本中。
創建kvm虛擬機並掛載VF
查詢pci設備
virsh nodedev-list | grep 02
pci_0000_02_00_1是PF,pci_0000_02_10_0到pci_0000_02_13_0是VF,使用virsh nodedev-dumpxml pci_0000_02_10_0查看詳細信息
將VF從宿主機中解綁
將VF從宿主機中解綁,這樣虛擬機才可以使用此VF。virsh nodedev-dettach pci_0000_0b_10_0。
創建虛擬機
創建domain.xml,使用之前解綁的VF
定義虛擬機virsh define demo.xml
啟動虛擬機virsh start demo
添加pci_passthrough_whitelist
編輯/etc/nova/nova.conf文件
該配置表示屬於eth3的所有VF可以直通到虛擬機,並且這些VF屬於physnet2 網絡(physnet2是一個Provider網絡)。如果pci_passthrough_whitelist使用pci地址或者devname配置,則PF與所有的VF將會被匹配。此外,可以根據domain、bus、slot、vendor_id、product_id等設置VF白名單(這些屬性可以使用virsh nodedev-dumpxml獲得)。
重啟nova-compute服務
安裝SR-IOV agent
編輯/etc/neutron/plugins/ml2/sriov_agent.ini文件
physical_device_mappings表示provider network與網卡的映射關系,exclude_devices表示不使用的VF
啟動sriov-agent
配置控制節點
配置mechanism_drivers
編輯/etc/neutron/plugins/ml2/ml2_conf.ini
添加ml2_conf_sriov.ini文件到neutron-server的啟動腳本中
重啟neutron-server
配置nova-scheduler
編輯/etc/nova/nova.conf
重啟nova-scheduler
創建使用SR-IOV網卡的虛擬機
創建provider的網絡,類型可以是flat或者vlan
openstack network create --project admin --external --provider-network-type flat --provider-physical-network physnet2 sriovnet
創建虛擬機
Openstack環境中使用SR-IOV的局限及碰到的問題
不支持熱遷移,只支持冷遷移
冷遷移已經在newton中實現,可以參考https://bugs.launchpad.net/nova/+bug/1512880;熱遷移目前還不支持,可以參考https://blueprints.launchpad.net/nova/+spec/sriov-live-migration。
不支持安全組
不支持tunnel
性能測試
創建兩台SR-IOV的虛擬機,使用iperf測試互通的性能。可以看出使用SR-IOV的虛擬機的網絡帶寬接近物理速度。