作者簡介
Explorer,專注于高性能網絡、虛擬化網絡及網卡的測試方案研究。熟悉dpdk,rdma,sdn等技術的應用與解決方案。
01深入了解RDMA技術
背景概述
隨著互聯網的普及和數字化轉型的加速,大量數據被生成和傳輸。在AI訓練和推理、大數據分析以及存儲應用中,處理這些海量數據變得至關重要。因此,高性能網絡對于快速而可靠的數據傳輸至關重要。
RDMA(Remote Direct Memory Access,遠程直接內存訪問)是一種高效的數據傳輸技術,它使得兩臺計算機之間可以直接從對方的內存中讀取或寫入數據,而不需要CPU的介入。通過RDMA,計算機之間的數據傳輸速度更快,延遲更低,傳輸效率更高,而且可以減少CPU的負載。
應用場景
RDMA技術在各個領域都有廣泛的應用,其高性能和低延遲的特點使其成為許多應用的關鍵組成部分,以下是當前RDMA技術的一些應用場景介紹:
高性能計算(HPC)
RDMA技術在HPC領域得到廣泛應用,用于大規模科學計算、氣象模擬、分子建模等任務。RDMA可以實現節點之間的快速數據共享,從而加速復雜計算任務的完成,降低了整體計算時間。
云計算和虛擬化
公有云和私有云服務提供商采用RDMA技術來改善虛擬機之間的通信性能。這在云環境中特別重要,因為它可以提高虛擬機之間的網絡吞吐量,從而提高了云計算資源的利用率。
存儲系統
RDMA技術在高性能存儲系統中發揮重要作用,如分布式文件系統、SAN存儲、塊存儲等。它提供了低延遲、高帶寬的數據傳輸,有助于加速數據讀寫操作,提高存儲性能。
金融交易
在金融領域,時間和性能至關重要。RDMA技術用于構建低延遲的交易系統,確保交易數據能夠實時傳輸和處理,從而降低了交易風險。
訓練深度學習模型需要大量數據傳輸和計算資源。RDMA技術可用于加速大規模深度學習任務,減少模型訓練時間。
實時數據分析
對于需要實時數據分析的應用,如廣告投放、市場分析和網絡安全監控,RDMA技術可以確保數據能夠實時傳輸和分析,提供即時決策支持。
遠程備份和復制
在數據備份和復制中,RDMA技術可以加速數據傳輸,降低備份時間,同時提供數據完整性和可靠性。
高性能數據庫
RDMA技術可用于構建高性能數據庫系統,實現快速數據訪問和查詢操作,從而加速數據處理。
RDMA技術在各種領域中都有重要應用,特別是在需要高性能、低延遲和大規模數據傳輸的場景中。它為這些應用提供了關鍵的網絡通信支持,加速了各種計算和數據處理任務,有助于提高系統性能和效率。隨著技術的不斷發展,RDMA技術的應用前景將繼續擴展。
技術特點
內核 Bypass:RDMA允許數據直接在內存之間傳輸,而不需要通過操作系統內核。傳統的Socket通信在數據傳輸時需要將數據從用戶空間復制到內核空間,然后再從內核空間復制到另一個用戶空間。而RDMA通過繞過內核,使數據可以直接在用戶空間之間傳輸,從而減少了數據復制的開銷,提高了數據傳輸效率。
零拷貝:RDMA支持零拷貝操作,意味著數據可以直接在應用程序的內存空間中傳輸,而無需中間的數據拷貝操作。這減少了CPU的負擔和數據傳輸的延遲,提高了系統性能。
協議卸載:RDMA技術允許網絡適配器卸載協議的處理任務,將網絡協議的處理從主機CPU轉移到網絡適配器上。這樣可以減輕主機CPU的負擔,提高系統整體性能。
低延遲和高吞吐量:RDMA的直接內存訪問和零拷貝特性導致了低延遲和高吞吐量。數據可以直接在內存之間傳輸,而不需要中間的數據復制,從而減少了通信的延遲并提高了數據傳輸的速率。
支持遠程直接內存訪問:RDMA允許應用程序直接訪問遠程主機的內存,而無需通過中間服務器進行數據傳輸。這使得在分布式系統中進行高效的數據共享成為可能,同時減少了通信的開銷。
支持協議
RDMA技術支持三類協議,分別為InfiniBand(IB),RDMA over Converged Ethernet(RoCE)和internet Wide Area RDMA Protocol(iWARP),三類協議使用相同的RDMA標準。
>InfiniBand
InfiniBand是一種基于InfiniBand架構的RDMA技術,它提供了一種基于通道的點對點消息隊列轉發模型,每個應用都可通過創建的虛擬通道直接獲取本應用的數據消息,無需其他操作系統及協議棧的介入。InfiniBand架構的應用層采用了RDMA技術,可以提供遠程節點間RDMA讀寫訪問,完全卸載CPU工作負載;網絡傳輸采用了高帶寬的傳輸;鏈路層設置特定的重傳機制保證服務質量,不需要數據緩沖。
InfiniBand必須運行在InfiniBand網絡環境下,必須使用IB交換機及IB網卡才可實現。
>RoCE
RoCE技術支持在以太網上承載IB協議,實現RDMA over Ethernet。RoCE與InfiniBand技術有相同的軟件應用層及傳輸控制層,僅網絡層及以太網鏈路層存在差異。
RoCE v1協議:基于以太網承載RDMA,只能部署于二層網絡,它的報文結構是在原有的IB架構的報文上增加二層以太網的報文頭,通過Ethertype 0x8915標識RoCE報文。
RoCE v2協議:基于UDP/IP協議承載RDMA,可部署于三層網絡,它的報文結構是在原有的IB架構的報文上增加UDP頭、IP頭和二層以太網報文頭,通過UDP目的端口號4791標識RoCE報文。RoCE v2支持基于源端口號hash,采用ECMP實現負載分擔,提高了網絡的利用率。
下圖為RoCE的協議棧:
| RoCE協議棧
>iWARP
iWARP協議是IETF基于TCP提出的,因為TCP是面向連接的可靠協議,這使得iWARP在面對有損網絡場景(可以理解為網絡環境中可能經常出現丟包)時相比于RoCE v2和IB具有更好的可靠性,在大規模組網時也有明顯的優勢。但是大量的TCP連接會耗費很多的內存資源,另外TCP復雜的流控等機制會導致性能問題,所以從性能上看iWARP要比UDP的RoCE v2和IB差。
>網絡設備
在實際的生產環境中,無論是何種協議支持的RDMA技術,都需要硬件的支撐。
支持iWARP和RoCEv2的Intel E810系列網卡:https://www.intel.cn/content/www/cn/zh/products/sku/192558/intel-ethernet-network-adapter-e810cqda2/specifications.html
支持InfiniBand的Mellanox CX-7系列網卡:https://nvdam.widen.net/s/csf8rmnqwl/infiniband-ethernet-datasheet-connectx-7-ds-nv-us-2544471
支持InfiniBand的NVIDIA Quantum-2 InfiniBand系列交換機:
https://nvdam.widen.net/s/k8sqcr6gzb/infiniband-quantum-2-qm9700-series-datasheet-us-nvidia-1751454-r8-web
02構建RDMA環境
使用2張Mellanox CX-4對接測試RoCEv2功能及性能
Mellanox官網下載CX-4的OFED驅動
下載基礎軟件包
yum install libusbx lsof tcl gcc-gfortran fuse-libs tcsh tk perl pcituiles
解壓驅動后安裝
./mlnxofedinstall
安裝完成后,載入新驅動
[root@localhost MLNX_OFED_LINUX-5.8-2.0.3.0-rhel7.9-x86_64]# /etc/init.d/openibd restart
Unloading HCA driver: [ OK ]
Loading HCA driver and Access Layer: [ OK ]
查看節點上RDMA設備,node GUID對應的是網卡的mac地址
[root@localhost ~]# ibv_devices
device node GUID
------ ----------------
mlx5_0 b8cef60300ed9572
mlx5_1 b8cef60300ed9573
查看device mlx5_0的port狀態,這里rate為25Gb/sec
[root@localhost ~]# ibstatus mlx5_0
Infiniband device 'mlx5_0' port 1 status:
default gid: fe800000bacefeed:9572
base lid: 0x0
sm lid: 0x0
state: 4: ACTIVE
phys state: 5: LinkUp
rate: 25 Gb/sec (1X EDR)
link_layer: Ethernet
到這里,最簡單的RDMA環境搭建完成,如果需要測試高階功能,例如PFC,ECN或者ECMP則需要更復雜的組網,也需要引入相應的交換機來支持功能的驗證。
03RDMA測試實驗
CM建鏈測試
實驗目的:Communication Management Protocol,通信管理協議。指的是一種建立于Infiniband/RoCE協議基礎之上的建鏈方式。以下實驗通過抓取CM建鏈過程中數據包交互的過程,來驗證是否符合IB協議所定義的建鏈流程。
以RC建鏈過程測試為例:
服務端啟動# ib_send_bw -F -d mlx5_0 -s 100 -n 5 -R
客戶端啟動#ib_send_bw -F -d mlx5_0 -s 100 -n 5 192.168.100.9 -R
通過抓包分析RC CM建鏈的過程:
| CM RC建鏈過程
client和server端交互的數據報文如下:
RC CM建鏈的過程一共有3個數據包,分別是ConnectRequest,ConnectReply和ReadToUse。建鏈完成后,就開始按照交換好的QP信息進行數據發送。
REQ用于啟動CM建鏈,client端發送請求,提供端口地址(GID/LID),以及本端的QPN信息。
REP用于server端在接收到REQ后,驗證了serviceid,primary以及private data里面的數據后,接收了client端的連接請求,并且發送了REP消息,攜帶了本端的QPN,起始PSN等信息。
RTU消息則表示client端接收到REP后,根據雙方約定好后的QP進行數據交互。
回過頭來查看perftest執行后的結果,本端的QP 190(0x00be)和對端的QP187 (0x00bb)建立連接并發送數據。
[root@localhost ~]# ib_send_bw -F -d mlx5_0 -s 100 -n 5 -R 192.168.100.9
---------------------------------------------------------------------------------------
Send BW Test
Dual-port : OFF Device : mlx5_0
Number of qps : 1 Transport type : IB
Connection type : RC Using SRQ : OFF
PCIe relax order: ON
ibv_wr* API : ON
TX depth : 5
CQ Moderation : 5
Mtu : 1024[B]
Link type : Ethernet
GID index : 3
Max inline data : 0[B]
rdma_cm QPs : ON
Data ex. method : rdma_cm
---------------------------------------------------------------------------------------
local address: LID 0000 QPN 0x00be PSN 0x524880
GID: 0000000000255192100:08
remote address: LID 0000 QPN 0x00bb PSN 0x429476
GID: 0000000000255192100:09
---------------------------------------------------------------------------------------
#bytes #iterations BW peak[MB/sec] BW average[MB/sec] MsgRate[Mpps]
100 5 49.75 49.74 0.521597
---------------------------------------------------------------------------------------
也可以通過后續交換的數據包來查看QP信息,發給遠端QPN 187(0x00bb)的send數據:
在CM建鏈測試的最后,我們需要關注在建鏈的過程中,client端和server端其實是通過send ud消息來交互建鏈過程,這個過程中所使用的QP為QP1。
這里順便提一句,在RDMA中,有幾個QP是預留的,QP0用于處理子網管理消息,QP1用于處理 SA(Subnet Administrator)或 GS(Generic Services)的消息。
RC(Reliable Connection)測試
實驗目的:在RC服務類型中,通信的兩端建立了一個可靠的連接。這種連接模型提供了類似于TCP的可靠性,確保數據的按序傳遞和可靠傳輸。在RDMA的RC模型中,數據傳輸的順序是有保障的,且通信的兩端可以進行錯誤檢測和重傳。以下實驗驗證client端和server端是否可以建立正常的RC連接,并進行數據包的傳輸。
RC的測試通常使用write或者read類型的消息來進行驗證,通過設置數據包長度與pmtu的組合來驗證各類消息報文。
服務端測試指令
[root@localhost ~]# ib_write_bw -F -d mlx5_0 -s 64 -p 1024 -n 100 -c RC
客戶端測試指令
[root@localhost ~]# ib_write_bw -F -d mlx5_0 -s 64 -p 1024 -n 100 -c RC 192.168.100.9
---------------------------------------------------------------------------------------
RDMA_Write BW Test
Dual-port : OFF Device : mlx5_0
Number of qps : 1 Transport type : IB
Connection type : RC Using SRQ : OFF
PCIe relax order: ON
ibv_wr* API : ON
TX depth : 100
CQ Moderation : 100
Mtu : 1024[B]
Link type : Ethernet
GID index : 3
Max inline data : 0[B]
rdma_cm QPs : OFF
Data ex. method : Ethernet
---------------------------------------------------------------------------------------
local address: LID 0000 QPN 0x00eb PSN 0x76710c RKey 0x1fcffc VAddr 0x000000021a2000
GID: 0000000000255192100:08
remote address: LID 0000 QPN 0x00e8 PSN 0xcc230d RKey 0x1fcef8 VAddr 0x00000000f68000
GID: 0000000000255192100:09
---------------------------------------------------------------------------------------
#bytes #iterations BW peak[MB/sec] BW average[MB/sec] MsgRate[Mpps]
64 100 243.35 190.55 3.121944
---------------------------------------------------------------------------------------
這里指定了數據包長度為64,pmtu長度為1024。當數據包長度小于pmtu時,則write的消息都為“write only"。
修改數據包長度進行再次測試,當數據包長度大于pmtu,且小于2*pmtu時,則wirte的消息為“write first”和“write last”。
修改數據包長度進行再次測試,當數據包長度大于2*pmtu時,則write的消息為write first”,“write middle”和“write last”。
當然測試的時候也可以修改pmtu進行驗證,pmtu有嚴格的長度要求,例如256,512,1024等。如下圖雖然MTU為1500,但是實際的RDMA PMTU為1024。
[root@localhost /]# ibv_devinfo
hca_id: mlx5_0
transport: InfiniBand (0)
fw_ver: 14.32.1010
node_guid: b8ce00ed:9572
sys_image_guid: b8ce00ed:9572
vendor_id: 0x02c9
vendor_part_id: 4117
hw_ver: 0x0
board_id: MT_2420110034
phys_port_cnt: 1
port: 1
state: PORT_ACTIVE (4)
max_mtu: 4096 (5)
active_mtu: 1024 (3)
sm_lid: 0
port_lid: 0
port_lmc: 0x00
link_layer: Ethernet
UD(Unreliable Datagram)測試
實驗目的:UD 連接更注重性能,適用于那些對數據傳輸的可靠性要求相對較低的場景。以下實驗驗證client端與server端是否可以建立正常的UD連接,并進行數據包的傳輸。
在RDMA的消息類型中,UD測試只支持send消息類型,不支持write和read,這里使用send消息進行測試。
客戶端測試指令
[root@localhost ~]# ib_send_bw -F -d mlx5_0 -s 64 -p 1024 -n 100 -c UD
服務端測試指令
[root@localhost ~]# ib_send_bw -F -d mlx5_0 -n 100 -s 64 -p 1024 -c UD 192.168.100.9
---------------------------------------------------------------------------------------
Send BW Test
Dual-port : OFF Device : mlx5_0
Number of qps : 1 Transport type : IB
Connection type : UD Using SRQ : OFF
PCIe relax order: ON
ibv_wr* API : ON
TX depth : 100
CQ Moderation : 100
Mtu : 1024[B]
Link type : Ethernet
GID index : 3
Max inline data : 0[B]
rdma_cm QPs : OFF
Data ex. method : Ethernet
---------------------------------------------------------------------------------------
local address: LID 0000 QPN 0x1146 PSN 0x3def86
GID: 0000000000255192100:08
remote address: LID 0000 QPN 0x1152 PSN 0x3c2738
GID: 0000000000255192100:09
---------------------------------------------------------------------------------------
#bytes #iterations BW peak[MB/sec] BW average[MB/sec] MsgRate[Mpps]
64 100 152.03 98.70 1.617092
---------------------------------------------------------------------------------------
同RC測試一樣,修改數據包長度與pmtu,可以驗證不同的send消息報文,這不分測試不再贅述。
性能測試
RDMA 技術的設計目標之一是提供高性能、低延遲的遠程數據訪問,所以在RDMA的實驗中,關于性能的實驗尤為重要。性能測試項指標,一般關注各類型消息的帶寬和延時。
ib_send_lat latency test with send transactions
ib_send_bw bandwidth test with send transactions
ib_write_lat latency test with RDMA write transactions
ib_write_bw bandwidth test with RDMA write transactions
ib_read_lat latency test with RDMA read transactions
ib_read_bw bandwidth test with RDMA read transactions
ib_atomic_lat latency test with atomic transactions
ib_atomic_bw bandwidth test with atomic transactions
>bw測試
這里帶寬測試使用write消息來進行
write 服務端測試指令
[root@localhost ~]# ib_write_bw -F -d mlx5_0 -s 4096 -n 10000 --report_gbits -t 128 -q 4
write客戶端測試指令
[root@localhost ~]# ib_write_bw -F -d mlx5_0 -s 4096 -n 10000 192.168.100.9 --report_gbits -t 128 -q 4
---------------------------------------------------------------------------------------
RDMA_Write BW Test
Dual-port : OFF Device : mlx5_0
Number of qps : 4 Transport type : IB
Connection type : RC Using SRQ : OFF
PCIe relax order: ON
ibv_wr* API : ON
TX depth : 128
CQ Moderation : 100
Mtu : 1024[B]
Link type : Ethernet
GID index : 3
Max inline data : 0[B]
rdma_cm QPs : OFF
Data ex. method : Ethernet
---------------------------------------------------------------------------------------
local address: LID 0000 QPN 0x00df PSN 0x5a67fc RKey 0x1fcff3 VAddr 0x00000000d54000
GID: 0000000000255192100:08
local address: LID 0000 QPN 0x00e0 PSN 0x788b6d RKey 0x1fcff3 VAddr 0x00000000d55000
GID: 0000000000255192100:08
local address: LID 0000 QPN 0x00e1 PSN 0xe597d RKey 0x1fcff3 VAddr 0x00000000d56000
GID: 0000000000255192100:08
local address: LID 0000 QPN 0x00e2 PSN 0x6e9451 RKey 0x1fcff3 VAddr 0x00000000d57000
GID: 0000000000255192100:08
remote address: LID 0000 QPN 0x00dc PSN 0xfe4945 RKey 0x1fceef VAddr 0x00000000a13000
GID: 0000000000255192100:09
remote address: LID 0000 QPN 0x00dd PSN 0xf30d82 RKey 0x1fceef VAddr 0x00000000a14000
GID: 0000000000255192100:09
remote address: LID 0000 QPN 0x00de PSN 0x729a6e RKey 0x1fceef VAddr 0x00000000a15000
GID: 0000000000255192100:09
remote address: LID 0000 QPN 0x00df PSN 0xa2c0ee RKey 0x1fceef VAddr 0x00000000a16000
GID: 0000000000255192100:09
---------------------------------------------------------------------------------------
#bytes #iterations BW peak[Gb/sec] BW average[Gb/sec] MsgRate[Mpps]
4096 40000 23.05 23.05 0.703393
---------------------------------------------------------------------------------------
這里介紹一下幾個性能相關參數:
s 4096:使用長度為4096字節的數據包進行測試,大包的性能會優于小包。
n 10000:測試數據包數,數量過小的話測試性能會有偏差。
t 128:tx隊列深度。
q 4:使用qp數。
最后帶寬結果為23.05Gb/sec,上文有描述本次測試使用的網卡帶寬規格為25Gb/sec,這里RoCE的性能已經快要跑滿網卡。
>lat測試
這里進行read消息的延時測試
read 服務端測試指令
[root@localhost ~]# ib_read_lat -F -d mlx5_0 -s 4096 -n 10000
read 客戶端測試指令
測試延時的話是不能使用多QP的,只能使用1個QP進行測試
[root@localhost ~]# ib_read_lat -F -d mlx5_0 -s 4096 -n 10000 192.168.100.9 -t 128
---------------------------------------------------------------------------------------
RDMA_Read Latency Test
Dual-port : OFF Device : mlx5_0
Number of qps : 1 Transport type : IB
Connection type : RC Using SRQ : OFF
PCIe relax order: ON
ibv_wr* API : ON
TX depth : 128
Mtu : 1024[B]
Link type : Ethernet
GID index : 3
Outstand reads : 16
rdma_cm QPs : OFF
Data ex. method : Ethernet
---------------------------------------------------------------------------------------
local address: LID 0000 QPN 0x00e9 PSN 0xf265e5 OUT 0x10 RKey 0x1fcffa VAddr 0x00000002090000
GID: 0000000000255192100:08
remote address: LID 0000 QPN 0x00e6 PSN 0x396d2b OUT 0x10 RKey 0x1fcef6 VAddr 0x000000013f0000
GID: 0000000000255192100:09
---------------------------------------------------------------------------------------
#bytes #iterations t_min[usec] t_max[usec] t_typical[usec] t_avg[usec] t_stdev[usec] 99% percentile[usec] 99.9% percentile[usec]
4096 10000 4.89 23.00 5.15 5.27 0.84 6.75 19.88
---------------------------------------------------------------------------------------
觀察最后的延時結果,其中99.9%的延時實驗數據為19.88usec。
04RDMA的抓包方式
抓取RDMA數據包流量的方式有多種,交換機配置端口鏡像后,RDMA數據包通過鏡像口抓取比較常見。
這里介紹一種通過容器中的tcpdump捕獲Mellanox RDMA數據包的方式。
1)首先拉取tcpdump-rdma的鏡像:
[root@localhost ~]# docker pull mellanox/tcpdump-rdma
Using default tag: latest
latest: Pulling from mellanox/tcpdump-rdma
74f0853ba93b: Pull complete
1f89d668986d: Pull complete
2d176f9a99da: Pull complete
Digest: sha256:3b7b1aa52cf8f9fe0e55845463fb4c4a4147eae1f6bddf5d82b8b08cf954b66c
Status: Downloaded newer image for mellanox/tcpdump-rdma:latest
docker.io/mellanox/tcpdump-rdma:latest
2)啟動tcpdump-rdma容器,通過把主機上的/dev/infiniband設備映射到容器中,同時把主機上的/tmp/rdma目錄也映射到容器中去:
[root@localhost ~]#docker run -it -v /dev/infiniband:/dev/infiniband -v /tmp/rdma:/tmp/rdma --net=host --privileged mellanox/tcpdump-rdma bash
3)進入容器后進行抓包,最后把pcap數據包導入到wireshark后就可以查看RoCE數據了:
[root@localhost /]# tcpdump -i mlx5_1 -s 0 -w /tmp/rdma/rdma_data1.pcap
4)打開wireshark查看數據包。
審核編輯:湯梓紅
-
數據傳輸
+關注
關注
9文章
1880瀏覽量
64555 -
網卡
+關注
關注
4文章
307瀏覽量
27374 -
AI
+關注
關注
87文章
30728瀏覽量
268886 -
RDMA
+關注
關注
0文章
77瀏覽量
8945
原文標題:RDMA測試雜談
文章出處:【微信號:SDNLAB,微信公眾號:SDNLAB】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論