網(wǎng)站設計 app開發(fā)優(yōu)化關鍵詞排名公司
從帝國理工的PPT學習。
什么是RDMA
Remote Direct Memory Access,也就是Remote的DMA,是一種硬件機制,能直接訪問遠端結點的內(nèi)存,而不需要處理器介入。
其中:
- Remote:跨node進行數(shù)據(jù)傳輸
- Direct:不需要CPU或者OS kernel介入
- Memory:從兩個node各自app的虛擬地址空間直接傳輸數(shù)據(jù)
- Access:支持send、receive、read、write、atomic operation
RDMA的優(yōu)點
也就說明了適用場景
- 較高的高吞吐量(帶寬)
- 較低的E2E時延
- 較低的CPU適用:單側(cè)的RDMA操作完全不需要remote CPU參與)
- 較低的內(nèi)存總線爭用:user space和kernel之間完全不拷貝數(shù)據(jù))
- 異步操作:所以很適合overlapping的通信和計算
傳統(tǒng)的TCP/IP vs RDMA
可以看到RDMA繞過kenel mode的同時也bypass了這些協(xié)議棧
協(xié)議棧對比
RDMA網(wǎng)絡棧
準備階段:設置RDMA的data channels
buffer在使用前需要在網(wǎng)卡那邊注冊一下,具體地,在注冊階段需要:
- Pin memory,保證這塊memory不會被OS swap出去
- 將地址轉(zhuǎn)換信息存到NIC里
- 對這段memory region設置權限
- 返回remote key和local key,這是給adapter在執(zhí)行RDMA操作時用的
工作隊列
RDMA通信是基于Send、Receive、Completion這三種隊列的,其中Send和Receive的queue屬于work queue,總是以Queue Pair的形式被創(chuàng)建。SQ和RQ用于schedule work,當work完成時,CQ用于通知。
在工作時,應用會issue一個work request,這個struct包含了指向一個buffer的指針:
- 對于SQ,指向要發(fā)送的消息
- 對于CQ,指向了incoming message要放入的位置
而一旦一個work request完成了,那么adapter就會往CQ里塞一個元素。
支持RDMA的網(wǎng)絡協(xié)議
IB (InfiniBand)、RoCE (RDMA over Converged Ethernet)、iWARP (internet Wide Area RDMA Protocol)
RDMA只是一種機制
并沒有指定data transfer的語義,RDMA網(wǎng)絡支持兩種訪問模型:
Two Sided:RDMA send & receive
這是最傳統(tǒng)的消息傳遞模式,消息源和目標方都積極地參與通信。
雙方都需要創(chuàng)建:
- 一對QP (SQ+CQ),用于發(fā)送和接收
- 給這對QP用的CQ
發(fā)送方的work request會指向要傳輸?shù)腷uffer,然后把這個WQE塞到SQ里發(fā)過去。
接收方的work request會指向一個empty buffer用于接收數(shù)據(jù),通過這種方式WQE會被添加到對應的RQ里。
在send+receive完成之后,也就是直接寫入了remote的registered memory,然后雙方的CQ里都會被添加一個CQE表示完成了。
One Sided:RDMA read & write + atomic操作
只有發(fā)起方是活動的,接收方是純被動的,不會issue任何操作,也不會有CPU cycle,甚至完全不會感知到有read/write發(fā)生了。
如果要發(fā)起RDMA read/write,那么work request必須包含:
- 遠端目標內(nèi)存的虛擬地址
- 遠端的memory registration key
也就是說要使用RDMA read/write,發(fā)起方必須事先就知道這兩個knowledge。
基于RDMA的上層協(xié)議
RDMA有很多好處,但也因為開發(fā)者需要使用它的Verbs API帶來了額外的復雜性。