謝尚威,華 蓓
(中國科學技術大學 計算機科學與技術學院,合肥 230027)
高性能計算在科研、工程、金融等許多領域有著廣泛的應用.由于超級計算機及定制軟件的高昂成本,由廉價服務器構成的計算機集群成為許多企業(yè)和組織首選的高性能計算平臺.RDMA(Remote Direct Memory Access)是當下高性能計算及分布式系統(tǒng)中應用最廣泛的網(wǎng)絡通信技術[1],它可將數(shù)據(jù)從源主機的應用緩存直接傳輸?shù)侥康闹鳈C的應用緩存而不需要雙方操作系統(tǒng)的參與.RDMA 將傳輸協(xié)議實現(xiàn)在硬件層面上,同時在數(shù)據(jù)傳輸路徑上繞過操作系統(tǒng)內核,相比于傳統(tǒng)的TCP/IP網(wǎng)絡,RDMA具有高吞吐、低延遲、低CPU占用的優(yōu)點[2].RDMA通過專用的RDMA網(wǎng)卡(RNIC)和Verbs接口為應用提供高速通信服務.
近年來,高性能計算正加速向云環(huán)境遷移,利用云計算的彈性來適應用戶不斷變化的計算需求,并節(jié)省用戶對硬件基礎設施的投資[3].虛擬化是云計算的基礎,當高性能計算向云端遷移時,如何在虛擬化環(huán)境下實現(xiàn)高效的網(wǎng)絡通信是需要解決的問題.目前網(wǎng)絡I/O設備的虛擬化技術可以分為硬件支持的虛擬化和基于軟件的虛擬化兩類.硬件支持的虛擬化包括PCI直通和單根虛擬化[4],PCI直通繞過虛擬化平臺直接將網(wǎng)卡設備分配給虛擬機使用,相當于虛擬機獨占了一個網(wǎng)卡設備;SR-IOV則在PCIe層面將網(wǎng)卡設備虛擬成多個設備接口,從系統(tǒng)設備驅動的角度來看相當于多個網(wǎng)卡設備.硬件支持的虛擬化方法雖然使用方便,虛擬機之間的隔離性也很好,但是在這些硬件虛擬化方法下,虛擬化平臺不能對虛擬機中的流量進行諸如流量限速、安全檢查等一些必要的流量管理,然而流量管理是很多場景中必不可少的功能,因此目前通過硬件虛擬化實現(xiàn)的網(wǎng)絡設備虛擬化的應用場景十分有限.基于軟件的虛擬化包括全虛擬化和半虛擬化,全虛擬化使用軟件模擬網(wǎng)絡設備的IO請求,由于需要對每個IO請求進行模擬,所以其效率較低,但是由于其完整的模擬了一個網(wǎng)絡設備,所以其通用性比較好;半虛擬化相當于全虛擬化的進一步優(yōu)化,相比于完全的模擬一個網(wǎng)絡設備,半虛擬化選擇設計了一個虛擬機和虛擬化平臺之間的IO協(xié)議,該協(xié)議主要包括兩部分,位于客戶機操作系統(tǒng)的前端和位于宿主機的后端,由前端和后端共同模擬完成IO請求.半虛擬化技術是一個IO協(xié)議,因此靈活性較高,基于該協(xié)議可以實現(xiàn)虛擬塊設備IO、虛擬網(wǎng)絡設備IO等.并且前端和后端之間的通信采用共享內存的方式,所以其也具備不錯的性能.半虛擬化是目前云環(huán)境主流的網(wǎng)絡I/O虛擬化方法[5].
而對于高性能計算中普遍使用的RDMA網(wǎng)絡設備來講,目前成熟的RDMA虛擬化方案僅有SR-IOV方案.如上所說,這種虛擬化方案使用場景有限,共有云環(huán)境不適用.VMWare提出的vRDMA[6]方案,可用于云環(huán)境,但該方案閉源,且性能也不理想.HyV[7]對RDMA的控制通路采用半虛擬化方法,對數(shù)據(jù)通路則采用直通的方法來提高虛擬機數(shù)據(jù)傳輸速率,然而由于數(shù)據(jù)通路直通硬件,仍未解決公有云中租戶流量隔離等問題.vSocket[6]考慮到公有云中大多數(shù)應用采用套接字(socket)通信,提出了連接虛擬化的方法.其基本思想是,后端為前端提供一個虛擬連接而不是一個RDMA虛擬設備,后端為虛擬機中的每一個套接字連接建立一個虛擬連接,每一個虛擬連接映射到底層的一個RDMA連接上,當應用調用套接字收發(fā)數(shù)據(jù)時,虛擬連接接管數(shù)據(jù)傳輸過程,在虛擬機和RDMA網(wǎng)卡之間直接傳輸數(shù)據(jù).vSocket實現(xiàn)了平臺和RDMA設備及驅動的完全解耦合.
高性能計算任務通常具有數(shù)據(jù)量大,計算量大的特點,因此目前大多數(shù)的高性能計算均采用并行計算的方式來提高計算性能.目前高性能計算中使用比較普遍的并行編程框架是MPI[8](Message Passing Interface)通信庫.MPI的基本思想是通過在不同的計算節(jié)點之間通過消息傳遞將數(shù)據(jù)分配到不同的節(jié)點做并行計算,進而達到并行使用計算節(jié)點資源的目的,提高了計算的效率.該庫規(guī)定了基本的點對點通信和群集通信原語用來將數(shù)據(jù)在多個節(jié)點上做不同的運算操作.在實現(xiàn)方式上,MPI通常以第三方庫的形式存在,為了提高可用性,MPI目前已經(jīng)支持如RDMA網(wǎng)絡、以太網(wǎng)等主流網(wǎng)絡平臺.當高性能計算遷移到云環(huán)境時,MPI/RDMA的通信性能取決于所采用的RDMA虛擬化技術.從目前已有的RDMA虛擬化方案來看,既能滿足云環(huán)境要求、又能充分發(fā)揮RDMA性能優(yōu)勢的方案只有vSocket,但是注意到為兼容套接字API的語義,vSocket在應用進程與vSocket前端之間傳輸數(shù)據(jù)時需要一次數(shù)據(jù)拷貝.
在要求低延遲的通信中,優(yōu)化延遲一直是廣受關注的課題,通信延遲優(yōu)化除了可以在網(wǎng)絡鏈路上做傳輸延遲優(yōu)化以外,主機側的數(shù)據(jù)處理造成的延遲也是不容忽視的一部分,特別是數(shù)據(jù)拷貝.不少研究工作都是從減少數(shù)據(jù)拷貝入手來減少網(wǎng)絡通信主機側的延遲[9].MPI目前支持通過socket進行通信,但由于API采用non-block通信,因此上述方案中的vSocket必須通過數(shù)據(jù)拷貝來確保應用數(shù)據(jù)能在用戶傳輸函數(shù)調用結束后依然可用,滿足用戶數(shù)據(jù)傳輸?shù)男枨?然而在MPI中,應用數(shù)據(jù)在傳輸函數(shù)調用結束后并不能直接回收使用,需要用戶顯式的調用buffer回收接口,因此MPI不需要采用像vSocket一樣通過拷貝應用數(shù)據(jù)來確保數(shù)據(jù)被可靠傳輸.
本文借鑒vSocket的連接虛擬化思想,提出了在虛擬機環(huán)境下優(yōu)化MPI/RDMA數(shù)據(jù)傳輸延遲的通信方案VMPI,可滿足云環(huán)境對流量管理的要求,同時實現(xiàn)了數(shù)據(jù)路徑上的零拷貝傳輸,進一步降低了MPI通信中端到端的通信延遲.實驗表明,VMPI可將MPI的點對點通信延遲減少40%左右,并可降低Graph500的通信時間占比.
MPI是一種基于消息傳遞的編程接口,該接口目前已有OpenMPI、MVAPICH、IntelMPI等多種實現(xiàn)版本.為兼容不同的底層網(wǎng)絡,MPI庫在物理網(wǎng)絡上實現(xiàn)了一個設備抽象層,用以提供與底層網(wǎng)絡無關的統(tǒng)一接口;同時,MPI庫針對不同的網(wǎng)絡平臺實現(xiàn)了不同的通信模塊,以提供最佳的通信延遲.設備抽象層上面是一個通道層,不同進程之間的通信抽象為一個通道,消息在通道中傳輸.在通道層之上提供各種通信函數(shù),如點對點通信、群集通信等.
半虛擬化由于同時具備良好的性能以及能夠對虛擬網(wǎng)絡流量進行精細的管理,在云計算中被廣泛使用.半虛擬化由運行在客戶機中的前端和運行在宿主機上的后端驅動組成.前端驅動將Guest OS的I/O請求發(fā)送給后端,后端通過物理設備實現(xiàn)I/O操作,并將請求結果通知前端.
由IBM于2008年提出的virtio[10]半虛擬化前后端通信協(xié)議已成為I/O設備半虛擬化的應用標準.virtio是對一組通用I/O設備的抽象,包括前端驅動、后端驅動以及用于前后端通信的虛擬隊列(virtqueue).通過半虛擬化網(wǎng)絡I/O,實現(xiàn)了前后端驅動分離,方便了虛擬機遷移,同時宿主機通過后端驅動可以監(jiān)管客戶機網(wǎng)絡流量,也方便實施租戶網(wǎng)絡隔離、網(wǎng)絡安全監(jiān)控等.
RDMA是一種新興的網(wǎng)絡通信技術,它的特點是遠程直接內存訪問功能.RDMA技術最早出現(xiàn)在高性能計算中的Infiniband網(wǎng)絡,用于高性能計算集群內部計算節(jié)點的高速互聯(lián),這種Infiniband網(wǎng)絡性能優(yōu)良,但網(wǎng)卡和交換機的價格都非常昂貴.后來出現(xiàn)了基于以太網(wǎng)的RDMA技術RoCE,這一技術使得RDMA技術在許多數(shù)據(jù)中心得到普及.
RDMA通過verbs軟件庫向應用提供編程接口.Verbs支持兩種消息傳輸模式:單邊模式和雙邊模式.單邊模式可以直接對遠端內存進行讀寫等操作,只需發(fā)起讀寫指令一端的CPU參與,不需要遠端機器的CPU參與,因而能有效的減少網(wǎng)絡IO對CPU資源的消耗,同時也具有很低的延遲和很高的帶寬.雙邊模式包括發(fā)送、接收等操作,需要雙方的CPU參與,接收端準備好接收數(shù)據(jù)所需的內存,通過發(fā)送端的發(fā)送操作將數(shù)據(jù)寫入到接收端提供的的用于接收數(shù)據(jù)的內存塊中來完成一次數(shù)據(jù)傳輸.
在使用RDMA進行通信時,應用需要首先通過RNIC對需要發(fā)送的數(shù)據(jù)塊進行注冊,注冊的本質是將該內存塊對應虛擬地址與物理地址的映射關系同步給RDMA網(wǎng)絡設備,以便RDMA設備能夠通過DMA繞過CPU直接讀取數(shù)據(jù),提高RDMA網(wǎng)絡設備的IO效率,同時被注冊的內存塊也會被設置為不可置換頁(不會被操作系統(tǒng)交換到磁盤上),防止頁置換引發(fā)數(shù)據(jù)讀取錯誤.可見注冊內存塊是一個高開銷的操作[11].
RDMA的通信模式不同于socket的字節(jié)流通信模型,其通信模型是基于消息的傳輸模型.當應用需要和遠端應用通信時,它們之間創(chuàng)建一條邏輯上的消息隊列.該消息隊列由一個發(fā)送隊列(SQ)和一個接收隊列(RQ)組成的隊列對(Queue Pairs,QP),讀/寫或收/發(fā)請求被封裝成工作請求項放到相應的隊列中.每個隊列還關聯(lián)一個完成隊列(CQ),用于通知相應隊列中的請求已處理完成[12].
考慮到公有云環(huán)境對網(wǎng)絡的特殊需要,以及應用對網(wǎng)絡的高性能的追求,vSocket提出了一個可行的解決方案.該方案通過傳統(tǒng)的socket接口為應用提供網(wǎng)絡通信,同時在虛擬化后端利用高性能的RDMA網(wǎng)絡設備為應用提供高性能的網(wǎng)絡傳輸服務.該方案的基本思想是網(wǎng)絡連接虛擬化,即不再采用半虛擬化的方法對RDMA網(wǎng)絡設備進行IO虛擬化,而是通過RDMA連接來模擬傳統(tǒng)的socket應用中的TCP連接.一條虛擬連接與一條TCP連接提供數(shù)據(jù)報文的轉發(fā)服務,每條虛擬連接都通過一個物理的RDMA連接傳輸數(shù)據(jù).同時為了兼顧公有云環(huán)境網(wǎng)絡連接的管理需要,vSocket采用了控制路徑和數(shù)據(jù)路徑分離的方法,控制路徑通過virtio-net半虛擬化框架,通過virtio-net客戶機可以在網(wǎng)絡創(chuàng)建階段執(zhí)行連接控制策略;當需要傳輸數(shù)據(jù)時,網(wǎng)絡連接被虛擬連接接管,數(shù)據(jù)傳輸繞過內核協(xié)議棧通過特別設計的virtio消息通道進行數(shù)據(jù)傳輸.
在具體實現(xiàn)上,vSocket實現(xiàn)了一個截獲模塊,虛擬機發(fā)出的所有socket函數(shù)調用都會被該模塊攔截.位于虛擬機機中的前端模塊,用于將攔截到的socket請求通過virtio通信框架傳輸給后端模塊.后端模塊則負責根據(jù)前端發(fā)來的控制消息或者數(shù)據(jù)報文做出相對應的處理,完成一次完整的數(shù)據(jù)傳輸操作.
本文提出在虛擬機環(huán)境下優(yōu)化MPI/RDMA傳輸延遲的通信方案VMPI.VMPI的設計目標是既能夠滿足云環(huán)境對虛擬機網(wǎng)絡管控的需求,同時又能提供高性能的網(wǎng)絡通信,這與vSocket的設計目標一致.因此,我們借鑒vSocket的系統(tǒng)框架,保留其連接虛擬化、控制路徑和數(shù)據(jù)路徑相分離的先進設計,通過改造數(shù)據(jù)路徑來優(yōu)化對MPI編程接口的支持,為基于MPI的高性能計算提供最佳的通信性能.
在vSocket的系統(tǒng)框架上,VMPI需要做兩方面的改造.首先,socket接口與MPI接口差異較大,需要重新設計截獲層;其次,要實現(xiàn)數(shù)據(jù)路徑上的零拷貝,這也是VMPI的設計重點.
在數(shù)據(jù)路徑上,應用需要通過verbs接口為待發(fā)送的數(shù)據(jù)提前進行注冊,而內存注冊會引入系統(tǒng)調用進而帶來不必要的延遲.所以RDMA應用通常在程序初始化階段預先準備一塊內存池,對這塊內存池做一次性的注冊,后續(xù)需要傳輸?shù)臄?shù)據(jù)可以拷貝到這塊內存中之后,再進行發(fā)送,這樣就避免了頻繁的內存注冊操作.這種方式能在一定程度上解決內存注冊所帶來的延遲開銷,其弊端在于引入了內存拷貝帶來的延遲增大,特別是在待傳輸?shù)臄?shù)據(jù)為比較大的數(shù)據(jù)塊時,拷貝帶來的開銷就更加顯著.考慮到內存注冊和內存拷貝這兩部分的延遲開銷,VMP在數(shù)據(jù)路徑的設計上需要同時權衡這兩方面.由于內存注冊時間不會隨著注冊內存塊的增大而線性增長,而內存拷貝時間卻與內存塊大小成線性增長關系.通過以上分析,可以總結出以下規(guī)律,小消息的注冊開銷對通信延遲的影響較大,而大消息的拷貝開銷對通信延遲的影響較大.基于這種規(guī)律,VMPI選擇對不同大小的消息采用不同的處理方法.消息大小小于一定閾值的消息(小消息)先拷貝到預先分配和注冊好的通用消息池中,再進行傳輸.消息大小大于一定閾值的消息(大消息)則采用零拷貝傳輸,即在需要傳輸之前進行注冊.另外,考慮到部分應用為了優(yōu)化內存注冊所帶來的延遲開銷通常會在初始化階段分配好通信需要的緩存區(qū),然后在進行數(shù)據(jù)傳輸時會盡量重用這些緩存區(qū),因此VMPI在后端模塊中設計了一個注冊緩存系統(tǒng),將完成大消息傳輸?shù)木彺鎱^(qū)的相關地址信息記錄在緩存系統(tǒng)中,當該緩存區(qū)被用于下一次消息傳輸時,通過查詢注冊緩沖中的一些地址信息就可以復用已經(jīng)注冊過的內存,避免了不必要的內存注冊開銷.
圖1是VMPI的總體結構,包括截獲層、前端、后端3個部分,前端和后端之間利用virtio框架進行通信.截獲層用于攔截與MPI通信相關的函數(shù)調用.在控制路徑上,截獲的MPI初始化連接請求被轉換通過基于內核協(xié)議棧的virtio-net模塊建立的網(wǎng)絡連接,同時,VMPI會在前端和后端之間建立一個對應的虛擬連接,虛擬連接并沒有實際的網(wǎng)絡連接,本質上是用于記錄虛擬機中應用網(wǎng)絡連接的數(shù)據(jù).在前端模塊中使用<目的IP地址,目的端口號,源IP地址,源端口號>四元組記錄該虛擬連接,后端模塊使用上述四元組外加租戶IP來標識虛擬連接,添加租戶ID是考慮到在公有云環(huán)境中同一個宿主機上可能存在IP相同的客戶機.因此,為了標識宿主機上的不同虛擬機,后端添加了租戶ID字段.在數(shù)據(jù)路徑上,與消息傳輸相關的函數(shù)被轉發(fā)到前端.前端接收虛擬機需要傳輸?shù)南?,根?jù)元數(shù)據(jù)(緩存區(qū)地址、消息長度等)中的消息長度確定使用大消息路徑還是小消息路徑,之后將其元數(shù)據(jù)通過virtio轉發(fā)到后端.后端從應用緩存區(qū)(大消息)或通用消息池(小消息)中取出消息,通過RDMA連接轉發(fā)出去.
圖1 VMPI總體結構Fig.1 VMPI architecture
VMPI的通信連接在邏輯上包括兩部分,其一是通過內核協(xié)議棧建立的一個基于virtio-net的傳統(tǒng)socket連接(控制路徑),這條網(wǎng)絡連接的作用是為虛擬機或者宿主機能夠對虛擬機中的網(wǎng)絡連接提供訪問控制;其二是為該socket連接構造的虛擬連接.后端針對每一個虛擬連接對象在宿主機中映射到一個RDMA連接,為虛擬連接網(wǎng)絡通信服務.
在宿主機中建立RDMA連接時,需要知道兩端宿主機的IP地址.因此需要一個機制用來交換通信雙方宿主機的IP地址.VMPI采用的具體方案是:當VMPI建立連接時,前端通過virtio通知后端虛擬機請求創(chuàng)建一個網(wǎng)絡連接,后端需要建立對應的RDMA連接用來提供流量轉發(fā);然而RDMA網(wǎng)絡連接的建立需要知道對端的IP地址,后端目前沒有這一信息,所以宿主機此時無法立即建立RDMA連接.因此,后端通知前端自己需要知道對端宿主機的IP地址,前端在收到后端的這一請求后,通過之前同對端已經(jīng)建立好的網(wǎng)絡連接請求對端的宿主機IP并通知對端自己所在宿主機的IP地址,在得到另一端宿主機的IP地址后通告給后端;此后后端才可以根據(jù)兩端宿主機的IP地址建立RDMA連接.具體建立連接的算法如算法1所示.
算法1.VMPI建立連接算法
輸入:<源IP地址,源端口號,目的IP地址,目的端口號>,簡記為conn;
輸出:true:成功;false:失?。?/p>
Begin:
Step1.MPI_init(conn);//MPI初始化連接.
Intercept(conn);//截獲該調用.
Transfer-front(conn);//轉發(fā)到前端.
Step2.Table[num++]=conn;//前端記錄該連接.
sock=Create_socket(conn);
//通過內核協(xié)議棧建立socket連接.
Step3.Get_host_ip(HIP);
//向后端請求獲取宿主機IP記為HIP.
Step4.Swap_IP(sock,HIP,tmp_IP);
//通過建立的socket與另一端交換HIP,并
//將遠端IP記為tmp_IP.
Step5.Transfer-back(conn,tmp_IP);
//前端將連接信息轉發(fā)到后端
Step6.rdma_conn=search(tmp_IP)
If(!rdma_conn){
rdma_conn=Create_rdma(tmp_IP);
//檢查是否已存在對應的rdma連接,如果沒有則重//新建立,并記錄為rdma-conn.
If(!result)
Map(conn,rdma_conn);
//將虛擬連接映射到物理RDMA連接上.
}
Step7.Return result;//返回結果.
End
由于MPI應用運行在虛擬機OS中,所以MPI應用程序中的消息的地址是虛擬機操作系統(tǒng)中的虛擬地址GVA(guest virtual address).然而后端數(shù)據(jù)轉發(fā)進程將緩存區(qū)中的數(shù)據(jù)經(jīng)過網(wǎng)絡設備傳輸時,需要將其轉化為其在后端進程中的虛擬地址HVA(host virtual address),因此VMPI需要維護GVA到HVA的映射關系,這樣才能完成地址轉換.
VMPI設計了以下機制用來維護GVA到HVA的的映射關系:虛擬化平臺通常將虛擬機作為一個單獨的進程運行.而虛擬機中運行的進程通過虛擬機OS自身的頁表維護GVA到GPA的地址轉換關系,這與普通的OS一致,可以將這個映射關系簡記為f1(GVA,GPA).另外,虛擬化平臺通過擴展頁表(EPT)記錄虛擬機硬件地址GPA(guest physical address)到宿主機硬件地址HPA(host physical address)的映射關系,簡記為f2(GPA,HPA).而在Virtio框架中會維護每個GPA到HVA的映射關系,簡記為f3(GPA,HVA).通過上述的3個信息,VMPI可以掌握GVA到HVA的地址映射關系,從而完成MPI應用中的消息緩存區(qū)地址(GVA)到后端進程中的虛擬地址(HVA)的轉化工作.具體實現(xiàn)時,f1和f2分別由客戶機OS、VMM自動完成,不需要干涉,而f3則由VMPI通過第三方庫DPDK-vhost實現(xiàn).
VMPI傳輸消息的過程如下:
步驟1.截獲層將攔截的MPI數(shù)據(jù)傳輸請求轉發(fā)到前端,轉發(fā)給前端的信息包括數(shù)據(jù)在客戶機中的虛擬地址(GVA)、數(shù)據(jù)大小(size)和虛擬連接信息(vconn);前端依據(jù)客戶機中的頁表信息,將GVA轉換為GPA,將三元組轉換為
步驟2.前端將
步驟3.后端掃描virtqueue中的
步驟4.后端根據(jù)vconn以及虛擬連接和物理連接之間的映射關系,找到對應的RDMA連接,將緩存區(qū)中的內容發(fā)送出去.
VMPI采用send、receive接口傳輸內存地址、內存大小等元數(shù)據(jù),采用RDMA write接口傳輸內存數(shù)據(jù).這兩個過程存在依賴關系,因為通信的雙發(fā)只有知道了需要傳輸?shù)膬却嫘畔?,才能將需要傳輸?shù)膬却嫱ㄟ^RDMA傳輸出去.VMPI設計了一組協(xié)議來協(xié)調上述的兩個過程進行數(shù)據(jù)傳輸.圖2是一次數(shù)據(jù)傳輸?shù)慕换ミ^程:
圖2 一次數(shù)據(jù)傳輸?shù)慕换ミ^程Fig.2 Interactive process of a data transmission
1)接收端通過注冊緩存系統(tǒng)準備好接收緩存區(qū)后,使用send接口向發(fā)送端發(fā)送一個srcAvail包,通知發(fā)送端接收緩存區(qū)已準備完畢.srcAvail中包含接收緩存區(qū)地址、接收緩存區(qū)的rkey值、虛擬連接的四元組信息以及租戶id等信息.
2)發(fā)送端使用receive接口收到srcAvail包后,等待對應發(fā)送緩存區(qū)通過注冊緩存系統(tǒng)準備完成后,通過RDMA write來完成數(shù)據(jù)的傳輸操作.
3)發(fā)送端等待write操作完成后,使用send 接口發(fā)送compl包告知接收端傳輸完成;接收端使用receive接口收到compl包,之后MPI send函數(shù)返回.一次數(shù)據(jù)傳輸操作完成.
注冊緩存系統(tǒng)用于緩存那些在大消息傳輸時已注冊并使用過的緩存區(qū),以便下次可以直接重用,避免頻繁進行注冊.為向RNIC注冊一個緩存區(qū),首先將send、receive等函數(shù)中的緩存區(qū)虛擬地址(GVA)轉換為后端進程地址空間中的地址(HVA),然后后端將這塊緩存區(qū)
本節(jié)評估VMPI的通信性能.服務器A配有Intel E5-2650 CPU/64GB內存,服務器B配有Intel E5-2630 CPU/32GB內存,兩臺服務器通過40Gbps RDMA網(wǎng)卡直接相連,網(wǎng)卡型號為Mellanox ConnectX-3 40G QDR infiniband.兩臺服務器均運行Ubuntu14.04操作系統(tǒng),verbs庫使用OFED-3.4.測試時,兩臺物理機上各運行一個虛擬機,用于測試的應用程序運行在虛擬機中.本節(jié)設計了兩組實驗,第1組使用微基準測試程序測量VMPI的通信延遲,第2組使用Graph500作為MPI應用,通過對比測試驗證VMPI對MPI應用的通信性能是否有優(yōu)化效果.Graph500是高性能計算領域可信度較高的基準測試程序,該程序的核心部分是圖算法中的廣度優(yōu)先搜索算法和單源最短路徑算法.
這一部分的實驗是VMPI在有拷貝和無拷貝兩種機制下的延遲對比實驗.第1組實驗中采用拷貝機制,第2組實驗采用無拷貝機制.測量指標是一次數(shù)據(jù)傳輸?shù)耐禃r間RTT(round trip time).實驗中設置消息大小從2B到54KB不等.對于每一種消息長度,利用MPI receive和 MPI send收發(fā)消息.對于每一種消息長度,測量1000次RTT,并計算平均RTT值.
兩組實驗的測試結果如圖3所示,橫坐標為消息長度,縱坐標為RTT值.從圖3中可以看到,當消息長度小于2KB,零拷貝組的RTT值略大,說明這時注冊開銷大于拷貝開銷.隨后拷貝組的RTT值開始大于零拷貝組,但是兩者之間的差值并不大,說明拷貝開銷開始對通信延遲的產生影響.當消息長度大于40KB時,隨著消息增大,兩者之間的差值也在增大,此時零拷貝組的延遲卻并沒有大幅增加.可以發(fā)現(xiàn),在大消息傳輸時,相比于拷貝組,通信延遲的降幅可以達到40%左右.這組實驗說明,當傳輸大消息時,零拷貝具有降低通信延遲的效果.
圖3 有拷貝和無拷貝情形下的往返延遲Fig.3 Round trip time with/without data copy
本節(jié)在3個平臺上通過Grapha500進行對比測試實驗:1)物理機環(huán)境,Graph500應用運行在宿主機中,直接使用RDMA網(wǎng)絡設備;2)graph500運行在虛擬機中,虛擬機使用傳統(tǒng)的virtio半虛擬化的RDMA網(wǎng)絡設備;3)本文提出并實現(xiàn)的VMPI環(huán)境,消息的閾值設為40KB.Graph500應用程序運行時包括2個參數(shù),scale值用來表示圖的頂點規(guī)模,edge factor表示圖的邊規(guī)模.實驗時edge factor采用了8和16兩個值.Scale采用10,15,20三個值.實驗采用交叉組合測的方法,利用perf工具統(tǒng)計MPI應用在一次完整的運行過程中調用MPI接口通信的時間在Graph500整個運行時間中所占的比例,實驗結果如圖4所示.
圖4 graph500的通信時間占比Fig.4 Proportion of communication time on graph500
從圖4中的實驗結果可以發(fā)現(xiàn),物理機平臺下通信時間占比最小,這是因為物理機環(huán)境沒有引入虛擬化所帶來的通信延遲開銷.相比于以太網(wǎng)模式的半虛擬化方案,VMPI平臺可使Graph500的通信時間占比降低10%~30%.這組實驗說明,VMPI可以有效降低MPI應用的通信時間占比,VMPI的方案具有一定的延遲優(yōu)化效果.
為支持高性能計算向云環(huán)境遷移,本文提出了MPI/RDMA庫在虛擬機環(huán)境下的通信優(yōu)化方案VMPI,重點解決了數(shù)據(jù)路徑上的零拷貝傳輸問題.VMPI采用控制路徑和數(shù)據(jù)路徑相分離的技術,控制路徑滿足云環(huán)境對虛擬機網(wǎng)絡的管控要求,數(shù)據(jù)路徑實現(xiàn)高效率數(shù)據(jù)傳輸.為平衡數(shù)據(jù)拷貝和內存注冊的開銷,VMPI對小消息采用拷貝傳輸,對大消息采用零拷貝傳輸.為分攤內存注冊開銷,VMPI設計了注冊緩存系統(tǒng)來重用已經(jīng)注冊過的緩存區(qū).使用微基準測試程序和Graph500應用基準測試程序的實驗表明,VMPI可以有效提高MPI的通信性能.