DPDK와 SR-IOV 정리

Gunhee Jang·2022년 12월 7일
0

가상화

목록 보기
1/1

가상화 시스템에 대해 공부해보며, 네트워크 가상화와 관련하여 대표적으로 등장하는 기술인 DPDK와 SR-IOV 기술에 대해 정리해 보고자 한다.

DPDK란?

DPDK (Data plane Development Kit) 기술은 Intel Architecture 기반의 고성능 패킷 처리 소프트웨어로, NIC (Network Interface Card)의 처리속도가 빨라짐에 따라 가상화 시스템에서의 네트워크 성능을 증가시키기 위한 핵심 기술이다.

DPDK를 이용하지 않는 경우, NIC에 패킷이 들어오면 Kernel에서 패킷을 처리하고 User Space로 전달하여 Application에서 패킷을 다룰 수 있게 된다.

DPDK를 이용하는 경우, User Space에서 PMD (Poll Mode Driver) 라는 장치 드라이버를 이용하게 된다. 이는 특정 CPU 코어에서 최우선 순위로 동작하며 NIC에 패킷이 도달하면 인터럽트하여 가져온다. 즉, Kernel Space를 건너뛸 수 있기 때문에 데이터의 처리 속도를 비약적으로 높일 수 있게 된다.

물론 이러한 방식으로 패킷을 가져오게 되면 Linux Kernel에서 제공하는 패킷 처리 방식을 무시하게 되므로, 네트워크 프로토콜의 처리를 직접 수행해야 한다. 따라서 세밀한 네트워크 처리를 위해서는 Application에서 직접 구현해야 하는 사항이 늘어날 수도 있다.

SR-IOV란?

SR-IOV (Single Root I/O Virtualization) 기술은 PCI 카드를 가상화 시키는 기술으로, 즉 하나의 PCI 장치 (NIC)를 가지고 여러 개의 VNF (Virtual Network Function)에 NIC가 직접 연결된 것 처럼 동작하게끔 지원할 수 있는 가상화 기술이다.

SR-IOV 인터페이스에는 PF (Physical Function)와 VF (Virtual Function)가 있는데, PF는 의미 그대로 물리적인 PCI 카드를 의미하는 PCIe의 기본 기능이다. VF는 가상 PCI 카드를 만들어줄 수 있는 기능으로, 각 PF에 여러 개의 VF를 생성할 수 있다.

일반적인 가상화 시스템에서는 Hypervisor가 PF와 연결되어 NIC로 들어온 패킷은 Hypervisor를 거쳐 VM으로 전달된다.
하지만 VF를 이용하면 Hypervisor를 거치지 않고 VM과 직접 연결되어 사용되기 때문에, vSwitch를 거치지 않아 Overhead를 줄일 수 있다.

SR-IOV의 핵심은 단일 NIC Device를 여러 개의 Device가 존재하는 것 처럼 가상으로 구성하는 것이며, 여러 개의 VM에서 단일 NIC에 연결되면서도 Overhead를 줄이며 패킷을 처리할 수 있는 기술이다.

여기서의 의문점은, 어떻게 NIC에 들어온 패킷이 적절한 VM으로 전달될 수 있는가? 이다. 여기서 등장하는 기술이 IOMMU (I/O Memory Management Unit) 이다. 그렇기 때문에 SR-IOV 인터페이스의 사용 제약 조건에 CPU와 펌웨어의 IOMMU 지원 여부가 고려된다.

IOMMU란?

일반적으로 OS에서 등장하는 MMU는 CPU에서 요청하는 논리 주소를 TLB, Page Table 등을 이용하여 물리 주소로 변환해주는 역할을 한다.

IOMMU는 이와 마찬가지의 동작을 I/O 동작에 대해 수행하는 장치다. PCI 장치에서 보내는 가상 주소를 물리 주소로 변환하여 데이터에 접근하게끔 지원한다. 물론 이러한 동작을 위해 OS에서 별도의 Page Table을 가지고 있어야 하지만, 이를 통해 가상 머신이 직접 I/O 디바이스에 접근할 수 있게끔 할 수 있다. 따라서 IOMMU를 지원하는 CPU 및 펌웨어를 이용하는 경우, SR-IOV 인터페이스를 이용하여 가상 머신에서 Hypervisor를 거치지 않고 직접 PCI 디바이스에 접근하게끔 할 수 있다.

가상머신 시스템 구성

앞서 살펴본 DPDK와 SR-IOV 기술을 활용하여 어떤 시스템을 구성해볼 수 있을까. 두 기술 모두 패킷 처리 속도를 향상시키는 가상화 기술로, 두 기술을 이용하여 궁극적으로는 높은 처리속도와 낮은 지연시간을 요구하는 서비스의 가상화에 활용할 수 있다.

Host PC에서 SR-IOV 인터페이스를 활용하여 여러 개의 VF를 구성하여, 단일 NIC로 여러 VM에 패킷을 전달할 수 있다.
SR-IOV 인터페이스를 구성하기 위해 설정하는 방법은 다음과 같다.

  1. 우선 BIOS 설정에서 Processor과 각 NIC 장치에 대한 SR-IOV 사용을 설정해 주어야 한다. Host PC의 System BIOS 설정에 들어가서 Process의 가상화 설정 및 SR-IOV 설정을 진행한다. (참고 사이트)

  2. 다음으로 사용할 NIC에 대해 VF의 개수를 지정해야 한다. Ubuntu 18.04 의 경우 /sys/class/net/[PF_Name]/device/sriov_numvfs 파일을 수정하여 해당 PF에 구성할 VF의 개수를 지정할 수 있다.

  3. 마지막으로 IOMMU 설정을 해주어야 한다. /etc/default/grub 파일에서 다음과 같이 작성하여 설정 가능하다.

     GRUB_CMDLINE_LINUX="default_hugepagesz=1G hugepagesz=1G hugepages=1 intel_iommu=on”

위와 같이 설정하여, Host PC에서 SR-IOV 인터페이스를 이용하여 가상 머신에 패킷을 전달할 준비가 완료하였다.
이후 Host PC에 가상머신을 설치한 후, NIC를 연결하여 이용할 수 있다.

대표적으로 Full Virtualization을 진행하는 Hypervisor KVM을 이용할 수 있다. 또한 각 가상머신에서는 DPDK를 설치하여 Kernel Overhead를 줄이며 Application에 수신된 패킷을 전달할 수 있다.

결론

높은 처리량과 낮은 지연시간이 요구되는 Application을 위한 가상화 기술로 DPDK와 SR-IOV를 이용할 수 있다. 물론 각 기술들은 장단점이 존재하여 이러한 부분에 대해 정확히 인지하고, 요구사항에 맞추어 기술을 쓸 수 있어야 한다고 생각한다.

특히 기회가 된다면 직접 실습해보는 부분이 정말 중요한 것 같다고 생각한다. KVM을 설치하고 실습을 진행해 보는 부분에 대해서는 다른 포스트에서 별도로 정리해보고자 한다. 가상화 개념에 대해 좀 더 깊은 공부가 필요할 것 같다...

0개의 댓글