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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM