【轉(zhuǎn)】RDMA 基礎(chǔ)
RDMA 基礎(chǔ)

fxp2001640
關(guān)注
14 人贊同了該文章
目錄
收起
1,為什么需要RDMA
2,RDMA example
3,RDMA組件架構(gòu)
4,OFED Stack
5,隊(duì)列模型
6,RDMA服務(wù)類型
7,RDMA語(yǔ)義
8,RDMA核心概念
9,RDMA數(shù)據(jù)面流程
1,為什么需要RDMA
以TCP/IP為代表的傳統(tǒng)報(bào)文收發(fā)IO架構(gòu)有幾個(gè)痛點(diǎn):
?數(shù)據(jù)多次拷貝(用戶態(tài)到內(nèi)核態(tài)再到硬件),
?頻繁的中斷以及由此導(dǎo)致的多次上下文切換,
?復(fù)雜冗長(zhǎng)的內(nèi)核協(xié)議棧,
?需要消耗CPU來軟件處理解析報(bào)文頭。
這些問題導(dǎo)致傳統(tǒng)的TCP/IP形式的IO時(shí)延在30us-50us左右。這種時(shí)延已無法滿足越來越多的微秒級(jí)應(yīng)用(如NVMe存儲(chǔ)訪問)。
RDMA是一種遠(yuǎn)程直接內(nèi)存訪問技術(shù),它允許從用戶態(tài)向硬件提交對(duì)對(duì)端內(nèi)存的訪問,這個(gè)訪問也不被對(duì)端CPU感知而是直接在網(wǎng)卡里完成。相比于TCP/IP網(wǎng)絡(luò)RDMA有以下幾項(xiàng)性能優(yōu)勢(shì):
?零拷貝,數(shù)據(jù)直接從用戶態(tài)到硬件不再經(jīng)過內(nèi)核態(tài)的拷貝;
?Kernel bypass,數(shù)據(jù)路徑在用戶態(tài)和硬件之間完成,不再經(jīng)歷到內(nèi)核態(tài)的上下文切換;
?CPU免打擾,read/write對(duì)端內(nèi)存不需要對(duì)端CPU參與,所有報(bào)文封裝解析,內(nèi)存搬運(yùn)都是由硬件完成。
這些特性使得RDMA的端到端時(shí)延可以降低至微秒級(jí),同時(shí)也使CPU的負(fù)載大大降低。RDMA本身可以over在4種傳輸層之上:infiniband,ethernet(RoCE V1),UDP/IP(RoCE V2),TCP/IP(iWARP),其中infiniband傳輸層需要專有硬件,而其他的都可以復(fù)用以太網(wǎng)。
2,RDMA example
dev_list = ibv_get_device_list(NULL);
if (!strcmp(ibv_get_device_name(dev_list[i]), ib_devname))
?ib_dev = dev_list[i];
ctx = ibv_open_device(ib_dev);
pd = ibv_alloc_pd(ctx);
mr = ibv_reg_mr(pd, buf, size, access_flags);
cq = ibv_create_cq(ctx, rx_depth, NULL, NULL, 0);
init_attr = { .send_cq = cq, .recv_cq = cq, .cap = { .max_recv_wr = rx_depth }, .qp_type = IBV_QPT_RC };
qp = ibv_create_qp(pd, &init_attr);
attr = { .qp_state = IBV_QPS_INIT, .pkey_index = 0, .port_num = port, .qp_access_flags = 0 };
ibv_modify_qp(ctx->qp, &attr);
ibv_post_recv(ctx->qp, &wr, &bad_wr);
exchange (gid, lid, qpn, rkey, psn) with TCP socket
attr = { .qp_state = IBV_QPS_RTR, .path_mtu = mtu, .dest_qp_num = dest->qpn, .rq_psn = dest->psn, };
ibv_modify_qp(ctx->qp, &attr);
attr = { .qp_state = IBV_QPS_RTS, .sq_psn = my_psn };
ibv_modify_qp(ctx->qp, &attr);
sge_list = { .addr = buf, .length = size, .lkey = lkey };
wr = { .wr_id = xxx, .sg_list = &list, .num_sge = 1, .opcode = IBV_WR_SEND, .send_flags = ctx->send_flags };
ibv_post_send(ctx->qp, &wr, &bad_wr);
ibv_poll_cq(ctx, 1, &wc);
process wc;
3,RDMA組件架構(gòu)
4,OFED Stack
Open Fabrics Enterprise Distribution(OFED)是一個(gè)開源軟件包集合,其中包含內(nèi)核框架和驅(qū)動(dòng)、用戶框架和驅(qū)動(dòng)、以及各種中間件、測(cè)試工具和API文檔。開源OFED由OFA組織負(fù)責(zé)開發(fā)、發(fā)布和維護(hù),它會(huì)定期從rdma-core和內(nèi)核的RDMA子系統(tǒng)取軟件版本,并對(duì)各商用OS發(fā)行版進(jìn)行適配。除了協(xié)議棧和驅(qū)動(dòng)外,還包含了perftest等測(cè)試工具。
5,隊(duì)列模型
6,RDMA服務(wù)類型
6.1 可靠(Reliable):
可靠服務(wù)在發(fā)送和接受者之間保證了信息最多只會(huì)傳遞一次,并且能夠保證其按照發(fā)送順序完整的被接收。IB通過以下三個(gè)機(jī)制來保證可靠性:
應(yīng)答機(jī)制:可靠服務(wù)類型使用應(yīng)答機(jī)制ACK來保證數(shù)據(jù)包被對(duì)方收到。接收方可以累積方式ACK。
數(shù)據(jù)校驗(yàn)機(jī)制:發(fā)端對(duì)Header和Payload計(jì)算CRC校驗(yàn)和放到數(shù)據(jù)包末尾。對(duì)端收到數(shù)據(jù)包后以相同算法計(jì)算出CRC,然后與數(shù)據(jù)包中CRC比對(duì),若不同則丟棄這個(gè)包。
保序機(jī)制:保序是指先被發(fā)送到物理鏈路上的數(shù)據(jù)包一定要先于后發(fā)送的數(shù)據(jù)包被接收方收到。每個(gè)包都有一個(gè)PSN序號(hào),如收端收到了1和3,卻沒收到2,那么其就會(huì)認(rèn)為傳輸過程中發(fā)生了錯(cuò)誤,之后會(huì)回復(fù)一個(gè)NAK給發(fā)端,讓其重發(fā)丟失的包。
6.2 連接(connection):
連接是一條通信的“管道”,一旦管道建立好了,管道這端發(fā)出的數(shù)據(jù)一定會(huì)沿著這條管道到達(dá)另一端。對(duì)于基于連接的服務(wù)來說,每個(gè)QP都和另一個(gè)遠(yuǎn)端節(jié)點(diǎn)相關(guān)聯(lián)。在這種情況下,QP Context中包含有遠(yuǎn)端節(jié)點(diǎn)的QP信息。在建立通信的過程中,兩個(gè)節(jié)點(diǎn)會(huì)交換包括稍后用于通信的QP在內(nèi)的對(duì)端信息。
6.3 數(shù)據(jù)報(bào)(datagram):
對(duì)于數(shù)據(jù)報(bào)服務(wù)來說,QP不會(huì)跟一個(gè)唯一的遠(yuǎn)端節(jié)點(diǎn)綁定,而是通過WQE來指定目的節(jié)點(diǎn)。和連接類型的服務(wù)一樣,建立通信的過程也需要兩端交換對(duì)端信息,但是數(shù)據(jù)報(bào)服務(wù)對(duì)于每個(gè)目的節(jié)點(diǎn)都需要執(zhí)行一次這個(gè)交換過程。
6.4 Reliable Connection (RC):
QP只關(guān)聯(lián)至一個(gè)對(duì)端QP,消息被確??煽康貍鬏斨翆?duì)端,且消息是保序的,這非常類似于TCP連接。RC用于對(duì)數(shù)據(jù)完整性和可靠性要求較高的場(chǎng)景,跟TCP一樣,因?yàn)樾枰鞣N機(jī)制來保證可靠,所以開銷自然會(huì)大一些。另外由于RC服務(wù)類型和每個(gè)節(jié)點(diǎn)間需要各自維護(hù)一個(gè)QP,假設(shè)有N個(gè)幾點(diǎn)需要相互通信,那么需要N * (N - 1)個(gè)QP,而QP和QPC本身是需要占用網(wǎng)卡資源或者內(nèi)存的,當(dāng)節(jié)點(diǎn)數(shù)很多時(shí),存儲(chǔ)資源消耗將會(huì)非常大。
6.5 Unreliable Datagram (UD):
一個(gè)QP可以發(fā)送消息給任意對(duì)端,也可接收任意對(duì)端來的消息。不保證可靠性和傳輸順序,這非常類似UDP。UD硬件開銷小并且節(jié)省存儲(chǔ)資源,比如N個(gè)節(jié)點(diǎn)需要相互通信,只需要?jiǎng)?chuàng)建N個(gè)QP就可以了,但是可靠性跟UDP一樣沒法保證。用戶如果想基于UD服務(wù)類型實(shí)現(xiàn)可靠性,那么需要自己基于IB傳輸層實(shí)現(xiàn)應(yīng)用層的可靠傳輸機(jī)制。

7,RDMA語(yǔ)義
8,RDMA核心概念
9,RDMA數(shù)據(jù)面流程
編輯于 2022-09-24 12:27
RDMA