RDMA

초강송·2025년 8월 7일

Remote Direct Memory Access란?

RDMA란 두 컴퓨터가 서로의 main memory 데이터를 cpu, cache, os의 개입 없이 직접 주고받을 수 있게 해 주는 기술이다.

일반적인 네트워크 통신 흐름은, 사용자 application이 data를 보내면, cpu가 data를 kernel에 복사하고, kernel이 NIC에 전달하면, 네트워크를 통해서 전송이 되는 흐름이었다. 수신 측에서는 위 과정을 반대로 수행하며, 이러한 과정에서는 cpu, kernel, memory 등 여러 resource가 많이 쓰인다.

RDMA는 송신 측 RNIC(RDMA-enabled NIC)이 사용자 memory에서 직접 data를 읽어서 네트워크를 통해 전송하고, 수신 측 RNIC은 수신한 data를 바로 목적지 memory에 쓰는 구조이다. 즉, user space ↔ kernel space ↔ NIC 간 여러 번의 data copy 없이 NIC이 직접 memory에 접근해서 data를 읽거나 쓰는 zero-copy를 수행한다. 또한 RDMA를 이용한 데이터 전송에선, 송신 측, 수신 측 모두에서 kernel 네트워크 스택을 bypass 하기 때문에 network 성능이 향상된다.

RDMA 동작은 간단하게 설명하자면, 송신 측에서 RDMA 메시지를 통해 '내가 data를 보낼 테니 이 data를 너의 특정 memory address에 써줘'와 같은 요청을 보내고, 수신 측의 RDMA-enabled NIC이 그 요청을 받아 해당 작업을 수행하는 방식으로 이루어진다. 따라서 RDMA를 수행하려면 송신 측과 수신 측 모두 RDMA를 지원하는 NIC을 갖고 있어야 한다.

network stack을 bypass 하면, transport protocol 처리는 어디서 누가 하는 걸까? 일반적인 데이터 전송 과정에선 transport protocol(TCP/UDP)은 os가 처리하고, NIC은 그냥 데이터를 보내는 역할만 하였다. 반면 RDMA는 transport protocol을 NIC 안에 직접 구현해 두었다.

RDAM over Converged Ethernet (RoCE)

RDMA를 지원하는 대표적인 네트워크 프로토콜이 RoCE이다.

RoCE는 Ethernet 네트워크 상에서 RDMA를 통신을 가능하게 해주는 네트워크 프로토콜이다. 원래 RDMA는 InfiniBand와 같은 특수한 네트워크에서만 사용 가능했지만, RoCE는 이를 일반적인 Ethernet 환경에서 사용할 수 있도록 확장하였다.

RoCE v1
RoCE v1은 RDMA 패킷을 Ethernet 프레임의 Payload에 직접 담아 전송하는 L2 기반 RDMA 프로토콜이다. RoCE v1은 payload가 RDMA 데이터라는 걸 알리기 위해 Ethernet header의 EtherType 필드에 0x8915를 사용하고, payload는 Infiniband Trade Association(IBTA)에서 정의한 RDMA 메시지 포맷과 전송 계층 구조를 그대로 따른다.

┌────────────────────────────────┐
│ Ethernet Header                ← 목적지 MAC, 출발지 MAC, EtherType(0x8915)
├────────────────────────────────┤
│ RDMA Payload (IBTA Transport)  ← RDMA 메시지 (e.g., Write, Read 등)
├────────────────────────────────┤
│ CRC (Frame Check Sequence)     ← 오류 체크용
└────────────────────────────────┘

RoCE v1은 IP layer나 TCP/UDP layer를 전혀 사용하지 않고 MAC 주소만을 기반으로 동작한다. 따라서 같은 L2 네트워크 내에서만 통신할 수 있다.

RoCE v2
RoCE v2는 기존 RoCE를 살짝만 고쳐서, IP 네트워크에서도 RDMA 통신이 가능하도록 확장한 버전이다. 그림을 보면 IP layer와 UDP layer가 추가된 것을 알 수 있다.

