2017年5月26日 星期五

[筆記] 支援 RDMA 的技術:(一)iWARP

iWARP

iWARP 簡單來說,就是 RFC 定義的 RDMA 技術。
(詳見維基百科中 iWARP 的條目
  • RFC 5040 A Remote Direct Memory Access Protocol Specification
  • RFC 5041 Direct Data Placement over Reliable Transports
  • RFC 5043 Stream Control Transmission Protocol (SCTP) Direct Data Placement (DDP) Adaptation
  • RFC 5044 Marker PDU Aligned Framing for TCP Specification
  • RFC 5042 Direct Data Placement Protocol (DDP) / Remote Direct Memory Access Protocol (RDMAP) Security
  • RFC 6580 IANA Registries for the Remote Direct Data Placement (RDDP) Protocols
  • RFC 6581 Enhanced Remote Direct Memory Access (RDMA)
  • RFC 7306 Remote Direct Memory Access (RDMA) Protocol Extensions


RFC 中定義的 RDMA 具有以下幾種操作動作:
  1. Send
將訊息(Messenge)送至接收方尚未聲明(Advertisment)的緩衝區(buffer)內。與 RDMA Write 不同的地方在於對方的緩衝區有沒有被聲明
  1. Send with Invalidate
將訊息送至接收方尚未聲明的緩衝區,接收方收到訊息後這段緩衝區無法被傳送方存取,直到接收方重新開放存取並聲明這塊緩衝區。
  1. Send with Solicited Events
Solicited Event,詳見 RDMAmojo。簡單的說就有點像是寄雙掛號的意思,接收方收到傳送方的訊息之後,會回傳 Solicited Events。
  1. Send with Solicited Events and Invalidate
照字面上的意思,就是除了發 Invalidate,還會發 Solicited Events。
  1. RDMA Write
接收方會先聲明一塊緩衝區,然後傳送方在訊息上加上 sTag,把訊息傳送到被聲明的緩衝區裡。
  1. RDMA Read
要讀取方會先聲明一塊緩衝區,然後通知對方要讀取,對方會在讀取的內容上加上 sTag 傳送過來這塊緩衝區。
  1. Terminate

這邊提到的對緩衝區做的任何動作,像是聲明緩衝區、對緩衝區貼上 sTag,
這些都不是 RDMA 能辦到的事,而是它底層的 DDP 負責的事。
但光是 RDMA + DDP 仍然不夠,因為並沒有傳輸功能,
所以還要依靠再下層的傳輸協定。

也就是說,如果下層的傳輸協定是可信賴的(reliable ),
那這個 RDMA 就是可信賴的,反之亦然。
所以 RFC 又針對 RDMA + DDP 定義了可信賴連線,
就是上圖的 Stack 了!

2017年5月16日 星期二

[軟體] Linux 上免費的測頻寬工具 - qperf

大部分的人在測頻寬的時候,都會想到 iperf 這個軟體。
(其實他已經很好用了,尤其又有 windows 版本)
不過由於 qperf 沒有 support RDMA,所以來研究一下 qperf。

qperf 跟 iperf 很像,都是需要兩台機器,一台當 server,一台當 client。


當 Server 的機器只要下 "qperf" 即可。
當 Client 的機器的指令則是
qperf <server ip> <test pattern>
例如:qperf 10.0.10.1 tcp_bw

不同的 test pattern 會跑不同的測試。
如果不跑 RDMA 的話,下面四個 test pattern 應該就很夠一般使用了!
  • tcp_bw : TCP bandwidth
  • tcp_lat : TCP latency
  • udp_bw : UDP bandwidth
  • udp_lat : TDP latency
(更多 test pattern,可以下 qperf --help tests)

當然,可以在 <server ip> <test pattern> 中間加上 options。
(不能加在最後!!不能加在最後!!不能加在最後!!)
比較常用的 options 大概是
-ca (or --cpu_affinity)      綁定 CPU
-m (or --msg_size)       設定訊息大小
-t   (or --time)               設定時間(預設兩秒)
-v   (or --verbose)        提供更多輸出資訊

qperf 比 iperf 豐富的地方莫過是拿 -oo (or --loop) 來測 loop 了!
qperf <server ip> -oo Var:Init:Last:Incr <test pattern>
範例: qperf  10.0.10.1  -oo msg_size:1K:1G:*2  tcp_bw
第一個參數 msg_size 是指要拿不同的 message size 來做測試
第二個參數 1K 是指從 1K 大小開始測試
第三個參數 2K 是指測到 1G 大小結束
第四個參數 *2 代表每次增加是以兩倍的方式增加

結果:


另外是,如果不是 RedHat 5以上,或 CentOS 7,qperf 是需要自己下載的。Source code
按照 README 就能很順利的 build 出 qperf 的 binary 檔。
一般 OS 沒有 libibverbs 的情況下,build 出來的 qperf 是沒有 RDMA 功能的。