一.什么是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中然后發送端才能發送數據,如果接受端來不及完成這些操作發送端就發送數據,就會出現上述錯誤。