~/network/rdma
HPC

RDMA

Remote Direct Memory Access

CPU와 운영체제 커널을 거치지 않고 네트워크를 통해 데이터를 전송하여, 처리량을 높이고 레이턴시 및 CPU 오버헤드를 줄이는 기법이다. 이름 그대로 "원격 직접 메모리 접근"이며, 한 서버의 메모리에서 다른 서버의 메모리로 데이터를 옮기는 동작을 NIC(또는 HCA) 하드웨어가 거의 단독으로 처리한다.

원래는 InfiniBand 표준의 일부로 등장했지만, 지금은 InfiniBand뿐 아니라 RoCE (RDMA over Converged Ethernet), iWARP (Internet Wide-area RDMA Protocol)를 통해 이더넷 위에서도 사용된다. HPC (High Performance Computing), AI 학습, 분산 스토리지처럼 노드 간 데이터 이동이 곧 성능 병목이 되는 환경에서 사실상 표준이 되는 기법이다.

등장 배경

전통적인 TCP/IP 통신은 다음 과정을 거친다.

  1. 애플리케이션이 소켓 API(write(), send() 같은 시스템 콜)를 호출해 보낼 데이터를 OS에 전달한다.
  2. 커널이 데이터를 유저 버퍼에서 커널 버퍼로 복사한다.
  3. TCP/IP 스택이 패킷을 만든다.
  4. NIC가 전송한다.
  5. 수신 측에서 NIC → 커널 버퍼 → 유저 버퍼로 거꾸로 복사된다.

이 과정에서 CPU 사용량과 메모리 복사 비용이 누적된다. 1G 시절에는 큰 문제가 아니었지만, 10G/40G/100G로 가면 CPU가 패킷 처리만 하느라 정작 애플리케이션 일을 못하는 상황이 발생한다. 한 패킷마다 발생하는 컨텍스트 스위치, 인터럽트 처리, 메모리 복사가 점점 무시할 수 없는 오버헤드가 된다.

RDMA는 이 흐름을 우회한다. 애플리케이션이 NIC에게 "내 메모리의 X 영역을 상대 노드의 Y 영역으로 보내라"고 한 번만 지시하면, NIC가 알아서 수행한다. 커널 호출도, 데이터 복사도, 양쪽 CPU의 적극적 개입도 거의 없다.

주요 메커니즘

RDMA가 일반 TCP/IP와 다른 지점은 다음 세 가지로 요약된다.

  • Kernel Bypass: 데이터 송수신 경로에서 커널을 거치지 않는다. 애플리케이션이 NIC와 직접 통신한다.
  • Zero Copy: 유저 버퍼와 커널 버퍼 사이의 메모리 복사가 없다. NIC가 사용자 메모리에서 직접 데이터를 읽어 보내고, 수신 측 사용자 메모리에 직접 쓴다.
  • CPU Offload: 패킷 처리, 흐름 제어, 신뢰성 보장 같은 일을 NIC 하드웨어가 수행한다. CPU는 명령을 큐에 넣은 뒤 결과만 확인한다.

이 세 가지가 결합된 결과, 같은 대역폭의 이더넷 통신 대비 CPU 사용률이 훨씬 낮고, 지연도 한 자릿수 µs 수준으로 떨어진다.

동작 방식

RDMA 통신은 일반적인 소켓과 다른 모델을 사용한다. 표준 API는 Verbs라고 불리며, 핵심 자료구조는 다음과 같다.

  • QP(Queue Pair): 송신 큐(SQ)와 수신 큐(RQ)의 한 쌍. 두 노드의 QP가 서로 짝지어져 통신 채널을 형성한다.
  • CQ(Completion Queue): 작업이 완료되면 결과(완료 이벤트)가 들어가는 큐. 애플리케이션이 폴링해서 결과를 확인한다.
  • MR(Memory Region): NIC가 직접 접근할 수 있도록 애플리케이션이 미리 등록해둔 메모리 영역. 등록 시 해당 영역의 가상 주소 범위와 접근 권한이 NIC에 전달된다.

