CS/OS

DPDK의 원리와 커널 우회(Kernel bypass)

EVEerNew 2025. 3. 4. 11:19
반응형

 

DPDK(Data Plane Development Kit)

고속 패킷 처리를 위한 데이터 플레인(data plane) 라이브러리와 네트워크 인터페이스 컨트롤러(NIC) 드라이버의 집합이다.

운영체제의 도움을 받지 않고 오버헤드 없이 사용자 애플리케이션이 직접 하드웨어를 독점제어할 수 있는 자체 인터페이스를 제공한다.

이는 User mode에서 Kernel 모드로의 system call을 호출로 발생하는 지연을 제거하여 달성 가능하다.

이를 kernel bypass 기술이라고 한다.

 

 

 

 

 

Kernel Bypass (커널 우회)

https://blog.cloudflare.com/kernel-bypass/

 

Kernel bypass

In two previous posts we've discussed how to receive 1M UDP packets per second and how to reduce the round trip time. We did the experiments on Linux and the performance was very good considering it's a general purpose operating system.

blog.cloudflare.com

 

위의 글을 정리해 보면서 Kernel bypass에 대해서 알아보자.

 

Vanilla Linux에서는 약 1M pps를 처리할 수 있지만, 최신 네트워크 카드가 더 높은 처리량을 제공하기 때문에 Linux에 의해 제한이 발생할 수 있다.

더 많은 패킷 처리를 위해서는 Linux의 커널 네트워킹 스택을  우회해야 하며 이를 Kernel Bypass라고 한다.

 

 

실제로 리눅스가 얼마나 많은 패킷을 처리할 수 있는지 확인해 보자.

 

 

https://blog.cloudflare.com/kernel-bypass/


현재 NIC는 12.2M pps처리가 가능하지만, 모든 패킷을 하나의 코어로 보내면 1.4M pps의 처리가 가능하다.

 

이때 코어 수를 늘려보면 개선될 것이라 생각할 수 있지만, 4개의 코어로 분산하더라도 각 코어 당 약 470K pps만 처리하게 된다. 

https://blog.cloudflare.com/kernel-bypass/

코어를 더 추가하더라도 NIC의 성능까지 끌어내긴 힘들어 보인다.

 

이를 개선하기 위해서 하드웨어에서 빠르게 패킷을 수신하도록 만들어 주는 특수 API 기술이 등장한다.

그 대표적인 예들이 Packet_mmap, PF_RING, DPDK 등이다.

 

 

 

 

 

DPDK의 처리 방식

 

기존의 커널 네트워크 드라이버는 NIC에서 새로운 패킷을 수신하면 인터럽트를 발생시켜서, CPU가 이를 수신하는 방식으로 처리한다.

따라서 패킷 수신이 많아질수록  인터럽트에 의한 오버헤드가 커진다.

 

DPDK는 Polling방식을 사용한다.

애플리케이션이 NIC의 패킷 버퍼를 감시하여 새로운 패킷을 바로 처리하도록 설정하므로 인터럽트에 의한 오버헤드가 없이 굉장히 빠르게 패킷 처리가 가능해진다.

 

이를 구현한 것이 Intel의 DPDK 라이브러리 들이고, 해당 라이브러리를 사용해서 고성능의 패킷처리가 가능해진다.

 

https://www.accton.com/Technology-Brief/intel-dpdk-performance-on-the-sau5081i-server/

 

초기에는 Intel 프로세서에 최적화되어 있었지만, 현재는 다양한 CPU 아키텍처(ARM 등)에서도 사용 가능하다.

 

단, NIC의 패킷 버퍼에 직접 접근하기 때문에 호환성 문제가 발생할 수 있다.

 

 

 

 

 

참조

https://justgotothedesk.tistory.com/174

https://ko.wikipedia.org/wiki/DPDK

https://namu.wiki/w/Intel%20DPDK

https://blog.cloudflare.com/kernel-bypass/

 

반응형