虛擬化概述
本文重點介紹了SR-IOV技術以及MLU270對SR-IOV的支持。
SR-IOV簡介
SR-IOV(Single Root I/O Virtualization)技術是一種基於硬件的虛擬化解決方案,可提供高性能和可伸縮性的虛擬解決方案。SR-IOV制定了標准化機制來實現多個虛擬機共享一個I/O設備。使得在虛擬機之間高效共享PCIe(Peripheral Component Interconnect Express,快速外設組件互連)設備,可以獲得與本機相似的I/O性能。了解SR-IOV規范,請查看 http://www.pcisig.com。
SR-IOV分為以下兩種功能類型:
- PF(Physical Function,物理功能):根據SR-IOV規范中定義,PF具有PCI功能,用於支持SR-IOV功能。PF包含SR-IOV功能結構,用於管理SR-IOV功能。PF是全功能的PCIe功能,可以像其他任何PCIe設備一樣進行發現、管理和處理。PF擁有完全配置資源,可以用於配置或控制PCIe設備。
- VF(Virtual Function,虛擬功能):與PF關聯的一種功能。VF是一種輕量級PCIe功能,可以與PF以及與同PCIE設備的其他VF共享物理資源。VF僅擁有用於其自身行為的配置資源。
每個SR-IOV設備都可有一個PF,並且每個PF可有多個與其關聯的VF。
每個VF都具有一個PCI內存空間,用於映射其寄存器集。VF設備驅動程序對寄存器集進行操作以啟用其功能,並且顯示為實際存在的PCI設備。創建VF后,可以直接將其指定給客戶VM。使得VF可以共享同一物理設備,並在沒有CPU和虛擬機管理程序軟件開銷的情況下,執行數據的輸入輸出。
虛擬化工作原理
MLU270支持SR-IOV,一張單卡資源可由最多4個虛擬機共享。每個VF擁有各自單獨、隔離的物理資源,可以彼此互不影響地並行執行任務。
虛擬化工作原理
SR-IOV在MLU270 上的應用
本章重點介紹了SR-IOV在MLU270上的應用。
虛擬功能VF的介紹
VF主要實現滿足上層業務需求的各項功能(業務功能)。PF接受VF的特權操作請求,替VF完成這些特權操作。VF各項資源可獨立使用、重置,不影響其它VF。
當重新配置VF時,用戶無需卸載驅動,即可動態配置VF。
虛擬功能VF的配置
根據配置,每個VF可設置為獨占1、1/2、或1/4整卡資源。板卡資源包括推理處理單元(IPU)、視頻處理單元(VPU)、JPEG處理單元(JPU)和內存等。
運行以下指令配置VF:
echo 占卡資源數 > /sys/bus/pci/devices/bdf/sriov_num
用戶根據需要將上面指令中的“占卡資源數”變量替換為1、2、3或4。
- 當使能1個VF,此VF獨占整個板卡資源,如下圖所示。
- 占用全部板卡資源的VF
- 當使能2個VF,每個VF獨占1/2板卡資源,如下圖所示。
- 占用1/2板卡資源的VF
- 當使能3個VF,其中1個VF占用1/2板卡資源,另外兩個VF各占用1/4板卡資源,如下圖所示。
占用1/2和1/4板卡資源的VF組合
- 當使能四個VF,每個VF獨占1/4板卡資源,如下圖所示。
- 占用1/4板卡資源的VF
VF Pass through到虛擬機
虛擬機模式VF示意圖如下所示:
虛擬機模式示意圖
將VF Pass through到虛擬機的步驟如下:
- 安裝MLU驅動。
在Host主機上安裝MLU驅動,SR-IOV會同MLU驅動一起安裝。安裝完成后,重啟機器使Host新驅動生效。
- 拆分MLU270到VF。
以拆分到4個VF為例,步驟如下:
- 通過lspci命令獲取MLU270卡的BDF(bus,device,function)。
b. lspci -d:0270
假設獲取到的某張MLU270卡的BDF為“xx:yy.0”。
- 執行以下命令將MLU270卡拆分到4個VF。
d. sudo sh -c "echo 4 > /sys/bus/pci/devices/"xx:yy.0"/sriov_numvfs"
該命令將MLU270拆分到4個VF,Device ID為0271。
- 執行以下命令查看拆分的4個VF。
f. lspci -d:0271
顯示如下信息:
xx:yy.1 Processing accelerators: Device cabc:0271
xx:yy.2 Processing accelerators: Device cabc:0271
xx:yy.3 Processing accelerators: Device cabc:0271
xx:yy.4 Processing accelerators: Device cabc:0271
- 將VF Pass through到QEMU-KVM虛擬機。
使用以下命令將某一個VF Pass through到虛擬機,其中“xx:yy.z”為VF的BDF。
virsh nodedev-detach pci_0000_xx_yy_z
- 啟動QEMU虛擬機。
不同操作系統啟動虛擬機的命令可能會不同。下面以CentOS 7系統為例來啟動QEMU虛擬機:
qemu-system-x86_64 -cpu host -enable-kvm -m 16000M -smp 8 -name MLU_QEMU_1 -drive file=Centos7.qcow2,if=virtio,media=disk,cache=writeback,format=qcow2 -device vfio-pci,host=xx:yy.z,id=hostdev0,bus=pci.0,addr=0x9 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8
- 在QEMU虛擬機里面安裝MLU的驅動安裝包,並重啟虛擬機以保證新安裝的驅動生效。
熱遷移
熱遷移(Live Migration),又叫動態遷移,通常是先將整個虛擬機的運行狀態完整保存下來,然后恢復到原有硬件平台或其他硬件平台。遷移成功后,虛擬機仍舊平滑運行,用戶不會察覺到任何差異。
要使用熱遷移功能,必須有2張MLU270的卡,並且兩張卡的拆分方式必須相同。目前只支持相同的VF之間的遷移。例如,如果源虛擬機的vf為1b:00.1,目的虛擬機的vf為1c:00.1,那么可以成功遷移;如果目的虛擬機的vf為1c:00.2,則無法正常遷移。
目前在MLU270上可以使用QEMU命令方式進行熱遷移。
遷移前目的端虛機一定要加載驅動。
基於QEMU命令遷移
- 將熱遷移patch打到QEMU。
本文使用QEMU 3.10。可以從開源社區下載QEMU源碼,並打上vMLU設備熱遷移的patch(咨詢相關人員獲取該patch)。
打完patch后,檢查QEMU根目錄qemu是否有hw/cambricon目錄。如果有,說明打patch成功。
cd qemu-3.10
patch –p 1 < ./qemu.patch
- 重新編譯QEMU。
編譯完成后,將使用重新編譯的QEMU代替系統自帶的QEMU組件進行后續操作。
mkdir build
cd build
../configure
make
- 分別在源端服務器和目的端服務器上加載卡Host PF驅動。
進入驅動的源碼包,執行如下腳本。
sudo ./load_with_sriov
- 遷移主機使能SR-IOV。
QEMU可以在同一台服務器上進行遷移,也可以在兩台不同的服務器間進行遷移。遷移前需要源端和目的端全部使能卡的SR-IOV。xxxx:xx:xx:x為PCIe設備的BDF號。
echo x > /sys/bus/pci/devices/0000:xxxx:xx:xx:x/sriov_numvfs
- 通過shell命令將pass through給虛擬機的vf與host解綁,然后與VFIO驅動綁定。
以PCIe設備0000:03:01.1為例的腳本如下:
virsh nodedev-detach pci_0000:03:01.1
- 使用重新編譯后的QEMU啟動源端虛擬機。
此過程需要用戶提前安裝虛擬機鏡像,通過 -device
vfio-pci 指定透傳的PCIe設備,參考參數如下:
sudo qemu-system-x86_64 -cpu host -enable-kvm -m 16000M -smp 16 -device vfio-pci,host=0000:03:01.1,id=hostdev0,bus=pci.0,addr=0x9 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8 -vnc :9 &
- 使用重新編譯后的QEMU啟動目的端虛擬機。通過 -incoming 指定遷移使用的端口號。
本例中,目的虛擬機的輸入端口號為6667。
sudo qemu-system-x86_64 -cpu host -enable-kvm -m 16000M -smp 16 -device vfio-pci,host=0000:03:01.1,id=hostdev0,bus=pci.0,addr=0x9 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8 -incoming tcp:0:6667** -vnc :10 &
- 在源虛擬機中加載驅動。
使用VNC或者其它方式連接源端虛擬機,進入驅動源碼包目錄,執行以下命令加載驅動:
./load
- 開始熱遷移。
有以下兩種方法:
- 在源端QEMU界面按下Ctrl + Alt + 2,然后輸入 migrate
- 在運行qemu的命令行里面添加 -monitor
· migrate tcp:192.168.1.2:6667
· #在源端虛擬機上執行以下命令
· sudo qemu-system-x86_64 -cpu host -enable-kvm -m 16000M -smp 16 -device vfio-pci,host=0000:03:01.1,id=hostdev0,bus=pci.0,addr=0x9 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8 -monitor tcp:127.0.0.1:55551,server,nowait -vnc :9
· #在目的端虛擬機上執行以下命令
· sudo qemu-system-x86_64 -cpu host -enable-kvm -m 16000M -smp 16 -device vfio-pci,host=0000:03:01.1,id=hostdev0,bus=pci.0,addr=0x9 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8 -incoming tcp:192.168.1.2:6667 -monitor tcp:127.0.0.1:55552,server,nowait -vnc :10
· #在源端虛擬機上執行以下命令
· echo "migrate -d tcp:192.168.1.2:6667" | nc -n 127.0.0.1:55551
10. 遷移完成后,使用VNC或者其它方式連接目的端虛擬機。
會發現目的端虛擬機上已完全恢復了源端內容。
編解碼內部視頻以及圖像數據流
虛擬化技術使用VPU和JPU進行內部視頻以及圖像數據流的編碼和解碼,與CNCodec(Cambricon Neuware Codec,硬件編解碼)的內部數據處理流程一致。