애플리케이션은 데이터를 보내기 전에 사용할 메모리를 MR로 등록하고, QP를 만들어 상대 노드와 연결한 뒤, SQ에 작업 요청(WR, Work Request)을 올린다. NIC가 이를 보고 실제 전송을 수행하고, 완료되면 CQ에 통지한다.

지원하는 동작은 크게 네 가지이다.

  • SEND / RECV: 양쪽이 모두 동작에 참여하는 방식. 송신 측이 SEND를 올리려면 수신 측이 미리 RECV를 올려두어야 한다. 가장 일반적이며 메시지 기반 통신에 가깝다.
  • RDMA WRITE: 송신 측이 일방적으로 상대 메모리에 쓴다. 수신 측 CPU는 개입하지 않는다.
  • RDMA READ: 송신 측이 일방적으로 상대 메모리를 읽어온다. 역시 상대 CPU 개입 없음.
  • Atomic: Compare-and-Swap, Fetch-and-Add 같은 원자적 연산을 원격 메모리에 수행한다.

WRITE와 READ는 단방향(one-sided) 동작이라고 불리며, 상대방이 아무것도 모르는 상태에서 메모리가 변경될 수 있다는 점이 특징이다. 이 부분이 RDMA에서 보안과 메모리 권한 관리가 중요한 이유이기도 하다.

구현 방식

RDMA는 특정 네트워크 기술을 가리키는 용어가 아니라 "원격 노드의 메모리에 CPU 개입 없이 직접 접근한다"는 개념이다. 애플리케이션이 RDMA 기능을 호출할 수 있게 해주는 표준 API가 Verbs이고, API의 호출은 아래 세 가지 전송 방식 중 하나로 동작한다.

방식전송 계층특징
InfiniBandInfiniBand 패브릭기본 구현. 성능과 안정성이 가장 우수. 별도 패브릭 필요.
RoCEEthernet (UDP/IP, v2 기준)기존 이더넷 인프라 활용. 무손실 이더넷 설정 필요.
iWARPEthernet (TCP)TCP 신뢰성 그대로 사용. 추가 설정 부담 적음. TCP 스택 처리 오버헤드로 latency가 RoCE보다 높음.

세 방식은 동일한 Verbs API를 통해 추상화되기 때문에, 애플리케이션 코드는 거의 그대로 둔 채 하부 구현만 바꿔서 사용할 수 있다.

사용 사례

RDMA는 보통 다음과 같은 환경에 도입된다.

  • HPC: MPI(Message Passing Interface) 같은 병렬 처리 프레임워크가 노드 간 메시지 전달에 RDMA를 활용한다.
  • AI/ML 학습: GPU 간 All-Reduce 통신, 파라미터 서버 동기화, 모델 샤드 교환에 사용된다. NCCL이 대표적으로 RDMA를 활용한다.
  • 분산 스토리지: Lustre, GPFS, BeeGFS 같은 병렬 파일 시스템과 Ceph, NVMe-oF가 RDMA를 통해 노드 간 데이터를 빠르게 이동시킨다.
  • 인메모리 데이터베이스: 노드 간 캐시 공유, 분산 트랜잭션 동기화에 활용. SAP HANA, Oracle Exadata 등이 대표적이다.
  • 가상화 / 컨테이너: vMotion, 스토리지 마이그레이션, 컨테이너 이미지 전송 같은 대용량 데이터 이동.

반대로 일반적인 웹 서비스 트래픽이나 사용자 단말 통신처럼 대역폭과 지연이 시스템 성능의 병목이 아닌 환경에서는 RDMA의 이점이 크지 않다. RDMA는 운영 복잡도와 비용이 따라오기 때문에, 명확한 성능 요구가 있을 때만 도입하는 것이 일반적이다.