피드로 돌아가기
C# Networking Deep Dive with io_uring part 4 - Zero Copy Receive
Dev.toDev.to
Infrastructure

Kernel Copy 제거를 위한 io_uring ZCRX 기반 Zero Copy Receive 구현

C# Networking Deep Dive with io_uring part 4 - Zero Copy Receive

Diogo Martins2026년 5월 18일5advanced

Context

일반적인 Socket 서버는 NIC가 DMA로 데이터를 Kernel Memory에 쓴 후, 다시 User Space로 복사하는 이중 구조를 가짐. 이 과정에서 발생하는 CPU 오버헤드와 Memory Copy 비용이 고속 네트워크 환경의 주요 병목 지점으로 작용함.

Technical Solution

  • NIC의 DMA 대상 주소를 Kernel Memory가 아닌 User Space Registered Memory로 직접 지정하는 ZCRX 구조 설계
  • IORING_REGISTER_ZCRX_IFQ를 통해 특정 NIC Hardware Receive Queue와 User Memory 영역을 직접 바인딩
  • IORING_OP_RECV_ZC 및 Multishot 모드 적용으로 Buffer Selection 단계와 개별 System Call 오버헤드 제거
  • 16-byte CQE에서 32-byte CQE(CQE32 + zcrx_cqe)로 확장하여 NIC가 기록한 정확한 Memory Offset 정보 처리
  • Buffer 반환 시 ReturnBuffer 대신 RefillRqe를 통해 DMA Descriptor를 직접 갱신하는 라이프사이클 관리
  • NIC Flow에 따른 데이터 수신으로 인해 기존 Multi-Reactor 구조의 Thread Affinity 제약 발생 및 단일 Reactor 구조로의 변경

1. NIC 하드웨어의 ZCRX 지원 여부 및 Kernel 버전(

6.15 이상) 확인

2. User Space Memory의 Physical Address 고정을 위한 Registration 절차 구현

3. NIC Hardware Queue와 Thread 간의 바인딩 전략 수립

4. ethtool을 이용한 Queue 분할 및 Steering 설정 검토

원문 읽기