一、SR-IOV介紹shell
Single Root I/O Virtualization(SR-IOV) 是一種由PCI-SIG 組織發佈的I/O 虛擬化技術標準。SR-IOV 採用直接I/O 技術,繞過虛擬機監視器直接發送和接收I/O 數據。同時SR-IOV 還利用IOMMU(I/OMemory Management Unit)高效完成內存訪問受權和內存地址轉換。一個SR-IOV 設備具備一個或多個物理設備(Physical Function,或PF),PF 是標準的PCIe 設備。每個PF能夠建立多個虛擬設備(Virtual Function,或VF),VF 是「輕量級」的PCIe 設備。服務器
Physical Function (PF) : 網卡上的每一個實體端口具備至少有一個PF。在某些狀況下,網卡上的每一個端口能夠被分割爲四個端口。例如每一個端口可成分爲四個PFs,或是在雙端口的網絡卡上能分割爲總共有八個PFs。關鍵點是在於PF擁有完整的設置能力,它們能夠被hypervisor當成是實體端口來管理。網絡
Virtual Function (VF) : VF是和VM關聯的,它被限制爲處理I/O流,基本上是移動數據。它們不支持對實體端口的管理。所支持的VF數不一樣但約莫是每張卡可虛擬爲64個VF。架構
每個VF 擁有收發數據包的關鍵資源,如收發隊列、DMA 通道等;而與其餘VF 共享其餘大部分非關鍵的設備資源。所以每個VF 都有獨立收發數據包的能力。若把一個VF 分配給一臺虛擬機,該虛擬機就具有了直接使用該VF 進行數據包發送和接收的能力。最爲重要的是,虛擬機經過VF 進行I/O 操做無需虛擬機監視器的干涉,這正是直接I/O 技術的優點之一。併發
二、SR-IOV體系結構ide
如圖,SR-IOV 體系結構中的軟件部分包括:PF 驅動、VF 驅動和SR-IOV 管理器(IOVM)。在XenServer的環境下,PF 驅動運行於Domain0,VF 驅動運行於DomainU。高併發
PF 驅動運行在宿主機而且有訪問全部硬件設備資源的權限。PF 驅動的主要功能和職責是建立、配置和管理虛擬設備,即VF。性能
VF 驅動至關於一個普通的網絡設備驅動運行在虛擬機,VF驅動只有操做相應VF 的權限。VF 驅動的主要功能和職責是在虛擬機和VF 之間直接完成I/O 操做,包括數據包的發送和接收。因爲VF 並非真正意義上的PCIe 設備,所以VF 也不能像普通的PCIe 設備同樣(如PF)被操做系統直接識別並配置。測試
SR-IOV 管理器運行在宿主機,它爲全部的VF 建立了一個虛擬的配置空間,使得宿主機操做系統能夠正確的識別並配置VF。在VF 被宿主機正確的識別和配置以後,它們才能被分配給虛擬機,而後在虛擬機操做系統中被看成普通的PCI 設備初始化和使用。ui
如圖,SR-IOV 以太網控制器包括了一個內置的鏈路層交換機,一個PF 和多個VF。
鏈路層交換機進入網卡的數據包首先通過鏈路層交換機,並被根據MAC地址和VLAN 標籤進行分類,從而肯定數據包對應的目標VF。而後數據包被直接傳輸到該VF 對應虛擬機的接收緩衝區等待處理,這一步驟經過DMA 技術實現。在DMA 的過程當中,IOMMU 承擔了把虛擬機緩衝區內存地址翻譯成機器物理地址的任務。在數據包傳輸完成以後,VF 會產生一箇中斷通知虛擬機有新數據包須要處理。每一個由VF 產生的中斷並不能直接送到虛擬機,而是被虛擬機監視器捕獲,而後由虛擬機監視器在合適的時候給虛擬機注入一個虛擬中斷通知數據包的到達。虛擬機收到中斷以後,VF 驅動開始工做,處理接收緩衝區中的數據包。一條中斷可能會被用來通知多個數據包的到達。
三、SR-IOV技術運行原理
當SR-IOV 網卡收到新數據包時,會向虛擬機監視器發起一箇中斷信號(在虛擬化環境下,硬件設備須要和CPU或者內存通訊,都須要發送中斷信號,其運做模式和傳統的操做系統並沒有區別),虛擬監視器收到網卡發送過來的信號以後,截取該中斷信號。而後虛擬機監視器將該中斷信號進過必定的處理,給對應的虛擬機發送一個虛擬的中斷信號,虛擬機在收到虛擬機監視器給他的中斷信號後,虛擬機操做系統調用VF 驅動中的中斷處理程序,中斷處理程序經過發起NAPI 輪詢來處理到達數據包。NAPI(New API)是Linux 內核提供的網絡驅動接口,用於配合網卡的中斷彙集技術使用。,中斷彙集技術就是使用一箇中斷來通知處理全部的數據包,再也不一個數據包一箇中斷,這個技術的好處就是節省了CPU等系統的資源,不讓其總是處於中斷狀態浪費系統的資源。NAPI 技術合併了兩種接收數據包的方法:中斷和輪詢。
在SR-IOV中,VF採用了NAPI 接口的網絡驅動,其工做模式是這樣的:首先驅動處於中斷模式;當中斷到來的時候,驅動轉換爲輪詢模式而且中斷被屏蔽;在輪詢模式,驅動開始處理數據包直到全部數據包都已經被接收;而後驅動再次轉換爲中斷模式,解除對中斷的屏蔽。
四、使用SR-IOV技術所需條件
SR-IOV的性能在目前的I/O虛擬化環境下是最好的,可是須要一系列的支持,包括網卡、服務器、VMM、CPU等。
網卡:現目前來講,市面上就2家公司的網卡支持SR-IOV的技術,即Intel和EMULEX Corporation。Intel支持SR-IOV技術的網卡能夠訪問如下網址進行查詢:http://www.winyao.com/news_info.asp?id=232
服務器:必須支持輸入/輸出內存管理單元 (IOMMU),而且必須在 BIOS 中啓用 IOMMU。必須支持SR-IOV,而且必須在 BIOS 中啓用 SR-IOV。這須要查詢服務器的手冊或着諮詢服務器廠家。
VMM:即hypervisor的支持,如今的主流hypervisor都支持SR-IOV技術,好比XenServer、vSphere、KVM、Hyper-v等。其實就是SR-IOV的PF驅動有沒有基於該hypervisor作開發和集成。
CPU:配備 AMD 處理器的主機不受SR-IOV 支持,必須配備 Intel 處理器。
虛擬機操做系統:其實操做系統應該也必須算上,由於部分操做系統SR-IOV的VF驅動就沒有,你前面的條件知足了這一條不知足也使不了,如今主流使用的操做系統都是OK的。一些低版本的操做系統可能使用就有問題了。
五、在XenServer中使用SR-IOV技術
咱們在前面的文章中提到過XenServer的兩種網絡堆棧模式,也給你們簡單介紹了這兩種模式的架構和工做原理。可是呢這兩種都是基於純軟件虛擬的I/O虛擬化,在大規模和高併發的狀況下,是沒法知足虛擬機的性能需求的。好比你在XenServe上面部署Exchange郵件系統進行大規模併發壓力測試的時候,你就會發現,你的網絡IO是一個瓶頸。
因此基於這樣的需求,咱們能夠在XenServer上面使用基於硬件的IO虛擬化SR-IOV技術,提升咱們Exchange虛擬機系統的網絡IO的性能。
只有 XenServer 硬件兼容性列表上所列的支持 SR-IOV 的 NIC 才支持SR-IOV 技術,並且該技術僅適用於Windows Server 2008 來賓操做系統【有朋友說在red hat上也測試經過】。
1. 在 XenServer 主機上打開本地命令 shell。
2. 運行 lspci 命令以顯示虛擬功能 (VF) 的列表。例如:
07:10.0 Ethernetcontroller: Intel Corporation 82559 \
EthernetController Virtual Function (rev 01)
在上例中,07:10.0 是 VF 的 bus:device.function 地址。
3. 經過運行如下命令爲目標 VM 分配所需的 VF:
xe vm-param-setother-config:pci=0/0000:<bus:device.function> uuid=<vm-uuid>
4. 啓動 VM,而後爲特定的硬件安裝相應的 VF 驅動程序。