虛擬化概述


虛擬化概述

本文重點介紹了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到虛擬機的步驟如下:

  1. 安裝MLU驅動。

在Host主機上安裝MLU驅動,SR-IOV會同MLU驅動一起安裝。安裝完成后,重啟機器使Host新驅動生效。

  1. 拆分MLU270到VF。

以拆分到4個VF為例,步驟如下:

  1. 通過lspci命令獲取MLU270卡的BDF(bus,device,function)。
b.   lspci -d:0270

假設獲取到的某張MLU270卡的BDF為“xx:yy.0”。

  1. 執行以下命令將MLU270卡拆分到4個VF。
d.   sudo sh -c "echo 4 > /sys/bus/pci/devices/"xx:yy.0"/sriov_numvfs"

該命令將MLU270拆分到4個VF,Device ID為0271。

  1. 執行以下命令查看拆分的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
  1. 將VF Pass through到QEMU-KVM虛擬機。

使用以下命令將某一個VF Pass through到虛擬機,其中“xx:yy.z”為VF的BDF。

virsh nodedev-detach pci_0000_xx_yy_z
  1. 啟動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
  1. 在QEMU虛擬機里面安裝MLU的驅動安裝包,並重啟虛擬機以保證新安裝的驅動生效。

熱遷移

熱遷移(Live Migration),又叫動態遷移,通常是先將整個虛擬機的運行狀態完整保存下來,然后恢復到原有硬件平台或其他硬件平台。遷移成功后,虛擬機仍舊平滑運行,用戶不會察覺到任何差異。

要使用熱遷移功能,必須有2張MLU270的卡,並且兩張卡的拆分方式必須相同。目前只支持相同的VF之間的遷移。例如,如果源虛擬機的vf為1b:00.1,目的虛擬機的vf為1c:00.1,那么可以成功遷移;如果目的虛擬機的vf為1c:00.2,則無法正常遷移。

目前在MLU270上可以使用QEMU命令方式進行熱遷移。

遷移前目的端虛機一定要加載驅動。

基於QEMU命令遷移

  1. 將熱遷移patch打到QEMU。

本文使用QEMU 3.10。可以從開源社區下載QEMU源碼,並打上vMLU設備熱遷移的patch(咨詢相關人員獲取該patch)。

打完patch后,檢查QEMU根目錄qemu是否有hw/cambricon目錄。如果有,說明打patch成功。

cd qemu-3.10
patch –p 1 < ./qemu.patch
  1. 重新編譯QEMU。

編譯完成后,將使用重新編譯的QEMU代替系統自帶的QEMU組件進行后續操作。

mkdir build
cd build
../configure
make
  1. 分別在源端服務器和目的端服務器上加載卡Host PF驅動。

進入驅動的源碼包,執行如下腳本。

sudo ./load_with_sriov
  1. 遷移主機使能SR-IOV。

QEMU可以在同一台服務器上進行遷移,也可以在兩台不同的服務器間進行遷移。遷移前需要源端和目的端全部使能卡的SR-IOV。xxxx:xx:xx:x為PCIe設備的BDF號。

echo x > /sys/bus/pci/devices/0000:xxxx:xx:xx:x/sriov_numvfs
  1. 通過shell命令將pass through給虛擬機的vf與host解綁,然后與VFIO驅動綁定。

以PCIe設備0000:03:01.1為例的腳本如下:

virsh nodedev-detach pci_0000:03:01.1
  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 &
  1. 使用重新編譯后的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 &
  1. 在源虛擬機中加載驅動。

使用VNC或者其它方式連接源端虛擬機,進入驅動源碼包目錄,執行以下命令加載驅動:

./load
  1. 開始熱遷移。

有以下兩種方法:

  • 在源端QEMU界面按下Ctrl + Alt + 2,然后輸入 migrate tcp:xx.xx.xx.xx:端口號 。其中IP地址為目的端虛擬機的IP地址,端口號為之前設置的目的端虛擬機輸入端口號6667。
  • 在運行qemu的命令行里面添加 -monitor tcp:xx.xx.xx.xx:monitor_port_num,server,nowait 參數,使用 echo "migrate -d tcp:192.168.1.2:6667" | nc -n xx.xx.xx.xx monitor_port_num 命令觸發虛擬機進行熱遷移。
·       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,硬件編解碼)的內部數據處理流程一致。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM