專利名稱:一種Java應用程序遠程直接內存訪問方法
技術領域:
本發(fā)明涉及Java集群通信領域,特別涉及一種Java應用程序遠程直 才妾內存i方問方法。
背景技術:
Java語言與其它編程語言相比具有非常明顯的優(yōu)勢,它的平臺無關 性、安全性、網絡移動性,能夠極大程度地提高編程效率,增強程序的健 壯性,與不斷發(fā)展的網絡計算環(huán)境相得益彰,是目前應用最為廣泛的編程 語言。然而,Java語言也存在一些較明顯的劣勢,執(zhí)行速度慢是一個主要 缺點。已經有很多研究對Java編譯器的性能進行改進,即時編譯器(JIT compiler )、 HotSpot引擎采樣優(yōu)化等技術使Java程序能夠以和本地編譯的 C程序相媲美的速度運行。雖然這些研究工作有效地提高了 Java程序執(zhí)行 速度,但Java的I/O性能仍然是Java應用中的主要性能瓶頸。
造成Java I/O性能低下的關鍵原因在于Java虛擬機的體系結構。所有 Java應用都運行在Java虛擬機中,虛擬機隔離了物理機器、底層操作系統(tǒng) 與Java語言規(guī)范實現。這種隔離造成了 Java語言I/O操作的"間接,,特性 Java虛擬才幾不允許Java應用程序直接訪問物理內存,Java語言沒有類似于 C/C十+的指針;此外,Java虛擬機的自動垃圾收集機制,使Java應用程序 無從得知對象的存儲位置和位置的變動。這種"間接"的I/O機制,造成了 Java與C/C+十在I/O性能方面的明顯差距。與執(zhí)行速度相比,對Java I/O 性能的改進更加缺乏關注。
隨著Java應用領域的不斷擴展,它^皮廣泛應用于大規(guī)模服務器機群應 用程序。對于商業(yè)應用程序,大部分的響應時間用來從服務器端數據庫獲 取數據,具有I/O密集的特點。所以Java網絡I/O性能成為影響機群系統(tǒng) 1/0性能的主要因素。為了提升機群系統(tǒng)的通信性能,Intd、 Compaq、微 軟于1997年共同指定了虛擬接口結構規(guī)范——VIA。 VIA采用了遠程直接 內存訪問(RDMA)機制,將操作系統(tǒng)從數據傳輸的關鍵路徑上移除,減 少了不必要的數據拷貝和環(huán)境切換開銷,為集群系統(tǒng)提供了零拷貝的數據傳輸通路。IBM和Intel等公司推出的InfiniBand網絡是VIA規(guī)范的一種 實現,它通過RDMA機制,使數據在DMA引擎的控制下,在應用程序地 址空間和網絡之間直接傳遞,是一種高效的數據傳輸機制。
當前Java應用程序4吏用InfiniBand網絡RDMA才幾制的方法是基于 TCP/IP通信模擬層,如SDP、 IPoIB等。以SDP為例,如圖l所示,整個 通信機制從頂層到底層依次分為Java應用程序、Java socket、 C socket、 SDP(RDMA機制)。由于SDP本身采用C語言描述,因此Java程序不能 直接調用SDP,只能先調用Java socket,由Java socket封裝C socket,然 后再向下調用SDP。從上述的結構和通信過程可以看出,采用TCP/IP通 信模擬層的相關機制由于層次較多,不同層次間存在不同的協(xié)議,因此存 在4艮大的協(xié)議處理開銷。此外,該機制還需要在Java虛擬機緩沖區(qū)和本地 緩沖區(qū)之間進行額外的數據拷貝。因此,通信模擬層的協(xié)議處理開銷和額 外的數據拷貝造成了現有的基于InfiniBand的Java通信協(xié)議棧性能與C語 言通信協(xié)議棧之間的明顯差距。對現有Java通信協(xié)議棧進行性能測試分 析,分別測試基于千兆以太網和InfiniBand的Java通信協(xié)議棧性能,并與 C benchmark進行對比。測試結果顯示,當前Sun Java運行時環(huán)境網絡的 性能在千兆以太網上能夠達到與C相近的水平,但是在InfiniBand網絡上, 現有的通信協(xié)議棧(SDP、 IPoIB等)的性能很差,帶寬測試結果顯示, 基于IPoIB的C測試程序能夠達到峰值帶寬接近1800Mb/s,而Java測試 程序只能達到1000Mb/s;延遲性能方面,Java測試程序在IPoIB上的延遲 幾乎是C測試程序的兩倍。
發(fā)明內容
本發(fā)明的目的是克服現有的Java應用程序由于Java自身的機制所造 成的無法對物理內存直接操作,影響Java網絡I/O性能的缺陷,從而提高 一種使Java應用程序能夠遠程直接訪問內存的方法。
為了實現上述目的,本發(fā)明提供了 一種Java應用程序遠程直接內存訪 問方法,基于對InfiniBand網絡中的C版本Verbs API進行封裝所得到的 函數庫,完成以下步驟
步驟l)、調用所述函數庫中的類的方法,分別在通信過程中的客戶端 和服務器端進行預處理操作,所迷預處理操作包括創(chuàng)建完成隊列、創(chuàng)建隊 列對;步驟2)、在服務器端和客戶端,分別將所創(chuàng)建的隊列對的狀態(tài)轉換到 4刀士會^l犬;^^
步驟3)、所述服務器端與客戶端之間交換描述信息;
步驟4)、在所述客戶端中,將所述隊列對中的發(fā)送隊列和接收隊列的
狀態(tài)分別轉換到準備發(fā)送狀態(tài)和準備接收狀態(tài);
步驟5)、在所述客戶端中創(chuàng)建工作請求,并將所創(chuàng)建的工作請求提交
到所述隊列對中;
步驟6)、在所述客戶端中查詢所述完成隊列中的完成事件,根據所述 完成事件判斷遠程內存訪問操作的完成情況。
上述技術方案中,在所述的預處理步驟中,在創(chuàng)建所述的完成隊列、 隊列對前,查找設備句柄、注冊保護域、創(chuàng)建直接緩存區(qū)以及注冊內存區(qū) 域。
上述技術方案中,在對InfiniBand網絡中的C版本Verbs API進行封 裴時采用了一對一映射的方式進行封裝,所得到的函數庫中的每個Java 函數對應所述Verbs API中的 一個函數。
上述技術方案中,在所述的步驟1)中,所述的查找設備句柄包括 首先通過所述函數庫中的用于查找設備的Device類的getDeviceListAddr() 方法得到設備鏈表,然后調用getDeviceAddr()方法查找InfiniBand網絡接 口設備,得到設備句柄。
上述技術方案中,在所述的步驟1)中,所述的注冊保護域包括利 用所述的設備句柄調用函數庫中的 ProtectionDomain類的 allocateProtectionDomain()方法5主冊j呆護i或。
上述技術方案中,在所述的步驟l)中,所述的創(chuàng)建直接緩存區(qū)包括 首先調用所述函凄t庫中的DirectBufferManager類的createDirectBuffer()方 法創(chuàng)建直接緩存區(qū),然后調用 DirectBufferManager 類的 getDirectBufferAddr()方法獲取直接緩存區(qū)地址。
上述技術方案中,所述的createDirectBuffer()方法使用Java NIO提供 的直接緩存區(qū)作為數據收發(fā)的緩沖區(qū),使Java和C代碼共享數據緩沖區(qū)。
上述技術方案中,在所述的步驟1)中,所述的注冊內存區(qū)域包括 采用所述函數庫中的MemoryRegion類的registerMemoryRegion()方法注冊 內存區(qū)i或。
上述技術方案中,在所述的步驟1)中,所述的創(chuàng)建完成隊列包括采用所述函數庫中的CompletionQueue類的createCompletionQueue()方法
創(chuàng)建完成隊列。
上述技術方案中,在所述的步驟1)中,所述的創(chuàng)建隊列對包括采 用所述函數庫中的QueuePair類的createQueuePair()方法創(chuàng)建隊列對。
上述技術方案中,所述的隊列對的狀態(tài)的轉換采用所述函數庫中的 QueuePair類的modifyQueuePair()方法實現。
上述技術方案中,在所述的步驟5)中,首先采用所述函數庫中的 SendWorkRequest類的構造函數創(chuàng)建工作請求SendWorkRequest類對象, 然后調用所述函數庫中的QueuePair類的postSend()方法將工作請求提交 到隊列對中。
上述技術方案中,在所述的步驟6)中,采用所述函數庫中的 CompletionQueue類的pollCompletionQueue()方法查詢完成隊歹'J中的完成事件。
上述技術方案中,所述函數庫中各個類的方法采用"傳地址+傳對象" 與"傳地址+傳參數"結合的參數傳遞方式。 本發(fā)明的優(yōu)點在于
1、 本發(fā)明通過改進Java的I/O機制,突破JVM對Java直接內存操 作的限制,支持Java應用程序直接使用InfiniBand網絡RDMA機制,實 現零拷貝數據傳輸,充分利用InfiniBand網絡高帶寬、低延遲的性能優(yōu)勢 來提高集群系統(tǒng)的通信性能。
2、 現有技術中,整個RDMA操作過程對于Java應用程序編程者來說 是一個黑盒,編程者并不能控制RDMA操作的具體實現,而在本發(fā)明的 方法中,Java應用程序能夠直接進行RDMA操作,使得編程者能夠調用 Jdib庫控制RDMA的每一步操作。
以下,結合附圖來詳細說明本發(fā)明的實施例,其中 圖1為本發(fā)明中所涉及的函數庫Jdib的結構示意圖; 圖2為本發(fā)明的方法的流程圖3為采用Jdib函數庫進行RDMA讀寫操作的延遲時間與采用IPoIB 和SDP進行通信的延遲時間的比較圖4為采用Jdib函數庫進行RDMA讀寫操作的帶寬性能與采用IPoIB和SDP進行通信的帶寬性能的比較圖。
具體實施例方式
下面結合附圖和具體實施方式
,對本發(fā)明作進一步說明。
在本實施例中,以InfiniBand網絡為例,對本發(fā)明的方法做了進一步 的說明。為了方便理解,在對方法的實現步驟做詳細說明前,首先對 InfiniBand網絡通信中的相關概念進行說明,這些概念將在后續(xù)的說明中 出現。
隊列對InfiniBand通信的基礎是消費者把操作指令插入到通道適配 器的工作隊列中,由于這些工作隊列都是成對地創(chuàng)建,因此也被稱為隊列 對(QueuePair, QP )。 一個隊列對包括一個發(fā)送隊列和一個接收隊列,發(fā) 送隊列和接收隊列分別包含相關的指令,指示通道適配器如何發(fā)送和接收 數據。
完成隊列完成隊列是除了隊列對以外的又一種隊列,消費者通過查 詢完成隊列來了解某個操作是否已經完成。
保護域用來在"隊列對"和"內存區(qū)域"之間建立關if關,實現內存 訪問的控制機制。
在對上述概念進行描述的基礎上,對本發(fā)明的方法進行說明。在本發(fā) 明的方法中要用到的RDMA操作函數庫Jdib ( Java Direct InfiniBand ),因 此首先對該操作函數庫的生成過程進行說明。
InfiniBand網絡采用Verbs接口為上層應用提供服務,Verbs API是一 切InfiniBand應用的基礎和出發(fā)點。Verbs定義了用以實現InfiniBand傳輸 層網絡通信和管理功能的 一 系列操作,它們描述了在網絡接口適配器和操 作系統(tǒng)之間發(fā)生的操作。這些操作基于一個特殊的隊列模型向隊列中提 交工作請求,操作完成后返回完成狀態(tài)。鑒于Verbs接口在InfiniBand網 絡中的作用,本發(fā)明所涉及的Jdib函數庫是對C版本的Verbs API進行封 裝所得到的,從而提供了一種Java版本的Verbs。所述封裝通過使用JNI (Java Native Interface )實現。在封裝的過程中,涉及到以下關鍵問題
a、封裝方式采用一對一映射的封裝方式,即每個Java函數對應Verbs API中的一個函數,使用JNI為每個Java函數編寫一個stub函數,用來處 理參數傳遞和對C版本對應Verbs函數的調用。b、 封裝中的參數傳遞方法使用"傳地址+傳對象"與"傳地址+傳 參數"結合的方法。傳遞復雜數據結構(如struct)時,如果整體作為參 數傳遞,則使用"傳地址+傳對象"方式;如果需要設置或訪問結構的內 部成員,則使用"傳地址+傳參數,,方式。
c、 使用JavaNIO提供的直接緩存區(qū)(Direct buffer)作為數據收發(fā)的 緩沖區(qū),使Java和C代碼共享數據緩沖區(qū),避免Java虛擬機緩沖區(qū)到本 地緩沖區(qū)之間的數據拷貝,實現零拷貝的數據傳輸通路。
在上述設定的基礎上,可實現對C版本Verbs API的封裝進而得到函 數庫Jdib。在圖2中給出了函數庫Jdib的結構示意圖,從圖中可以看出, 函數庫Jdib根據InfiniBand的通信模型以及操作流程,構建了以QueuePair 類為邏輯中心的結構,從而對應InfiniBand以隊列對為中心的通信模型。各 個類之間的邏輯關系對應R歴A操作的流程,包括查找設備(Device )、注冊 內存區(qū)i或(MemoryRegion )、創(chuàng)建隊列》寸(QueuePair )、創(chuàng)建完成隊列 (CompletionQueue )、通信雙方互換描述信息(PingPongDest )、設置工作 請求(SendWorkRequest )、改變隊列對狀態(tài)(QueuePairAttribute )等不同 的類。在下文中將結合本發(fā)明方法的具體實現步驟,對函數庫中函數的具 體類別和功能進行進一步說明。
將上述的函數庫Jdib應用在InfiniBand網絡通信中,相關的網絡通信 機制的層次如圖3所示,包括Java應用程序、Jdib 、 Verbs API ( RDMA 機制)。與背景技術中所提到的基于TCP/IP通信模擬層的通信機制相比, 采用函數庫Jdib后的通信機制在協(xié)議層次的數量上有所降低,有利于減少 協(xié)議處理開銷。
參考圖4, Java應用程序使用Jdib函數庫進行遠程直接內存訪問的方 法如下
步驟Sl、調用Jdib函數庫中的Device類的getDeviceListAddr()方法 得到設備鏈表,再調用getDeviceAddr()查找InfiniBand網絡接口設備,得 到設備句柄;
步驟S2、使用所述設備句柄,調用Jdib函數庫中的ProtectionDomain 類的allocateProtectionDomain()方法注冊j呆護i或;
步驟S3 、調用 Jdib函數庫中的DirectBufferManager類的 createDirectBuffer()方法創(chuàng)建直接緩存區(qū)(Direct Buffer ),然后調用 DirectBufferManager類的getDirectBufferAddr()方法獲耳又直接緩存區(qū)地址;步艱《S4、調用MemoryRegion類的registerMemoryRegion()方法注冊 內存區(qū)i戈;
步-驟S5、調用CompletionQueue類的createCompletionQueue()方法創(chuàng)
建完成隊列;
步驟S6、調用QueuePair類的createQueuePair()方法創(chuàng)建隊列對; 到初始狀態(tài);
步驟S8、服務器端與客戶端通過socket連接交換描述信息; 步驟S9、調用QueuePair類的modifyQueuePair()方法轉換隊列對狀態(tài) 到準備接收狀態(tài);
步驟SIO、調用QueuePair類的modifyQueuePair()方法轉換隊列對狀 態(tài)到準備發(fā)送狀態(tài);
步驟Sll、調用SendWorkRequest類的構造函數創(chuàng)建工作請求 SendWorkRequest類對象;
步驟S12、調用QueuePair類的postSend()方法將工作請求提交到隊列 對中,
步驟S13、調用CompletionQueue類的pollCompletionQueue()方法查 詢完成隊列中的完成事件,如果查詢到完成事件則進入步驟S14;否則, 繼續(xù)查詢;
步驟S14、查看完成事件狀態(tài),若為成功則表明遠程內存訪問操作完 成;若為失敗,則遠程內存訪問失敗,進行錯誤處理(根據用戶設定選擇 重試或者》文棄)。
在上述步驟中的工作請求可以是讀操作或寫操作等。此外,由于 RDMA是單邊操作,服務器端不需要提交工作請求,也不參與對工作請求 的具體處理,因此對于服務器端而言,只需要完成上述步驟中的步驟Sl 到步驟S8即可,而客戶端則要完成上面的所有步驟。
此外,在上述步驟所涉及的方法中,QueuePair類的postSend()方法和 CompletionQueue類的pollCompletionQueue ()方法采用了 'M專;也址+ 4專參 數,,的參數傳遞方法,而其它類方法都使用了 "傳地址+傳對象"的參數 傳遞方法。
本發(fā)明利用了 InfiniBand網絡RDMA機制和NIO的direct buffer,避 免了協(xié)議處理開銷和數據拷貝開銷,縮短了數據傳輸延遲,對主機CPU資源占用較少。與現有的TCP/IP通信模擬層(如IPoIB, SDP等)相比在帶 寬和延遲性能方面都有明顯優(yōu)勢。在圖5中給出了采用Jdib函數庫進行
由圖中的信息可以看出,Jdib的延遲性能為7us ( RDMA寫操作)和8us (RDMA讀操作),優(yōu)于IPoIB (典型值24us )和SDP (典型值9us )。 在 圖6中則給出了采用Jdib函數庫進行RDMA讀寫操作的帶寬性能以及采 用IPoIB和SDP進行通信的帶寬性能。當數據量小于2048B時,SDP的帶 寬性能優(yōu)于Jdib,但數據量增大時Jdib的帶寬性能趕上并超過SDP。 Jdib 的寫操作帶寬可以達到1388MB/sec,是SDP的2.2倍,IPoIB的11.9倍。
最后所應說明的是,以上實施例僅用以說明本發(fā)明的技術方案而非限 制。盡管參照實施例對本發(fā)明進行了詳細說明,本領域的普通技術人員應當 理解,對本發(fā)明的技術方案進行修改或者等同替換,都不脫離本發(fā)明技術方 案的精神和范圍,其均應涵蓋在本發(fā)明的權利要求范圍當中。
權利要求
1、一種Java應用程序遠程直接內存訪問方法,基于對InfiniBand網絡中的C版本Verbs API進行封裝所得到的函數庫,完成以下步驟步驟1)、調用所述函數庫中的類的方法,分別在通信過程中的客戶端和服務器端進行預處理操作,所述預處理操作包括創(chuàng)建完成隊列、創(chuàng)建隊列對;步驟2)、在服務器端和客戶端,分別將所創(chuàng)建的隊列對的狀態(tài)轉換到初始狀態(tài);步驟3)、所述服務器端與客戶端之間交換描述信息;步驟4)、在所述客戶端中,將所述隊列對中的發(fā)送隊列和接收隊列的狀態(tài)分別轉換到準備發(fā)送狀態(tài)和準備接收狀態(tài);步驟5)、在所述客戶端中創(chuàng)建工作請求,并將所創(chuàng)建的工作請求提交到所述隊列對中;步驟6)、在所述客戶端中查詢所述完成隊列中的完成事件,根據所述完成事件判斷遠程內存訪問操作的完成情況。
2、 根據權利要求1所述的Java應用程序遠程直接內存訪問方法,其 特征在于,在所述的預處理步驟中,在創(chuàng)建所述的完成隊列、隊列對前, 查找設備句柄、注冊保護域、創(chuàng)建直接緩存區(qū)以及注冊內存區(qū)域。
3、 根據權利要求1所述的Java應用程序遠程直接內存訪問方法,其 特征在于,在對InfiniBand網絡中的C版本Verbs API進行封裝時采用了 一對一映射的方式進行封裝,所得到的函數庫中的每個Java函數對應所述 Verbs API中的一個函數。
4、 根據權利要求2所述的Java應用程序遠程直接內存訪問方法,其 特征在于,所述的查找設備句柄包括首先通過所述函數庫中的用于查找 設備的Device類的getDeviceListAddr()方法得到設備鏈表,然后調用 getDeviceAddr()方法查找InfiniBand網絡接口設備,得到設備句柄。
5、 根據權利要求2所述的Java應用程序遠程直接內存訪問方法,其 特征在于,所述的注冊保護域包括利用所述的設備句柄調用函數庫中的 ProtectionDomain類的allocateProtectionDomain()方法注冊保護域。
6、 根據權利要求2所述的Java應用程序遠程直接內存訪問方法,其 特征在于,所述的創(chuàng)建直接緩存區(qū)包括首先調用所述函數庫中的DirectBufferManager類的createDirectBuffer()方法創(chuàng)建直控-緩存區(qū),然后調 用DirectBufferManager類的getDirectBufferAddr()方法獲耳又直接緩存區(qū)地址。
7、 根據權利要求6所述的Java應用程序遠程直接內存訪問方法,其 特征在于,所述的createDirectBuffer()方法使用Java NIO提供的直接緩存 區(qū)作為數據收發(fā)的緩沖區(qū),使Java和C代碼共享數據緩沖區(qū)。
8、 才艮據權利要求2所述的Java應用程序遠程直接內存訪問方法,其 特征在于,所述的注冊內存區(qū)域包括釆用所述函數庫中的MemoryRegion 類的registerMemoryRegion()方法注冊內存區(qū)i或。
9、 根據權利要求1所述的Java應用程序遠程直接內存訪問方法,其 特征在于,在所述的步驟l)中,所述的創(chuàng)建完成隊列包括采用所述函 數庫中的CompletionQueue類的createCompletionQueue()方法創(chuàng)建完成隊 列。
10、 根據權利要求1所述的Java應用程序遠程直接內存訪問方法,其 特征在于,在所述的步驟1)中,所述的創(chuàng)建隊列對包括采用所述函數 庫中的QueuePair類的createQueuePair()方法創(chuàng)建隊列對。
11、 根據權利要求1所述的Java應用程序遠程直接內存訪問方法,其 特征在于,所述的隊列對的狀態(tài)的轉換采用所述函數庫中的QueuePair類 的modifyQueuePair()方法實現。
12、 根據權利要求1所述的Java應用程序遠程直接內存訪問方法,其 特征在于,在所述的步驟5 )中,首先采用所述函凄t庫中的SendWorkRequest 類的構造函數創(chuàng)建工作請求SendWorkRequest類對象,然后調用所述函數 庫中的QueuePair類的postSend()方法將工作請求提交到隊列對中。
13、 根據權利要求1所述的Java應用程序遠程直接內存訪問方法,其 特征在于,在所述的步驟6)中,采用所述函數庫中的CompletionQueue 類的pollCompletionQueue()方法查詢完成隊列中的完成事件。
14、 根據權利要求1所述的Java應用程序遠程直接內存訪問方法,其 特征在于,所述函數庫中各個類的方法采用"傳地址+傳對象,,與"傳地 址+傳參數"結合的參數傳遞方式。
全文摘要
本發(fā)明提供一種Java應用程序遠程直接內存訪問方法,在對InfiniBand網絡中的C版本Verbs API進行封裝所得到的函數庫的基礎上,完成以下步驟調用函數庫中的類的方法,分別在客戶端和服務器端進行包括查找設備句柄、注冊保護域、創(chuàng)建直接緩存區(qū)、注冊內存區(qū)域、創(chuàng)建完成隊列、創(chuàng)建隊列對在內的預處理過程;將所創(chuàng)建的隊列對的狀態(tài)轉換到初始狀態(tài);服務器端與客戶端之間交換描述信息;將所述隊列對中的發(fā)送隊列和接收隊列的狀態(tài)分別轉換到準備發(fā)送狀態(tài)和準備接收狀態(tài);創(chuàng)建工作請求,并將所創(chuàng)建的工作請求提交到隊列對中;查詢完成隊列中的完成事件,根據完成事件判斷遠程內存訪問操作的完成情況。
文檔編號H04L29/08GK101303656SQ20081011449
公開日2008年11月12日 申請日期2008年6月6日 優(yōu)先權日2008年6月6日
發(fā)明者勁 賀, 韓冀中, 婉 黃 申請人:中國科學院計算技術研究所