[Background] RDMA - ReoMozzi/AI GitHub Wiki

What is RDMA?

Remote Direct Memory Access의 약자로서 고속 네트워크를 통한 메모리 간 데이터 전송 기술이다. 구체적으로 말하면 main memory에 있는 데이터를 CPU, Cache 또는 OS의 간섭없이 네트워크상에서 교환할 수 있는 기술. DMA와 마찬가지로 throughput과 performance을 향상시키며 또한 빠른 데이터 전송 및 low-latency, massively parallel computer cluster가 강점이다.

RDMA는 고속 네트워크를 통한 데이터 전송 Protocol이다.

RDMA Background

RDMA가 등장하게된 배경은 초당 처리해야하는 데이터량의 증가때문이다(ex HPC). 예를 들면 주식시장에서 외부로부터 받은 시세데이터를 잘 가공해서 트레이딩 서비스를 실시간으로 제공할 필요가 있는데 이 때 현재와 같은 구조(TCP/IP Model)을 사용한다면 I/O bottleneck이 생기게 된다. I/O bottleneck이 일어나는 과정은 아래와 같다.

  • Application은 전송할 데이터를 TCP/IP Socket interface에 write. (Payload size는 4KB ~ 64KB)
  • 전송할 데이터는 User space에서 Kernel space(receive buffer / send buffer)로 복사된다.
  • OS는 MTU(Maximum transmission unit) 단위로 데이터를 조각내고 TCP header 정보를 추가해 TCP Segment로 만든다.

