본문

DPDK(Data Plane Development Kit)에 대하여 #1. 소개

DPDK(Data Plane Development Kit)는 데이터 플레인(Data plane) 라이브러리와 네트워크 인터페이스 컨트롤러 드라이버로 이루어져 있으며, 빠른 패킷 프로세싱을 목표로 한다. DPDK는 Intel Atom에서 Xeon에 이르는 Intel x86프로세서군 뿐 아니라 IBM Power 8, EZchip TILE-Gx, ARM 프로세서를 위한 패킷 프로세싱 프레임워크를 제공한다.[1] 2010년 Intel 제품군을 위한 Intel DPDK 1.0이 공개된 이후 2013년 4월 9일, DPDK.org에서 BSD 라이선스를 따르는 오픈소스 프로젝트로 전환, 그리고 현재는 ARM을 포함한 다양한 프로세서를 지원하는 2.2버전까지 나와있는 상황이다.


네트워크 인터페이스 장비(NIC)들의 처리속도가 급격하게 증가하는데에 비해 운영체제에서의 패킷 처리속도는 그 속도를 따라가지 못하는 상황이 발생하였다.(10Gbps이상에서 이슈발생) 이러한 장애를 극복하기 위하여 기존 운영체제의 패킷 처리 방식을 바꾸고자 하는것이 DPDK의 목적이라 할 수 있다. 커널 공간(Kernel Space)에서 이루어지던 패킷 프로세싱을 사용자 공간(User Space/Land/Area)에서 처리하도록 재구현 한것은 DPDK의 가장 큰 특징이다. 기존 리눅스 운영체제에서의 패킷 프로세싱 과정은 [2]와 [3]에서 잘 설명되어있어 아래에 인용하였다.


패킷을 송신할 때, 사용자 공간의 응용 프로그램은 네트워크 패킷을 송신하기 위한 소켓을 생성하고, 해당 소켓을 통해 네트워크 패킷을 송신한다. 소켓을 통해 송수신된 패킷은, OS의 루트 공간(커널)에서 프로토콜 처리(TCP/UDP/IP)를 종료하고 난후, 네트워크 인터페이스 카드(이하, NIC)로 패킷을 전달하여 전송하게 한다. 패킷을 수신할 때, 사용자 공간의 응용 프로그램은 네트워크 패킷을 수신하기 위한 소켓을 생성하고, 패킷 수신을 기다린다. NIC에 수신된 모든 네트워크 패킷에 대해 OS의 루트 공간에서 인터럽트처리와 프로토콜 처리(TCP/UDP/IP)를 종료하고 난 후, 사용자 공간의 응용 프로그램으로 소켓을 통하여 전달한다. 이렇게 네트워크 패킷처리 구조를 분리함으로써, 사용자 공간의 응용 프로그램에서 네트워크 패킷 프로토콜 처리에 대한 부담을 제거하여 개발자들이 자유롭게 응용 프로그램 개발에 집중할 수 있게 되었다. [2]


리눅스 운영체제는 기본적으로 시스템 커널과 프로세스로 구성된다. 일반적으로 커널을 수행하는 CPU의 동작모드를 커널모드라 하고 사용자 프로세스가 처리되는 동작모드를 사용자 모드라 한다. 프로세스에서 입출력장치와 데이터를 교환하고자 하는 경우나 커널 내의 기능을 사용하고자 하는 경우 역시 커널 모드로 전환하여 커널 모드에서 처리된다. 따라서 항상 프로세스와 커널 사이에는 모드 전환이 이루어지면서 시스템이 운영된다. 사용자 어플리케이션에서 커널의 자원 또는 디바이스로 접근하기 위해서는 시스템 콜을 사용한다. 따라서 사용자 프로그램에서 사용되는 모든 디바이스의 제어, 시스템 프로그램 실행, 파일 전송 등은 시스템콜로 구성된다. 응용 프로그램에서 사용되는 시스템 콜 함수는 표준 C 라이브러리에 구현되어 있다. 이 표준 라이브러리의 시스템 콜 함수는 소프트웨어 인터럽트를 호출하여 커널의 소프트웨어 인터럽트 핸들러를 실행한다. 커널에 구현되어 있는 소프트웨어 인터럽트 핸들러는 해당하는 시스템 콜 요청에 따라 사용자 프로그램에서 요구한 처리를 한다. 따라서 모든 커널 기능이나 입출력 장치를 제어할 수 있게 된다. [3]


[그림 1] 리눅스 시스템 동작 구조[3]


이러한 처리과정에서 문제가 되는것은 커널 영역과 유저영역이 구분되어있기 때문에 어플리케이션에서 패킷을 처리하기 위해서는 이 두 영역을 왔다갔다해야한다는 점이다. (Context Switching) 이 과정에서 컴퓨팅 자원이 소모되고 데이터 이동이 발생하기 때문에 지연시간이 생기게 된다. 또한 커널에서의 패킷 처리는 모든 OSI계층에 대한 상향식 처리를 바탕으로 진행되기 때문에 L3~L7과같은 상위 계층 처리가 비효율적으로 진행된다. 따라서 커널영역에서 비효율적으로 이루어지던 패킷처리를 모두 유저영역에서 진행하도록 하는것이 DPDK인 것이다.



[그림 2] 리눅스 네트워킹 스택과 DPDK와의 성능 비교 [5]


물론 유저영역에서 패킷처리하는것이(Userspace networking, Kernel-bypass networking) DPDK만의 특징은 아니다. OpenOnload와 NetMap등의 다른 프로젝트들도 이러한 방식을 사용한다. 이들과 차별화되는 점은, DPDK가 제공하는 EAL(Environment Abstraction Layer)라는 추상레이어가 어플리케이션과 하드웨어에 배치됨으로써 자원 접근, 스레드/코어 최적화, 인터럽트 핸들링, 메모리/버퍼/큐 관리등이 보장되고, 개발자는 이에 해당하는 인터페이스/라이브러리를 활용하여 어플리케이션을 작성하면 된다는 것이다.



[그림 3] DPDK의 구조 [4]


글을 쓰다보니 Intel DPDK에 치중되어 글이 작성되는 느낌이다. 왜냐하면 Intel자료에 익숙한데다가 dpdk.org에는 문서가 충분하지 않고 복잡하기 때문이다. 다음 글에서는 Intel의 입장에서 DPDK가 어떤 구조로 성능을 개선했는지에 대하여 적어볼 예정이다. 벤더의 입장에서 성능을 개선했다는것은 매우 자랑할 일이기 때문에 자료가 많아서 좋다.



[1] https://en.wikipedia.org/wiki/Data_Plane_Development_Kit

[2] ETRI - 데이터 플레인 가속화 기술동향

[3] 경주대학교 - Intel DPDK를 이용한 가상스위치의 구현에 관한 연구

[4] https://www.linkedin.com/pulse/dpdk-layman-aayush-shrut?forceNoSplash=true

[5] Intel - Impressive Packet Processing Performance Enables  Greater Workload Consolidation

댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.