RoCE v1은 RDMA 메시지 포맷을 IBTA에서 정의한 포맷 그대로 사용하였다. IBTA에서 정의한 포맷에 따르면, RDMA 메시지를 만들 때는 항상 IB header라는 것을 붙이는데 그 중 하나가 GRH이다. GRH는 RDMA 메시지의 수신지를 식별하고 라우팅을 도와주는 정보다. 쉽게 말하면 v1에서는 IP 계층을 사용하지 않아서 패킷 안에 수신자/송신자를 명시할 방법이 따로 필요했는데, 이 역할을 대신한 것이 GRH이다.
RoCE v2는 L3(IP) layer를 사용하기 때문에 이미 IP 헤더에서 목적지와 송신지 주소를 확인할 수 있다. 따라서 GRH가 필요 없다.

# RoCE v2 패킷 구조

[Ethernet Header]
    ↓
[IP Header]
    ↓
[UDP Header]
    ↓
[RDMA 메시지 (InfiniBand 기반 포맷)]
    ↓
[Payload 데이터]

RoCE v2는 L4(UDP) layer에서는 encapsulation을 수행한다. 즉, UDP 패킷의 payload 안에 RDMA 메시지를 담아 전송하는 구조이며, UDP는 내부 내용을 해석하지 않고 단순히 전달 역할만 수행한다. 이와 같은 UDP 캡슐화 방식 덕분에 RoCE v2는 IP 네트워크 위에서도 동작할 수 있게 된다.

RoCE v2 패킷은 UDP destination port 번호 4791을 사용하여, 해당 패킷이 RDMA용임을 명확히 식별할 수 있도록 한다. 또한, UDP source port 번호는 패킷이 속한 flow를 식별하는 데 사용될 수 있으며, 이는 다른 UDP 기반 프로토콜들과 유사한 방식이다. 이를 통해 라우터나 스위치는 source port 번호를 기반으로 "이건 동일한 흐름(flow)의 패킷이구나"라고 판단하여, 같은 경로로 포워딩하는 최적화(예: ECMP)를 수행할 수 있다.

이러한 변화는 네트워크에서 오가는 패킷 형식만 살짝 바꾼 것이지, app이 RDMA를 사용하는 방식은 전혀 바꾸지 않았다. APP은 여전히 RDMA API만 호출하고, packet은 kernel이나 userspace가 아닌 RNIC에서 자동으로 처리된다. 따라서 개발자가 프로그램 입장에선 RoCE v1을 사용하든 v2를 사용하든 신경 쓰지 않아도 되는, transparent 한 방식으로 동작한다.


RDMA에 대해 정리해 보았다. RDMA(Remote Direct Memory Access) 두 컴퓨터가 네트워크를 통해 데이터를 주고받을 때, CPU나 운영체제의 개입 없이, 각 컴퓨터의 RDMA-enabled NIC이 자신의 로컬 메모리에 직접 DMA 연산을 수행하는 통신 기술이다.

예를 들어 송신 측 NIC이 RDMA 명령 메시지를 네트워크로 전송하면, 그 명령에 따라 수신 측 NIC이 자신의 메모리에 데이터를 직접 쓰거나, 또는 송신 측 NIC이 수신 측에서 전달받은 데이터를 자신의 메모리에 직접 저장하는 방식으로 동작한다.

이를 지원하기 위한 RDMA 기반 프로토콜인 RoCE(RDMA over Converged Ethernet)에 대해서도 살펴보았다. RoCE v1은 RDMA 패킷을 Ethernet 프레임의 Payload에 직접 담아 전송하는 L2 기반 RDMA 프로토콜이고, RoCE v2는 기존 RoCE를 살짝만 고쳐서 IP 네트워크에서도 RDMA 통신이 가능하도록 확장한 버전이다.


참고 자료
https://www.techtarget.com/searchstorage/definition/Remote-Direct-Memory-Access
https://docs.nvidia.com/networking/display/freebsdv371/rdma+over+converged+ethernet+(roce)

0개의 댓글