DPDK는 Data Plane Development Kit의 약자로, Intel 아키텍처 기반 고성능 패킷 처리 최적화를 위한 시스템 소프트웨어이다.
DPDK는 크게 Data Plane Library들과 패킷 처리 최적화를 위한 NIC 드라이버의 집합으로 구성되어 있다.
DPDK의 가장 큰 특징은 그림에서 보는 바와 같이 기존 리눅스 기반의 패킷 처리과정과는 다르게 커널에서 패킷 처리과정을 거치는 게 아니라 어플리케이 션이 User Space의 Intel DPDK 라이브러리 API와 EAL(Environment Abstraction Layer)을 사용하여 리눅스 커널을 통과하여 직접 NIC에 액세스 할 수 있는 통로를 제공한다는 것이다.
또한, DPDK는 리눅스 User Space의 Data Plane API 뿐만 아니라, 패킷 처리에 최적화된 NIC 드라이버를 제공한다.
커널 기반 패킷 처리 과정과 DPDK의 차이점
DPDK는 기존 커널에서의 패킷 처리 과정에서 성능을 저하시키는 요소들에 대해서 다음과 같이 해결을 하였다.
CPU 처리 속도와 메모리/PCI 인터페이스 사이에서 발생하는 처리속도의 차이로 인한 문제를 DPDK에서는 다수 패킷을 동시에 처리하는 I/O 최적화 기술인 배치 패킷처리 기술을 사용하여 해결하였다.
네트워크 패킷마다 동적으로 패킷을 위해 버퍼 메모리를 할당/해제하던 문제를 DPDK에서는 네트워크 패킷에 대해 고정 길이의 메모리를 사전 할당함으로써 문제를 해결하였다.
공유 데이터 구조에 대한 접근으로 인한 병목현상이 일어날 때 패킷 처리 성능이 저하되는 문제점을 DPDK에서는 불필요한 대기시간이 발생하지 않도록 안전한 Lockless Queue를 구현하여 해결하였다.
리눅스의 Page table size(4Kbyte)로 인해 TLB miss가 발생하는 문제점을 DPDK에서는 2MB 또는 1GB의 huge page를 사용하여 해결하였다.
인터럽트 기반의 최적화되지 않은 물리 NIC와 가상 NIC 드라이버로 인한 성능 저하 문제를 DPDK에서는 최적화된 poll mode driver를 이용하여 해결하였다.
CPU가 데이터를 기다리는 상황으로 인한 패킷 처리 성능 저하 문제를 DPDK에서는 메모리 엑세스에 대한 Pre-fetching 기술 및 cache line 사이즈(64 Kbyte)로정렬하여 해결하였다.
멀티 프로세서를 사용하더라도 성능이 스케일되지 않는 문제를 DPDK에서는 run-to-complete 모델을 통해 horizontal scalability를 제공한다.
리눅스 스케줄러의 쓰레드 스위칭 오버헤드 문제를 DPDK에서는 소프트웨어 스레드를 하드웨어 스레드로 매핑하는 CPU Core Isolation 기술을 사용하여 해결하였다.
호스트 커널 네트워킹 스택의 성능이 제약되는 문제점을 DPDK에서는 KNI(Kernel Network Interface)를 통해 커널 네트워킹 스택 성능을 개선하였다.
DPDK 구성 라이브러리
DPDK 구성 요소인 라이브러리는 크게 Memory Manager, Buffer Manager, Queue Manager, Flow classification, Poll mode Driver로 나눌 수 있는데 각 라이브러리들의 역할은 다음과 같다.
·Memory Manager메모리 관리자는 메모리에서 객체들의 풀을 할당하는 기능을 수행하는데, 각 객채들의 풀 huge page 메모리 공간에 생성되고, 사용 가능한 객체를 저장하기 위해서 Ring을 사용한다.
메모리 관리자는 객체들이 DRAM Channel에 균등 하 게 저장되고 객체들이 Padding 되도록 보장하는 정렬 도움 기능을 제공한다.
·Buffer Manager버퍼 관리자는 OS가 버퍼를 할당하고 해제하는데 보내는 시간을 줄이기 위해 메모리 풀에 저장되는 고정 길이의 버퍼들을 사전 할당하여 관리한다.
·Queue Manager큐 관리자는 기존의 spinlock을 사용하는 대신에 서로 다른 소프트웨어 요소들이 네트워크 패킷을 병렬 처리할 때 불필요한 대기시간이 발생하지 않도록 하기 위해 안전한 lockless Queue를 구현하여 사용한다.
·Flow ClassificationFlow Classification은 Intel 스트리밍 SIMD 확장 기술을 사용하여 네트워크 패킷 헤더에 대한 hash 정보를 효과적으로 생성하여, 네트워크 패킷들이 동일 flow에 할당되어 고속 처리한다.
·Poll Mode Driver기존의 비동기식 인터럽트를 기반으로 네트워크 패킷을 처리하는 대신에 최적화된 동기식 폴 모드 인터럽트 처리 루틴을 사용하여 패킷 파이프 라인 속도를 높인다.
DPDK : Data plane Development Kit
- Intel Architecture 기반 패킷 처리 최적화 시스템 소프트웨어
- 패킷 처리 속도 최적화 프레임 워크 지원
- 애플리케이션 개발자는 로직 개발에 충실
x86 플랫폼에 고속 패킷 처리를 위한 라이브러리와 드라이버의 집합
리눅스 사용자 공간 IO 동작
프로파일에 필요한 모든 원소를 제공
고성능 패킷 처리 애플리케이션 작성
DPDK Libraries and Drivers
Memory Manager : object pools, huge page memory, object ring, alignment
Buffer Manager : pre-allocates fixed size buffers
Queue Manager : safe lockless queues, no spinlocks, avoiding wait times
Poll Mode Drivers : no asynchronous, interrupt-based signaling mechanisms
Flow Classification : a hash based on tuple information
DPDK 장점
고성능 패킷 처리
고가의 장비를 사용하지 않아도 됨
CPU가 지장 받지 않고 작업을 수행할 수 있음
DPDK 단점
DPDK를 사용하기 위한 랜카드 종류가 한정되어 있음.
dpdk 시스템 핵심 구성요소
- rte_timer : Timer 기능.
EAL에서 제공되는 타이머 인터페이스 기반으로 DPDK 실행 단위로 타 이머 서비스를 제공
rte_malloc : hugepages에 메모리 할당
rte_mempool : 메모리에 있는 개체의 풀을 할당
rte_eal + libc : 응용 프로그램 로딩, 메모리 할당. 시간 인터페이스, PCI 접근 및 로딩 지원
rte_mbuf : IP 트래픽 및 메시지 데이터 패킷의 버퍼를 지원
rte_ring : 크기가 고정된 개체를 저장하거나 코어 사이의 통신을 허용하는 FIFO를 고정
Environment Abstraction Layer(EAL)
ㅇ 하드웨어 및 메모리 공간과 같은 낮은 수준의 리소스를 액세스 함
ㅇ EAL은 응용 프로그램 및 라이브러리에서 환경 특성을 숨기는 일반적인 인터페이스를 제공
ㅇ 자원을 할당하는 방법을 결정하는 초기화 루틴을 책임짐
ㅇ EAL – 애플리케이션과 라이브러리로부터 인터페이스에 대한 서비스를 제공
Intel DPDK loading and launching
Support for multi-process and multi-thread execution types
Core affinity / assignment procedures
System memory allocation / de-allocation - Atomic / lock operations
Time reference
PCI bus access
Trace and debug functions
CPU feature identification
Interrupt handling
alarm operations 2.1 Environment Abstraction Layer
Ethernet Poll Mode Driver Architecture(PMD)
- 1 Gbit and 10 Gbit 이더넷을 폴링 모드 드라이버를 포함하며 비동기 없이 작동하도록 설계한 이더넷 컨트롤러
- 신호 전달 메커니즘을 기반으로 한 인터럽트 장치를 구성하여, 사용자 공간에서 BSD 드라이버 실행을 통해 API를 제공하고 각각의 큐를 구성
- PMD는 수신 프로세스 및 사용자의 애플리케이션에서 패킷을 임의의 인터럽트 없이 신속하게 전달하는 직접적인 디스크립터
주요 라이브러리
Packet Forwarding Algorithm support
패킷 포워딩 알고리즘을 지원하는 라이브러리
librte_net
IP 프로토콜을 정의하고 편리한 매크로를 가지고 있음
Ring Library
Ring Lib는 큐를 관리할 수 있음
무한한 크기의 연결 리스트를 가짐
rte_ring의 속성
최대 크기는 고정되고 포인터는 테이블에 저장됨
Multi-consumer, single-consumer는 대기열에서 제외됨
Bulk dequeue – 성공하면 지정된 개체 수를 뺌. 그렇지 않으면 실패
Burst dequeue – 지정된 수를 충족할 수 없는 경우 최대 사용 가능한 개체 큐에서 제거됨
Burst enqueue – 지정된 개체수가 성취될 수 없는 경우에 최대 개체를 저장한다
Bulk enqueue – 성공하면 지정된 개체수를 큐에 넣음. 그렇지 않으면 실패
Multi-producer, single-producer는 대기열에 포함됨
Lockless implementation
FIFO

'IT > DPDK' 카테고리의 다른 글
dpdk 커널 설정과 example 코드 컴파일 (4) | 2016.01.26 |
---|---|
basicfwd.c 코드 흐름 분석 (0) | 2016.01.26 |