任繼奎,林 山,葉云峰
(中國電子科技集團(tuán)公司第三十研究所,四川 成都 610041)
單根I/O虛擬化(Single Root I/O Virtualization,SR-IOV)是由PCI-SIG制定的輸入輸出(Input Output,I/O)虛擬化標(biāo)準(zhǔn)[1],通過利用直接I/O技術(shù),消除了額外數(shù)據(jù)包復(fù)制帶來的性能開銷,實(shí)現(xiàn)了接近物理機(jī)的I/O性能,有利于提升虛擬云計(jì)算平臺(tái)的性能,因此SR-IOV正逐步在虛擬云計(jì)算平臺(tái)流行起來。
SR-IOV的核心思想是:在設(shè)備支持的前提下,將一個(gè)設(shè)備劃分為一個(gè)物理功能單元(Physical Function,PF)和多個(gè)虛擬功能單元(Virtual Function,VF),每個(gè)虛擬功能單元都可以作為一個(gè)輕量級(jí)的I/O設(shè)備供虛擬機(jī)使用,這樣一個(gè)設(shè)備就可以同時(shí)被分配給多個(gè)虛擬機(jī),解決了因設(shè)備數(shù)量限制給虛擬化系統(tǒng)帶來的可擴(kuò)展性差的問題[2]。
本文研究的虛擬化設(shè)備基于FPGA實(shí)現(xiàn),選取的FPGA型號(hào)為:Intel Arria 10。該芯片可支持4個(gè)PF和2048個(gè)VF,本文實(shí)現(xiàn)了1個(gè)PF和64個(gè)VF的數(shù)據(jù)通信功能。
虛擬化PCI Express(PCIE)接口采用模塊化設(shè)計(jì),并采用多通道進(jìn)行數(shù)據(jù)處理,對(duì)VF數(shù)據(jù)進(jìn)行隔離,如圖1所示。其中PCIE(SR-IOV)為支持虛擬化的PCIE硬核,DMA0-DMA8為9個(gè)直接存儲(chǔ)訪問(Direct Memory Access,DMA)傳輸通道,通過多通道將數(shù)據(jù)進(jìn)行分流處理,以達(dá)到較高的性能,同時(shí)實(shí)現(xiàn)了VF數(shù)據(jù)的隔離。數(shù)據(jù)接口采用接口時(shí)鐘(250 MHz),內(nèi)部數(shù)據(jù)處理采用系統(tǒng)時(shí)鐘,兩個(gè)時(shí)鐘域間采用異步FIFO(First-in first-out)進(jìn)行時(shí)鐘域的轉(zhuǎn)換處理。
圖1 PCIE接口設(shè)計(jì)框圖
PCIE接口功能模塊說明:
VF分流:接收PCIE數(shù)據(jù),并根據(jù)VF號(hào)進(jìn)行數(shù)據(jù)分流,將數(shù)據(jù)轉(zhuǎn)發(fā)給不同的DMA處理單元進(jìn)行處理。
VF合流:將各DMA處理單元的數(shù)據(jù)進(jìn)行合并轉(zhuǎn)發(fā)。
鏈路分流:將PCIE數(shù)據(jù)幀按傳輸層協(xié)議(ransaction Layer Protocol,TLP)類型分為請(qǐng)求幀和完成幀,請(qǐng)求幀進(jìn)入寄存器讀寫操作處理;完成幀進(jìn)入完成幀分流處理。
完成幀分流:通過PCIE數(shù)據(jù)幀頭TAG字段,將數(shù)據(jù)分為基本描述符(Basic Descriptor)完成幀和數(shù)據(jù)完成幀。BD完成幀將進(jìn)入BD緩存FIFO;數(shù)據(jù)完成幀進(jìn)入數(shù)據(jù)組包與分流處理。
組包與分流:根據(jù)數(shù)據(jù)包TAG序號(hào)和完成地址將業(yè)務(wù)數(shù)據(jù)進(jìn)行組包并按數(shù)據(jù)類型進(jìn)行數(shù)據(jù)分流。
存儲(chǔ)器讀寫:將PCIE存儲(chǔ)器讀寫請(qǐng)求轉(zhuǎn)換為寄存器操作,當(dāng)為寄存器寫時(shí),將數(shù)據(jù)寫入FPGA內(nèi)部相應(yīng)地址;當(dāng)為寄存器讀時(shí),通過寄存器接口讀取相應(yīng)數(shù)據(jù)后封裝為讀完成幀。
寄存器處理與統(tǒng)計(jì):完成寄存器讀寫地址譯碼和狀態(tài)統(tǒng)計(jì)。
數(shù)據(jù)請(qǐng)求:根據(jù)BD完成幀信息,產(chǎn)生數(shù)據(jù)讀取幀。BD信息包括數(shù)據(jù)地址和長度等。
BD請(qǐng)求:輪詢BD指針RAM,根據(jù)指針信息判斷是否有數(shù)據(jù)需要讀取,如果有數(shù)據(jù)需要讀取則發(fā)送BD讀取幀。
業(yè)務(wù)合流:將多路數(shù)據(jù)合并。
數(shù)據(jù)發(fā)送:根據(jù)數(shù)據(jù)回寫地址、數(shù)據(jù)長度和PCIE最大寫長度,將數(shù)據(jù)封裝為多個(gè)寄存器寫TLP進(jìn)行發(fā)送。當(dāng)數(shù)據(jù)發(fā)送完成后,寫數(shù)據(jù)傳輸完成標(biāo)記。
中斷產(chǎn)生:根據(jù)數(shù)據(jù)傳輸完成標(biāo)記和中斷控制信息,產(chǎn)生相應(yīng)中斷。
鏈路復(fù)接:將多路數(shù)據(jù)進(jìn)行復(fù)接。
BD_RAM:存儲(chǔ)BD指針信息。
BD_FIFO:BD信息存儲(chǔ)。
MSI-X表:中斷信息表。
64_2_256:將數(shù)據(jù)位寬為64位的數(shù)據(jù)轉(zhuǎn)換為256位的數(shù)據(jù)。
256_2_64:將數(shù)據(jù)位寬為256位的數(shù)據(jù)轉(zhuǎn)換為64位的數(shù)據(jù)。
宿主機(jī)(虛擬機(jī))與FPGA通過BD表進(jìn)行數(shù)據(jù)信息交互。當(dāng)有數(shù)據(jù)需要交互時(shí),宿主機(jī)(虛擬機(jī))通過尾指針(Tail值)通知FPGA進(jìn)行數(shù)據(jù)讀取,在處理完成后,F(xiàn)PGA通過回寫地址進(jìn)行數(shù)據(jù)回寫。主機(jī)處理流程如圖2所示。
圖2 驅(qū)動(dòng)處理流程圖
流程說明:
初始化:通知FPGA所使用的BD表大小和基地址等;
準(zhǔn)備BD表信息:包括數(shù)據(jù)地址和長度等;
BD鏈?zhǔn)欠裼锌臻e:檢查是否可以發(fā)送;
寫FPGA端Tail值:通知FPGA數(shù)據(jù)準(zhǔn)備好;
等待中斷回應(yīng):每個(gè)VF一個(gè)中斷;
數(shù)據(jù)接收:檢查數(shù)據(jù)回寫標(biāo)記,處理數(shù)據(jù)并釋放BD空間。
FPGA端采用并行處理,分為請(qǐng)求BD、請(qǐng)求數(shù)據(jù)和數(shù)據(jù)發(fā)送3部分,其處理流程如圖3所示。
流程說明:
(1)請(qǐng)求BD
1)判斷Tail和Head值是否相等;
2)判斷是否可以存儲(chǔ)BD;
3)發(fā)送請(qǐng)求并更新Head值。
(2)請(qǐng)求數(shù)據(jù)
1)判斷BD_FIFO是否為空,空則沒有數(shù)據(jù),非空則進(jìn)行處理;
2)判斷是否有存儲(chǔ)空間,如果有則進(jìn)行數(shù)據(jù)請(qǐng)求;
3)等待數(shù)據(jù)返回并對(duì)數(shù)據(jù)進(jìn)行組包。
圖3 FPGA處理流程圖
(3)數(shù)據(jù)發(fā)送
1)判斷是否有數(shù)據(jù)需要發(fā)送,如果有則進(jìn)行分片發(fā)送;
2)寫數(shù)據(jù)已處理標(biāo)記;3)產(chǎn)生相應(yīng)的中斷。
由于傳統(tǒng)中斷和消息中斷(Message Signal Interrupt,MSI)有中斷個(gè)數(shù)的限制,且VF只支持MSI-X中斷,因此虛擬PCIE卡采用MSI-X中斷,每個(gè)VF一個(gè)中斷。初始化時(shí),驅(qū)動(dòng)需要將中斷地址和數(shù)據(jù)內(nèi)容寫入FPGA內(nèi)部MSI-X表。FPGA在獲取到中斷源信息后,根據(jù)MSI-X表內(nèi)容和中斷控制信息進(jìn)行中斷產(chǎn)生,如圖4所示。
由于通信數(shù)據(jù)量非常大,如果每個(gè)數(shù)據(jù)都產(chǎn)生一個(gè)中斷,主機(jī)將花費(fèi)大量的資源進(jìn)行中斷處理,無法進(jìn)行快速的數(shù)據(jù)傳輸處理,因此,采用中斷匯聚[3]和中斷屏蔽進(jìn)行中斷優(yōu)化處理。
中斷匯聚的方法有2種,一種是采用頻率控制,如1μs產(chǎn)生一個(gè)中斷;另外一種是采用數(shù)據(jù)包個(gè)數(shù)進(jìn)行中斷控制,當(dāng)達(dá)到某個(gè)設(shè)定值時(shí)產(chǎn)生中斷。
頻率控制雖然減少了中斷數(shù)量但無法平衡大包和小包數(shù)據(jù)傳輸?shù)臅r(shí)間差,當(dāng)進(jìn)行小包傳輸時(shí),需要更高的中斷頻率才能達(dá)到最大速率,而大包則需要更低的頻率。
圖4 中斷產(chǎn)生示意圖
本接口模型采用數(shù)據(jù)包個(gè)數(shù)進(jìn)行中斷的控制,同時(shí)設(shè)置了中斷控制寄存器和中斷屏蔽寄存器。驅(qū)動(dòng)可通過中斷控制寄存器對(duì)數(shù)據(jù)包個(gè)數(shù)和數(shù)據(jù)空閑時(shí)間進(jìn)行動(dòng)態(tài)調(diào)節(jié)。當(dāng)數(shù)據(jù)包個(gè)數(shù)未達(dá)到設(shè)置的閥值但空閑時(shí)間達(dá)到設(shè)置的閥值時(shí),F(xiàn)PGA也會(huì)發(fā)起中斷。當(dāng)驅(qū)動(dòng)進(jìn)入中斷后還可通過中斷屏蔽寄存器對(duì)中斷進(jìn)行屏蔽,當(dāng)驅(qū)動(dòng)處理完成后,再打開中斷屏蔽。
本接口模塊在設(shè)計(jì)仿真完成后,進(jìn)行了實(shí)物測(cè)試。測(cè)試時(shí),宿主機(jī)型號(hào)為:DELL T7610。在使能8個(gè)VF的狀態(tài)下,同時(shí)對(duì)1個(gè)PF和8個(gè)虛擬設(shè)備進(jìn)行收發(fā)包測(cè)試,測(cè)試結(jié)果如表1所示。
表1 測(cè)試結(jié)果 Gbit/s
經(jīng)過測(cè)試表明,該接口模型不僅實(shí)現(xiàn)了數(shù)據(jù)的高速交互,同時(shí)還平衡了各個(gè)虛擬設(shè)備間的帶寬分配。當(dāng)數(shù)據(jù)長度越長時(shí),交互效率越高,接口性能越好。
本文在對(duì)SR-IOV進(jìn)行理論研究的基礎(chǔ)上,設(shè)計(jì)實(shí)現(xiàn)了一種基于FPGA的虛擬化設(shè)備的數(shù)據(jù)交互模型,解決了云計(jì)算平臺(tái)與虛擬設(shè)備間數(shù)據(jù)交互的需求。在設(shè)計(jì)實(shí)現(xiàn)時(shí),對(duì)模塊劃分、數(shù)據(jù)交換流程和中斷處理進(jìn)行了詳細(xì)介紹。在該設(shè)計(jì)中,根據(jù)VF號(hào)對(duì)設(shè)備進(jìn)行了多通道處理,減少了不同設(shè)備間的影響;同時(shí)采用模塊化設(shè)計(jì)方式,降低了設(shè)計(jì)成本與難度,提升了數(shù)據(jù)交互能力。實(shí)驗(yàn)與分析表明,本文設(shè)計(jì)實(shí)現(xiàn)的數(shù)據(jù)交互模型能夠提供高達(dá)35 Gbit/s的有效通信帶寬。當(dāng)數(shù)據(jù)長度越長,性能越高。同時(shí)該交互模型也平衡各個(gè)虛擬設(shè)備間的帶寬分配??蓱?yīng)用于云加密卡等多種虛擬設(shè)備中。