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則是未來自網 卡的數據直接拷貝到用戶的應用空間,從而避免了核心 內存參入。這種方式就稱爲零拷貝,它能夠在進行大量 數據處理時,達到該協議所能達到的最大的吞吐量post

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

 

圖1性能

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

  

圖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中而後發送端才能發送數據,若是接受端來不及完成這些操做發送端就發送數據,就會出現上述錯誤。

相關文章
相關標籤/搜索