InfiniBand簡介

一.什麼是infiniband

InfiniBand架構是一種支持多併發鏈接的“轉換線纜”技術,它是新一代服務器硬件平臺的I/O標準。由於它具有高帶寬、低延時、 高可擴展性的特點,它非常適用於服務器與服務器(比如複製,分佈式工作等),服務器和存儲設備(比如SAN和直接存儲附件)以及服務器和網絡之間(比如LAN, WANs和the Internet)的通信 。

二.Infiniband產生的原因

隨着CPU性能的飛速發展,I/O系統的性能成爲制約服務器性能的瓶頸。於是人們開始重新審視使用了十幾年的PCI總線架構。雖然PCI總線結構把數據的傳輸從8位/16位一舉提升到32位,甚至當前的64位,但是它的一些先天劣勢限制了其繼續發展的勢頭。PCI總線有如下缺陷:

(1)由於採用了基於總線的共享傳輸模式,在PCI總線上不可能同時傳送兩組以上的數據,當一個PCI設備佔用總線時,其他設備只能等待;

(2)隨着總線頻率從33MHz提高到66MHz,甚至133MHz(PCI-X),信號線之間的相互干擾變得越來越嚴重,在一塊主板上佈設多條總線的難度也就越來越大;

(3)由於PCI設備採用了內存映射I/O地址的方式建立與內存的聯繫,熱添加PCI設備變成了一件非常困難的工作。目前的做法是在內存中爲每一個PCI設備劃出一塊50M到100M的區域,這段空間用戶是不能使用的,因此如果一塊主板上支持的熱插拔PCI接口越多,用戶損失的內存就越多;

(4)PCI的總線上雖然有buffer作爲數據的緩衝區,但是它不具備糾錯的功能,如果在傳輸的過程中發生了數據丟失或損壞的情況,控制器只能觸發一個NMI中斷通知操作系統在PCI總線上發生了錯誤

    因此,Intel、 Cisco、 Compaq、 EMC、 富士通等公司共同發起了infiniband架構,其目的是爲了取代PCI成爲系統互連的新技術標準,其核心就是將I/O系統從服務器主機中分離出來。

InfiniBand 採 用雙隊列程序提取技術,使應用程序直接將數據從適配器 送入到應用內存(稱爲遠程直接存儲器存取或RDMA), 反之依然。在TCP/IP協議中,來自網卡的數據先拷貝到 核心內存,然後再拷貝到應用存儲空間,或從應用空間 將數據拷貝到核心內存,再經由網卡發送到Internet。這 種I/O操作方式,始終需要經過核心內存的轉換,它不 僅增加了數據流傳輸路徑的長度,而且大大降低了I/O 的訪問速度,增加了CPU的負擔。而SDP則是將來自網 卡的數據直接拷貝到用戶的應用空間,從而避免了核心 內存參入。這種方式就稱爲零拷貝,它可以在進行大量 數據處理時,達到該協議所能達到的最大的吞吐量

三.Infiniband的協議層次與網絡結構

 

圖1

Infiniband的協議採用分層結構,各個層次之間相互獨立,下層爲上層提供服務。其中,物理層定義了在線路上如何將比特信號組 成符號,然後再組成幀、 數據符號以及包之間的數據填 充等,詳細說明了構建有效包的信令協議等;鏈路層定義了數據包的格式以及數據包操作的協議,如流控、 路由選擇、 編碼、解碼等;網絡層通過在數據包上添加一個40字節的全局的路由報頭(Global Route Header,GRH)來進行路由的選擇,對數據進行轉發。在轉發的過程中,路由 器僅僅進行可變的CRC校驗,這樣就保證了端到端的數據傳輸的完整性;傳輸層再將數據包傳送到某個指定 的隊列偶(QueuePair,QP)中,並指示QP如何處理該數據 包以及當信息的數據淨核部分大於通道的最大傳輸單 元MTU時,對數據進行分段和重組。

  

圖2

Infiniband的網絡拓撲結構如圖2,其組成單元主要分爲四類:

(1)HCA(Host Channel Adapter),它是連接內存控制器和TCA的橋樑;

(2)TCA(Target Channel Adapter),它將I/O設備(例如網卡、SCSI控制器)的數字信號打包發送給HCA;

(3)Infiniband link,它是連接HCA和TCA的光纖,InfiniBand架構允許硬件廠家以1條、4條、12條光纖3種方式連結TCA和HCA;

(4)交換機和路由器;

無論是HCA還是TCA,其實質都是一個主機適配器,它是一個具備一定保護功能的可編程DMA(Direct Memory Access,直接內存存取 )引擎,

 

圖3

   

如圖3所示,每個端口具有一個GUID(Globally Unique Identifier),GUID是全局唯一的,類似於以太網MAC地址。運行過程中,子網管理代理(SMA)會給端口分配一個本地標識(LID),LID僅在子網內部有用。QP是infiniband的一個重要概念,它是指發送隊列和接收隊列的組合,用戶調用API發送接收數據的時候,實際上是將數據放入QP當中,然後以輪詢的方式將QP中的請求一條條的處理,其模式類似於生產者-消費者模式。

 

圖4

如圖4所示,圖中Work queue即是QP中的send Queue或者receive Queue,WQ中的請求被處理完成之後,就被放到Work Completion中。

四.如何使用IB verbs傳送數據

Infiniband提供了VPI verbs API和RDMA_CM verbs API 這兩個API集合,用戶使用其中的庫函數,就能很方便的在不同的機器之間傳輸數據。Infiniband建立連接的流程如下圖所示:

 

圖5

其中buildcontext的流程如下:

 

圖6

連接建立完成之後,就可以調用ibv_post_recv和ibv_post_send收發數據了,發送和接收請求都被放在QP中,後臺需要調用ibv_poll_cq來逐條處理請求,由於infiniband連接中,一旦有一條數據發送或者接收失敗,其後所有的數據發送或者接收都會失敗,因此一旦檢測到WC的狀態不是成功,需要立即處理此錯誤(此時最好斷開連接)。

五.常見錯誤

     ibv_poll_cq處理完隊列中的數據後,WC會包含此次處理的全部信息,包括wr_id、操作狀態、錯誤碼等等,錯誤碼包含的信息對於我們解決錯誤非常有用,這裏我就列舉一下我在編寫代碼中遇到的錯誤。

(1)錯誤碼爲4(IBV_WC_LOC_PROT_ERR ),這種錯誤通常意味着用戶對內存的操作權限不夠,需要檢測在ibv_post_recv和ibv_post_send時scatter/gather list 中傳入的內存地址與長度是否正確,或者ibv_reg_mr操作是否成功。

(2)錯誤碼爲5,(IBV_WC_WR_FLUSH_ERR ),在flush的時候出現錯誤,通常是因爲前一個操作出現了錯誤,接下來的一系列操作都會出現      

IBV_WC_WR_FLUSH_ERR的錯誤。

(3)錯誤碼爲13(IBV_WC_RNR_RETRY_EXC_ERR  ),這種錯誤一般是因爲本地post數據過快。在infiniband傳輸數據過程中,接收端首選需要註冊內存並ibv_post_recv將此內存放入receive queue中然後發送端才能發送數據,如果接受端來不及完成這些操作發送端就發送數據,就會出現上述錯誤。


轉自:“達沃時代”
http://www.cnblogs.com/D-Tec/p/3157582.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章