InfiniBand简介
一.什么是infiniband
InfiniBand架構(gòu)是一種支持多并發(fā)鏈接的“轉(zhuǎn)換線纜”技術(shù),它是新一代服務(wù)器硬件平臺(tái)的I/O標(biāo)準(zhǔn)。由于它具有高帶寬、低延時(shí)、 高可擴(kuò)展性的特點(diǎn),它非常適用于服務(wù)器與服務(wù)器(比如復(fù)制,分布式工作等),服務(wù)器和存儲(chǔ)設(shè)備(比如SAN和直接存儲(chǔ)附件)以及服務(wù)器和網(wǎng)絡(luò)之間(比如LAN, WANs和the Internet)的通信 。
二.Infiniband產(chǎn)生的原因
隨著CPU性能的飛速發(fā)展,I/O系統(tǒng)的性能成為制約服務(wù)器性能的瓶頸。于是人們開始重新審視使用了十幾年的PCI總線架構(gòu)。雖然PCI總線結(jié)構(gòu)把數(shù)據(jù)的傳輸從8位/16位一舉提升到32位,甚至當(dāng)前的64位,但是它的一些先天劣勢(shì)限制了其繼續(xù)發(fā)展的勢(shì)頭。PCI總線有如下缺陷:
(1)由于采用了基于總線的共享傳輸模式,在PCI總線上不可能同時(shí)傳送兩組以上的數(shù)據(jù),當(dāng)一個(gè)PCI設(shè)備占用總線時(shí),其他設(shè)備只能等待;
(2)隨著總線頻率從33MHz提高到66MHz,甚至133MHz(PCI-X),信號(hào)線之間的相互干擾變得越來(lái)越嚴(yán)重,在一塊主板上布設(shè)多條總線的難度也就越來(lái)越大;
(3)由于PCI設(shè)備采用了內(nèi)存映射I/O地址的方式建立與內(nèi)存的聯(lián)系,熱添加PCI設(shè)備變成了一件非常困難的工作。目前的做法是在內(nèi)存中為每一個(gè)PCI設(shè)備劃出一塊50M到100M的區(qū)域,這段空間用戶是不能使用的,因此如果一塊主板上支持的熱插拔PCI接口越多,用戶損失的內(nèi)存就越多;
(4)PCI的總線上雖然有buffer作為數(shù)據(jù)的緩沖區(qū),但是它不具備糾錯(cuò)的功能,如果在傳輸?shù)倪^程中發(fā)生了數(shù)據(jù)丟失或損壞的情況,控制器只能觸發(fā)一個(gè)NMI中斷通知操作系統(tǒng)在PCI總線上發(fā)生了錯(cuò)誤
??? 因此,Intel、?Cisco、?Compaq、?EMC、?富士通等公司共同發(fā)起了infiniband架構(gòu),其目的是為了取代PCI成為系統(tǒng)互連的新技術(shù)標(biāo)準(zhǔn),其核心就是將I/O系統(tǒng)從服務(wù)器主機(jī)中分離出來(lái)。
InfiniBand?采?用雙隊(duì)列程序提取技術(shù),使應(yīng)用程序直接將數(shù)據(jù)從適配器?送入到應(yīng)用內(nèi)存(稱為遠(yuǎn)程直接存儲(chǔ)器存取或RDMA),?反之依然。在TCP/IP協(xié)議中,來(lái)自網(wǎng)卡的數(shù)據(jù)先拷貝到?核心內(nèi)存,然后再拷貝到應(yīng)用存儲(chǔ)空間,或從應(yīng)用空間?將數(shù)據(jù)拷貝到核心內(nèi)存,再經(jīng)由網(wǎng)卡發(fā)送到Internet。這?種I/O操作方式,始終需要經(jīng)過核心內(nèi)存的轉(zhuǎn)換,它不?僅增加了數(shù)據(jù)流傳輸路徑的長(zhǎng)度,而且大大降低了I/O?的訪問速度,增加了CPU的負(fù)擔(dān)。而SDP則是將來(lái)自網(wǎng)?卡的數(shù)據(jù)直接拷貝到用戶的應(yīng)用空間,從而避免了核心?內(nèi)存參入。這種方式就稱為零拷貝,它可以在進(jìn)行大量?數(shù)據(jù)處理時(shí),達(dá)到該協(xié)議所能達(dá)到的最大的吞吐量
三.Infiniband的協(xié)議層次與網(wǎng)絡(luò)結(jié)構(gòu)
?
圖1
Infiniband的協(xié)議采用分層結(jié)構(gòu),各個(gè)層次之間相互獨(dú)立,下層為上層提供服務(wù)。其中,物理層定義了在線路上如何將比特信號(hào)組?成符號(hào),然后再組成幀、?數(shù)據(jù)符號(hào)以及包之間的數(shù)據(jù)填?充等,詳細(xì)說明了構(gòu)建有效包的信令協(xié)議等;鏈路層定義了數(shù)據(jù)包的格式以及數(shù)據(jù)包操作的協(xié)議,如流控、 路由選擇、 編碼、解碼等;網(wǎng)絡(luò)層通過在數(shù)據(jù)包上添加一個(gè)40字節(jié)的全局的路由報(bào)頭(Global Route Header,GRH)來(lái)進(jìn)行路由的選擇,對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)發(fā)。在轉(zhuǎn)發(fā)的過程中,路由 器僅僅進(jìn)行可變的CRC校驗(yàn),這樣就保證了端到端的數(shù)據(jù)傳輸?shù)耐暾?#xff1b;傳輸層再將數(shù)據(jù)包傳送到某個(gè)指定?的隊(duì)列偶(QueuePair,QP)中,并指示QP如何處理該數(shù)據(jù)?包以及當(dāng)信息的數(shù)據(jù)凈核部分大于通道的最大傳輸單?元MTU時(shí),對(duì)數(shù)據(jù)進(jìn)行分段和重組。
??
圖2
Infiniband的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)如圖2,其組成單元主要分為四類:
(1)HCA(Host Channel Adapter),它是連接內(nèi)存控制器和TCA的橋梁;
(2)TCA(Target Channel Adapter),它將I/O設(shè)備(例如網(wǎng)卡、SCSI控制器)的數(shù)字信號(hào)打包發(fā)送給HCA;
(3)Infiniband link,它是連接HCA和TCA的光纖,InfiniBand架構(gòu)允許硬件廠家以1條、4條、12條光纖3種方式連結(jié)TCA和HCA;
(4)交換機(jī)和路由器;
無(wú)論是HCA還是TCA,其實(shí)質(zhì)都是一個(gè)主機(jī)適配器,它是一個(gè)具備一定保護(hù)功能的可編程DMA(Direct Memory Access,直接內(nèi)存存取 )引擎,
?
圖3
???
如圖3所示,每個(gè)端口具有一個(gè)GUID(Globally Unique Identifier),GUID是全局唯一的,類似于以太網(wǎng)MAC地址。運(yùn)行過程中,子網(wǎng)管理代理(SMA)會(huì)給端口分配一個(gè)本地標(biāo)識(shí)(LID),LID僅在子網(wǎng)內(nèi)部有用。QP是infiniband的一個(gè)重要概念,它是指發(fā)送隊(duì)列和接收隊(duì)列的組合,用戶調(diào)用API發(fā)送接收數(shù)據(jù)的時(shí)候,實(shí)際上是將數(shù)據(jù)放入QP當(dāng)中,然后以輪詢的方式將QP中的請(qǐng)求一條條的處理,其模式類似于生產(chǎn)者-消費(fèi)者模式。
?
圖4
如圖4所示,圖中Work queue即是QP中的send Queue或者receive Queue,WQ中的請(qǐng)求被處理完成之后,就被放到Work Completion中。
四.如何使用IB verbs傳送數(shù)據(jù)
Infiniband提供了VPI verbs API和RDMA_CM verbs API 這兩個(gè)API集合,用戶使用其中的庫(kù)函數(shù),就能很方便的在不同的機(jī)器之間傳輸數(shù)據(jù)。Infiniband建立連接的流程如下圖所示:
?
圖5
其中buildcontext的流程如下:
圖6
連接建立完成之后,就可以調(diào)用ibv_post_recv和ibv_post_send收發(fā)數(shù)據(jù)了,發(fā)送和接收請(qǐng)求都被放在QP中,后臺(tái)需要調(diào)用ibv_poll_cq來(lái)逐條處理請(qǐng)求,由于infiniband連接中,一旦有一條數(shù)據(jù)發(fā)送或者接收失敗,其后所有的數(shù)據(jù)發(fā)送或者接收都會(huì)失敗,因此一旦檢測(cè)到WC的狀態(tài)不是成功,需要立即處理此錯(cuò)誤(此時(shí)最好斷開連接)。
五.常見錯(cuò)誤
???? ibv_poll_cq處理完隊(duì)列中的數(shù)據(jù)后,WC會(huì)包含此次處理的全部信息,包括wr_id、操作狀態(tài)、錯(cuò)誤碼等等,錯(cuò)誤碼包含的信息對(duì)于我們解決錯(cuò)誤非常有用,這里我就列舉一下我在編寫代碼中遇到的錯(cuò)誤。
(1)錯(cuò)誤碼為4(IBV_WC_LOC_PROT_ERR?),這種錯(cuò)誤通常意味著用戶對(duì)內(nèi)存的操作權(quán)限不夠,需要檢測(cè)在ibv_post_recv和ibv_post_send時(shí)scatter/gather list 中傳入的內(nèi)存地址與長(zhǎng)度是否正確,或者ibv_reg_mr操作是否成功。
(2)錯(cuò)誤碼為5,(IBV_WC_WR_FLUSH_ERR?),在flush的時(shí)候出現(xiàn)錯(cuò)誤,通常是因?yàn)榍耙粋€(gè)操作出現(xiàn)了錯(cuò)誤,接下來(lái)的一系列操作都會(huì)出現(xiàn)??????
IBV_WC_WR_FLUSH_ERR的錯(cuò)誤。
(3)錯(cuò)誤碼為13(IBV_WC_RNR_RETRY_EXC_ERR??),這種錯(cuò)誤一般是因?yàn)楸镜豴ost數(shù)據(jù)過快。在infiniband傳輸數(shù)據(jù)過程中,接收端首選需要注冊(cè)內(nèi)存并ibv_post_recv將此內(nèi)存放入receive queue中然后發(fā)送端才能發(fā)送數(shù)據(jù),如果接受端來(lái)不及完成這些操作發(fā)送端就發(fā)送數(shù)據(jù),就會(huì)出現(xiàn)上述錯(cuò)誤。
總結(jié)
以上是生活随笔為你收集整理的InfiniBand简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS开发UI篇-在UItablevie
- 下一篇: 物联网感知-高压直流长距离供电在线实时监