#1 개념

1-1. 문제점

  현대 어플리케이션의 네트워크 수요가 증가하는 상황에서 기존 네트워크 스택으로는 프로세싱으로 수요를 다 처리하는 것에는 한계가 있었다. 리눅스 파운데이션과 인텔, 레드햇, 시스코 등 여러 기술 기업들은 기존 네트워크 스택의 문제점을 해결하기 위해 새로운 네트워크 패킷 프로세싱 라이브러리 및 드라이버를 개발하는 프로젝트를 수행하였다.

  기존 네트워크 패킷 프로세싱은 다음과 같은 한계점들을 가지고 있었다.

- 컨텍스트 스위치 오버헤드: CPU는 드라이버를 통해 디바이스를 호출할 수 있으며, 패킷을 전달하기 위해 시스템 콜을 호출하도록 한다. 이러한 과정은 사용자 공간의 어플리케이션이 커널 공간으로의 컨텍스트 스위치가 발생하도록 하며, 이로 인한 오버헤드가 발생하게 된다.

- PCIe와 메모리 인터페이스 제한: CPU와 NIC 간의 데이터 전송은 주로 PCIe 인터페이스를 통해 이루어진다. CPU가 NIC으로 패킷을 전달하는 과정에서 여러 번의 데이터 복사가 발생하며, 인터페이스와 CPU의 처리 속도 차이에 의한 성능 제한이 발생한다.

- 멀티코어 활용 제한: 기존의 네트워크 스택은 멀티코어 프로세싱을 지원하기 위해 커널 레벨에서 코어 간 동기화를 위한 락을 사용한다. 하지만 락 오버헤드는 병렬 처리를 충분히 활용하지 못 하게 한다.

- 커널 오버헤드: 커널 공간에서 패킷을 처리할 때, 패킷은 IP 스택, TCP/UDP 스택, 소켓 인터페이스 등 여러 단계의 네트워크 스택을 거치게 된다. 이러한 스택 프로세싱을 거치는 과정에서 프로세싱의 지연 시간이 발생하게 된다. 또한, 커널의 스케줄링에 의해 패킷 프로세싱이 후순위로 배치되어 추가적인 지연이 발생할 수 있다.

1-2. 정의

  DPDK(Data Plane Development Kit)은 기존 네트워크 프로세싱의 문제들을 해결하기 위해 개발된 고성능, 저지연, 멀티코어 최적화 네트워킹 솔루션으로, 패킷 프로세싱을 위한 라이브러리 및 드라이버를 제공하는 오픈소스이다. DPDK는 패킷 프로세싱 과정을 사용자 공간으로 오프로딩하여 컨텍스트 스위치, 커널 오버헤드, 락 오버헤드를 해결하였다.

1-3. 원리

  DPDK는 다음과 같은 방법을 사용하여 패킷 프로세싱을 사용자 공간으로 오프로딩 하였다.

  • CPU 개입 없이 NIC에게 데이터를 전송하기 위해 DMA 활용
  • 어플리케이션이 사용자 공간에서 직접 드라이버를 사용하여 디바이스를 폴링 (UIO/VFIO)
  • 패킷 처리를 위한 버퍼, 큐 등을 사용자 공간 버퍼에 할당

#2 아키텍처

그림 1. DPDK Architecture

2-1. 컴포넌트

  • EAL (Environment Abstraction Layer): DPDK 애플리케이션과 하드웨어 간의 기본 인터페이스를 제공하여 운영 체제 및 하드웨어의 차이점에 대한 세부 사항을 추상화
  • Memory Management: 효율적인 패킷 처리에 필수적인 huge page, 메모리 풀 및 버퍼 관리 기능을 제공
  • PMDs (Poll Mode Drivers): 다양한 네트워크 인터페이스에 최적화된 드라이버로, 커널의 네트워크 스택을 바이패스하여 지연 시간을 줄이고 처리량을 증가
  • Ring Buffers: 프로세스 간 고속 통신을 위한 큐 버퍼
  • APIs for Packet Processing: 헤더 파싱, 패킷 분류 및 패킷 포워딩을 포함한 패킷 조작을 위한 일련의 함수 및 라이브러리
  • Crypto and Security: 암호화 및 보안을 지원하는 라이브러리 및 드라이버
  • Eventdev and Timers: 이벤트 중심 프로그래밍 및 시간 관리 기능을 위해 작업을 적시에 스케줄링하고 실행할 수 있도록 지원

2-2. 라이브러리

  • librte_eal: DPDK의 기본 API를 통해 메모리, 타이머 및 로그와 같은 하드웨어 리소스에 액세스
  • librte_mempool: 메모리 풀을 관리
  • librte_ring: Lock-free FIFO 큐 제공
  • librte_mbuf: 패킷 버퍼 처리
  • librte_ethdev: 이더넷 장치 구성 및 쿼리를 위한 API를 제공하며 패킷 송수신을 포함한 다양한 작업을 지원
  • librte_net: 네트워크 프로토콜을 처리하기 위한 Helper API를 제공
  • librte_ip_frag: IPv4 및 IPv6 모두를 지원하는 IP 패킷의 프레그멘테이션 및 리어셈블 지원
  • librte_kni: DPDK 응용 프로그램과 리눅스 커널 네트워킹 스택 간의 통신을 용이하게 하며, 주로 기존 리눅스 네트워크 서비스의 디버깅 또는 인터페이스에 사용

 

 

 

참고 문서

'컴퓨터 과학 > 네트워크' 카테고리의 다른 글

Network Packet RX (Host-NIC Interface)  (0) 2024.04.24

#1 Components

  • NIC driver: NIC에 명령어를 전달하기 위한 호스트 라이브러리 
  • Packet buffer: 네트워크 패킷을 송수신하기 위한 버퍼, 패킷 풀에 의해 관리되며 헤더 + 페이로드의 데이터를 저장
  • Ring buffer: 디스크립터를 보관하는 버퍼, 버퍼의 사이즈가 네트워크가 처리 가능한 요청의 개수
  • Descriptor: 패킷의 메타데이터 및 패킷 버퍼의 페이로드 주소를 보관
  • Header/Tail: 처리한 요청의 개수를 확인하기 위한 것으로 링버퍼의 포인터
  • DMA: NIC이 메모리에 수신한 패킷을 전달하기 위한 하드웨어 엔진

#2 RX Process

  1. 패킷 버퍼 풀에서 빈 패킷 버퍼를 할당
  2. 패킷 버퍼의 주소를 디스크립터에 저장
  3. 드라이버를 통해 NIC 레지스터에 링버퍼의 주소, 길이, 테일을 전달
  4. NIC이 새로운 패킷을 수신하면, 링버퍼의 디스크립터가 보관하고 있는 패킷 버퍼 주소에 페이로드를 DMA로 전달하고 테일을 올림
  5. 드라이버는 테일 포인터를 읽고 해당 링버퍼의 디스크립터의 패킷 버퍼 주소를 통해 새로운 패킷을 수신

그림 1. Process of Packet Receive

 

그림 출처

- 그림1: https://stackoverflow.com/questions/36625892/descriptor-concept-in-nichttps://stackoverflow.com/questions/36625892/descriptor-concept-in-nic

'컴퓨터 과학 > 네트워크' 카테고리의 다른 글

DPDK (Data Plane Development Kit)  (0) 2024.05.27

+ Recent posts