Payload란 ACK를 받지 않은 send socket buffer에 있는 데이터가 담겨있으며 최대 길이는 receive window + congestion window + MSS(Maximum Segment Size) 중 최대 값이다.

  • TCP Segment에서 필요한 정보를 확인(ex. CheckSum: pseudo header 정보(IP address, segment length, protocol number) 후 IP header를 추가한다.
  • 이후 추가작업(Ethernet Layer) 후 메인 메모리에 위치한 전송할 데이터를 NIC Card로 복사한다. 이 때, NIC가 CPU에 interrupt를 발생시킨다. (이 때, PCI bottleneck이 발생)
  • Send와 동일하게 Receive에서도 마지막 read operation 때 interrupt가 발생한다.

위에서 설명한 것처럼 NIC가 주기적으로 read / write 처리를 위해 interrupts 하는 부분에서 I/O bottleneck이 발생하게 된다. 따라서, 대용량의 데이터를 실시간으로 처리하기 힘들어졌고 이를 해결하기 위한 I/O Acceleration Techniques들이 등장하기 시작했다.

I/O Acceleration Techniques

I/O Acceleration 기술에는 크게 아래 3가지로 구분할 수 있다.

  • TCP Offload: TOEs(TCP/IP Offload Engine)이 대표적이며 TCP Layer의 역할 줄이기가 목표이다.
  • OS Bypass: User-Level software techniques이며 Protocol stack을 bypass하는 것이 목표이다.
  • Architectural Technique: 위의 두 가지 이외에 copy engines, prefetching, instruction set optimization 등 여러가지가 있다.

TCP Offload

TCP Layer에서 차지하는 오버헤드(Checksum, Segmentation, Dis/Connection, Sequence number calculation, sliding window 계산)를 hardware interface 혹은 프로그래밍이 가능한 device에 역할을 내리는 것이다. 그 중 TOE(TCP/IP Offload Engine)가 대표적이며 TOE는 TCP/IP Stack을 NIC Card 옮겨 TCP/IP가 하는 역할을 수행하도록 해주는 가속 하드웨어 장치를 의미한다.

일반적으로 TCP/IP의 1bit/s를 처리하는데 CPU 1Hz가 필요한 것으로 알려져있다. 예를 들어 5Gbit/s(=625MB/s) 네트워크 트래픽을 처리하기 위해선 5GHz CPU Power가 필요하고 이 뜻은 5Gbit/s를 처리하기 위해선 2.5GHz 듀얼코어 CPU가 필요하다는 것이다. 하지만 TOE를 사용한다면 CPU의 자원사용률이 줄어들게 되어 다른 작업을 처리하거나 할 때 유리하다. TCP offload engine 위의 그림이 TOE의 overview를 나타낸 것이다. TOE 기반 TCP/IP 통신 스택은 커널 영역에서 담당하던 TCP/IP 처리가 없으며 User 영역에서 커널 영역을 거치지 않고 TOE로 직접 접근이 가능한 것을 볼 수 있다.

TOE를 구현하기 위해서는 TCP/IP를 처리하는 NIC 카드와 이 카드에 특화된 TCP/IP 소프트웨어 구현이 필요하다. 따라서 TOE 제품마다 TCP/IP Offloading 수준 및 기능상에 차이를 보이고 있다.

OS Bypass

통신에 필요한 protocol Stack을 우회하여 통신하는 User-Level의 소프트웨어적 기술을 의미하며 대표적으로 zero-copy가 있다. zero-copy는 네트워크에서 Read/Write 할 때 걸리는 불필요한 Copy 과정을 최소화하는 알고리즘이며 그 과정은 다음과 같다. 기존의 TCP/IP send/receive zero-copy

왼쪽 그림이 기존의 Read / Write Operation이며 오른쪽 그림이 zero-copy operation이다. 4번에 걸쳐 복사가 되던 과정이 2번만에 복사가 됨을 알 수 있다. 상세한 복사 과정은 아래와 같다.

  • 메인 메모리에 위치한 데이터를 Read Buffer로 읽어옴 → 데이터 1회 복사
  • Read Buffer에 담긴 데이터를 Socket(File Descriptor)에 담아서 Application에 응답
  • Application이 보낸 데이터를 Socket으로부터 읽어와 Read Buffer에 저장
  • Read Buffer에 위치한 데이터를 NIC Buffer로 이동 → 데이터 2회 복사 zero-copy를 위해 Linux에선 sendfile 함수를 지원하고 있으며 이 함수를 사용하면 zero-copy를 구현할 수 있다. 상세한 내용은 해당 링크를 확인하면 된다.

위에서 언급한 I/O Acceleration Techniques들을 적용하기 위해선 새로운 고속 데이터 전송 프로토콜이 필요했고, 이를 지원하기 위해 등장한 프로토콜이 바로 RDMA이다.

iWARP & RoCE

TOE mechanism과 RDMA가 합쳐지며 iWARP(The internet Wide Area RDMA Protocol), RoCE(RDMA over Converged Ethernet)들이 등장했고 이들을 적용한 NIC 카드를 RNIC라고 부른다.

  • iWARP는 TCP 환경에서 RDMA가 가능하도록 한 것이며 TCP에서 zero-copy transmission이 가능하기 때문에 TOE를 구현한 것이라고 볼 수 있다.
  • RoCE는 Ethernet와 같은 환경에서도 RDMA를 구현할 수 있도록 제안된 프로토콜이다.
  • TOE를 OS Level에서 지원하지 못하는 이유는 TCP Stack 변경 및 벤더 종속적인 문제가 생겨서이다.
  • RNIC의 대표적인 것이 Mellanox의 RNIC, Supermicro의 AOC-S25G-m2S, Cisco의 QL45412HLCU-CI 등이 있다.

How RDMA works

RDMA가 어떻게 구현되어 있고, 어떤 방법으로 동작하는지에 대해서 알아보도록 한다.

RDMA Protocol Specification - RDMA specification

  • RDMA는 DDP Protocol에 의존적이며 RDMA를 위해 반드시 DDP Protocol이 필요하다.
  • RDMA는 단순히 write, read, send operation을 DDP Message로 변환하는 프로토콜이다.
  • ULP는 통상적으로 OS 혹은 Application Layer, Adaptation Layer(ATM Layer) 등을 의미함.

DDP Overview

RDMAP를 이해하기 위해선 DDP 프로토콜의 이해가 필요하다. DDP 프로토콜은 다음과 같은 목적을 위해 만들어졌다.

  • Tagged Buffer Model의 제공 Tagged Buffer란 STag(Steering Tag), Tagged Buffer의 Offset 및 길이 교환을 통해 Remote Peer에 명시적으로 알려진 Local Peer의 ULP Buffer.

Steering Tag는 ULP Buffer의 식별자를 의미한다. Remote Peer는 RDMA/DDP Protocol의 구현이 완료된 Peer를 의미함.

  • Untagged Buffer Model의 제공 Untagged Buffer란 Remote Peer에게 알려지지 않은 Local Peer ULP Buffer. 주로 비동기식 제어 메시지를 Remote Peer에게 보낼 때 사용된다.
  • 안정적이고 순차적인 전송을 제공
  • ULP Message의 분할 및 재해석을 제공.

DDP 프로토콜의 특징

  • DDP 프로토콜은 데이터 싱크를 위한 중간 버퍼를 두지 않고 상위 프로토콜 - ULP(Upper Layer Protocol)에 지정된 버퍼에 NIC 데이터를 배치할 수 있도록 해준다.
  • DDP 프로토콜을 사용하면 데이터 싱크가 버퍼링 된 모델보다 적은 메모리 대역폭을 소비함.
  • 데이터 싱크란 데이터 Payload를 수신 중인 Peer. 즉, DDP를 통해 데이터를 배치받는 Peer를 의미함.
  • 버퍼링된 모델은 기존의 TCP/IP 통신을 사용해 저장된 데이터들을 의미.
  • 네트워크 프로토콜이 CPU를 사용하여 데이터를 이동하는 것보다 훨씬 적은 CPU Clock을 소모.
  • zero-copy의 구현의 토대가 되는 프로토콜.
  • DDP 프로토콜 스스로는 전송을 수행하지는 않음. 전송과 관련된 부분은 TCP + MPA(Framing) / SCTP가 담당한다.

DDP 프로토콜의 두 가지 전송 모델

DDP 프로토콜은 위에서 언급한 Tagged Buffer Model / Untagged Buffer Model을 제공한다.

Tagged Buffer data transfer Model
  • Tagged Buffer data transfer Model은 데이터 소스(Remote)에서 지정한 STag 식별자가 붙은 데이터 싱크(Local) ULP Buffer에 DDP Message(Tagged DDP Message)를 전송하는 방식이다.
  • 데이터 싱크에 위치한 ULP Buffer는 실제 데이터 전송이 일어나기 전에 반드시 자신의 ULP Buffer STag를 데이터 소스쪽에 알려야 한다.
  • TO(Tagged Offset)에 대한 정보를 데이터 소스쪽이 가지고 있기 때문에 ULP Buffer를 처음부터 채우지 않아도 된다는 장점이 있다.
Untagged Buffer data transfer Model
  • Untagged Buffer data transfer Model은 내부적으로 큐를 사용해 데이터 소스로부터 전송된 DDP Message(Untagged DDP Message)를 소모하는 방식이다.
  • Tagged Buffer 방식과는 반대로 데이터 싱크의 ULP Buffer가 있다는걸 알리지 않아도 된다. 그러나, 반드시 흐름 제어가 필요하다.
  • 전송되는 DDP Message들은 수신될 ULP Buffer와 연결되어야 하는데 이 때 QN(Queue Number)를 확인해서 해당 ULP Buffer와 연결된 Queue에 Push한다.
  • Untagged DDP Message에는 MO(Message Offset), QN(Queue Number), MSN(Message Sequence Number) 정보가 담겨 있다.

RDMAP Function

위에서 알아본 DDP 프로토콜의 transfer Model을 이용해 RDMAP가 3가지 operation(write/read/send)을 DDP Message로 변환한다. 각 operation에 대한 설명은 다음과 같다.

  • Send Operation Type - Local buffer의 데이터를 untagged remote Buffer로 전송하는 operation.
  • RDMA write - Local buffer(ULP Buffer)의 데이터를 tagged remote ULP Buffer로 전송하는 operation.
  • RDMA read - Tagged Remote Buffer(ULP Buffer)의 데이터를 검색 한 후 local ULP Buffer로 읽어오는 operation. 또한, Local에서 일어나는 error와 관련된 정보를 전송해주고 연결을 종료시키는 Terminate operation도 제공한다 → 자세한 내용은 Specification 참조

다음으로는 RDMA operation들이 ULP Layer와 동작하는 과정을 차례대로 알아보도록 한다.

Send Operation
  • 데이터 소스(Remote)
  1. RDMAP Layer는 ULP Layer로부터 ULP Message 길이와 ULP Message를 받는다.
  2. Send Operation Type을 표시한다.

Send Operation Type은 Send, Send with Solicited Event, Send with Invalidate, Send with Solicited Event and Invalidate가 있다.

  1. 만약 Send Operation Type이 Send with Invalidate 혹은 Send with Solicited Event and Invalidate이면 STag를 표시한다.
  • 데이터 싱크(Local)
  1. 받은 DDP Message의 Send Operation Type이 정상적이면 ULP Layer로 ULP Message Length, ULP Message, Event, Invalidated STag를 전송한다.

Invalidated STag는 Send Operation Type이 Send with Invalidate 혹은 Send with Solicited Event and Invalidate인 경우에 전송. Event란 operation의 성공여부 및 추가적으로 필요한 조건이 있다는것을 ULP Layer로 알려주기 위한 Flag 값과 같은 것이다. Event는 데이터 싱크가 Event 생성을 설정한 경우에만 사용한다.

  1. 만약, Send Operation Type이 Error라면, ULP Layer에게 Error Code를 전송하고 데이터 소스에게 Terminate Message를 전송한다.
RDMA Write
  • 데이터 소스(Remote)
  1. ULP Layer에게 UL Message 길이, ULP Message, 데이터 싱크 STag, Tagged Offset과 operation 동작 결과를 알려준다.
  • 데이터 싱크(Local)
  1. RDMA write가 성공적으로 이루어지면, RDMAP Layer에서는 ULP Layer에게 아무것도 보내지 않고 ULP Message를 바로 ULP Buffer에 배치한다.
  2. RDMA write가 실패한 경우 ULP Layer에게 Error 정보를 보내고 데이터 소스에게 Terminate 메시지를 전송한다.
RDMA Read
  • 데이터 소스(Remote)
  1. RDMAP Layer는 ULP Layer로부터 ULP Message 길이, ULP Message, 데이터 소스 STag, 데이터 싱크 STag, 데이터 소스 TO, 데이터 싱크 TO를 내려 받는다.
  • 데이터 싱크(Local)
  1. RDMA Read 요청을 처리하는동안 에러가 발생하지 않았다면 데이터 소스는 ULP Layer로 아무런 결과도 주지 않는다.
  2. 만약 Read 요청을 처리하는동안 에러가 발생한다면 ULP Layer에게 error 정보를 보내고 Terminate Message를 데이터 싱크쪽으로 전송한다.

Reference