다음을 통해 공유


Linux 가상 머신에서 DPDK 설정

Azure의 DPDK(데이터 평면 개발 키트)는 성능 집약적 애플리케이션에 대해 더 빠른 사용자 공간 패킷 처리 프레임워크를 제공합니다. 이 프레임워크에는 가상 머신의 커널 네트워크 스택을 무시합니다.

커널 네트워크 스택을 사용하는 일반적인 패킷 처리에서 프로세스는 인터럽트를 기준으로 합니다. 네트워크 인터페이스가 들어오는 패킷을 수신하면 패킷을 처리하기 위한 커널 인터럽트가 있으며 커널 공간에서 사용자 공간으로 컨텍스트 전환이 있습니다. DPDK는 빠른 패킷 처리를 위한 폴링 모드 드라이버를 사용하는 사용자 공간 구현 대신 컨텍스트 전환 및 인터럽트 기반 메서드를 제거합니다.

DPDK는 하위 수준 리소스에 대한 액세스를 제공하는 사용자 공간 라이브러리의 집합으로 구성됩니다. 이러한 리소스는 하드웨어, 논리 코어, 메모리 관리 및 네트워크 인터페이스 카드의 폴링 모드 드라이버에 포함할 수 있습니다.

DPDK는 여러 운영 체제 배포를 지원하는 Azure Virtual Machines에서 실행될 수 있습니다. DPDK는 네트워크 기능 가상화 구현을 구동할 때 핵심 성과 차별화를 제공합니다. 이러한 구현은 가상 라우터, 방화벽, VPN, 부하 분산 장치, 발전된 패킷 코어 및 DDoS(서비스 거부) 애플리케이션 같은 NVA(네트워크 가상 어플라이언스) 형식을 취할 수 있습니다.

MANA VM의 DPDK 설치 지침 목록은 Linux의 MANA(Microsoft Azure Network Adapter) 및 DPDK에서 확인할 수 있습니다.

장점

초당 더 높은 패킷(PPS): 커널을 무시하고 사용자 공간에서 패킷을 제어하면 컨텍스트 스위치를 제거하여 주기 횟수를 줄입니다. 또한 Azure Linux 가상 머신에서 초당 처리 패킷 속도를 향상시킵니다.

지원되는 운영 체제 최소 버전

다음 배포는 Azure Marketplace에서 지원됩니다.

Linux OS 커널 버전
Ubuntu 18.04 4.15.0-1014-azure+
SLES 15 SP1 4.12.14-8.19-azure+
RHEL 7.5 3.10.0-862.11.6.el7.x86_64+
Debian 10 4.19.0-1-cloud+

명시된 버전은 최소 요구 사항입니다. 최신 버전도 지원됩니다.

MANA VM의 DPDK 요구 사항 목록은 Linux의 MANA(Microsoft Azure Network Adapter) 및 DPDK에서 확인할 수 있습니다.

사용자 지정 커널 지원

나열되지 않은 모든 Linux 커널 버전은 Azure 조정 Linux 커널 빌드용 패치를 참조하세요. 자세한 내용은 aznetdpdk@microsoft.com에 문의할 수도 있습니다.

지역 지원

모든 Azure 지역에서는 DPDK를 지원합니다.

필수 조건

가속 네트워킹을 사용하면 Linux 가상 머신을 사용하도록 설정해야 합니다. 가상 머신에는 관리를 위한 하나의 인터페이스가 포함된 적어도 두 개 이상의 네트워크 인터페이스가 있어야 합니다. 관리 인터페이스에서 가속화된 네트워킹을 사용하도록 설정하는 것은 권장되지 않습니다. 가속 네트워킹을 사용하는 Linux 가상 머신을 만드는 방법에 대해 알아봅니다.

또한 DPDK는 RDMA 동사를 사용하여 네트워크 어댑터에 데이터 큐를 만듭니다. VM에서 올바른 RDMA 커널 드라이버가 로드되었는지 확인합니다. VM 크기에 따라 mlx4_ib, mlx5_ib 또는 mana_ib일 수 있습니다.

MANA VM에 대한 DPDK 설치 지침은 Linux의 MANA(Microsoft Azure Network Adapter) 및 DPDK에서 확인할 수 있습니다.

빌드 종속성 설치

RHEL7.5

yum -y groupinstall "Infiniband Support"
sudo dracut --add-drivers "mlx4_en mlx4_ib mlx5_ib" -f
yum install -y gcc kernel-devel-`uname -r` numactl-devel.x86_64 librdmacm-devel libmnl-devel meson

수동으로 DPDK 컴파일 및 설치

  1. 최신 DPDK 다운로드. Azure에는 버전 22.11 LTS 이상이 권장됩니다.

  2. meson builddir로 기본 구성을 빌드합니다.

  3. ninja -C builddir를 사용하여 컴파일합니다.

  4. DESTDIR=<output folder> ninja -C builddir install를 사용하여 설치합니다.

런타임 환경 구성

다시 시작한 후 다음 명령을 한 번 실행합니다.

  1. Hugepage

    • 각각의 numa 노드에 대해 한 번씩, 다음 명령을 실행하여 hugepage를 구성합니다.
     echo 1024 | sudo tee /sys/devices/system/node/node*/hugepages/hugepages-2048kB/nr_hugepages
    
    • mkdir /mnt/huge를 사용하여 탑재할 디렉터리를 만듭니다.

    • mount -t hugetlbfs nodev /mnt/huge를 사용하여 hugepage를 탑재합니다.

    • grep Huge /proc/meminfo를 사용하여 hugepage가 예약되었는지 확인합니다.

    • 위의 예는 2M huge page에 대한 것입니다. 1G huge page를 사용할 수도 있습니다.

    참고 항목

    DPDK에 대한 지침을 따라 부팅 시 hugepage가 예약되도록 grub 파일을 수정할 방법이 있습니다. 지침은 페이지 맨 아래에 있습니다. Azure Linux 가상 머신에서 사용하는 경우 다시 부팅 시에 hugepage를 예약하려면 대신 /etc/config/grub.d에서 파일을 수정합니다.

  2. MAC 및 IP 주소: ifconfig –a를 사용하여 네트워크 인터페이스의 MAC 및 IP 주소를 확인합니다. VF 네트워크 인터페이스 및 NETVSC 네트워크 인터페이스에는 동일한 MAC 주소가 있지만 NETVSC 네트워크 인터페이스에만 IP 주소가 있습니다. VF 인터페이스는 NETVSC 인터페이스의 하위 인터페이스로 실행됩니다.

  3. PCI 주소

    • ethtool -i <vf interface name>을 사용하여 VF에 사용할 PCI 주소를 찾습니다.

    • eth0이 가속 네트워킹을 사용하도록 설정한 경우 testpmd가 eth0에 대한 VF pci 디바이스를 실수로 넘겨받지 않도록 해야 합니다. DPDK 애플리케이션이 실수로 관리 네트워크 인터페이스를 넘겨받아 SSH 연결 손실을 초래한 경우 직렬 콘솔을 사용하여 DPDK 애플리케이션을 중지합니다. 또는 직렬 콘솔을 사용하여 가상 머신을 중지 또는 시작할 수도 있습니다.

  4. modprobe -a ib_uverbs로 다시 부팅할 때마다 ibuverbs를 로드합니다. SLES 15의 경우만 modprobe -a mlx4_ibmlx4_ib를 로드합니다.

마스터 PMD

DPDK 애플리케이션은 Azure에서 공개되는 마스터 PMD에서 실행되어야 합니다. 애플리케이션이 직접 VF PMD에서 실행되는 경우 일부 패킷이 가상 인터페이스에 표시되므로 VM을 대상으로 한 모든 패킷을 수신하지는 않습니다. DPDK는 NetVSC PMD 및 Failsafe PMD라는 두 가지 유형의 마스터 PMD를 지원합니다. 마스터 PMD는 애플리케이션이 해당 애플리케이션으로 향하는 모든 패킷을 수신하도록 보장합니다. 또한 호스트에 서비스가 제공될 때 VF가 철회되더라도 애플리케이션이 마스터 PMD를 통해 DPDK 모드에서 계속 실행되도록 합니다.

NetVSC PMD

NetVSC는 Azure에서 마스터 PMD로 실행하는 데 권장되는 PMD입니다. 애플리케이션이 해당 애플리케이션으로 향하는 모든 패킷을 수신하도록 보장합니다. 또한 호스트에 서비스가 제공될 때 VF가 호출되더라도 애플리케이션은 DPDK 모드에서 계속 실행됩니다. NetVSC PMD를 사용하고 구성하는 방법에 대한 자세한 내용은 (https://doc.dpdk.org/guides/nics/netvsc.html)에서 참조하세요.

Failsafe PMD

참고: Azure에서는 failsafe PMD를 사용하여 실행하는 것이 권장되지 않습니다. DPDK 버전이 22.11 LTS 이상인 경우 NetVSC PMD를 사용하는 것이 좋습니다.

또는 failsafe PMD를 통해 DPDK 애플리케이션을 실행할 수 있습니다. Failsafe PMD에 대한 자세한 내용은 Failsafe 폴링 모드 드라이버 라이브러리를 참조하세요.

testpmd 실행

루트 모드에서 testpmd를 실행하려면 testpmd 명령 전에 sudo를 사용합니다.

기초: 정상 여부 검사, failsafe 어댑터 초기화

  1. 단일 포트 testpmd 애플리케이션을 시작하려면 다음 명령을 실행합니다.

    testpmd -w <pci address from previous step> \
      -- -i \
      --port-topology=chained
    
  2. 이중 포트 testpmd 애플리케이션을 시작하려면 다음 명령을 실행합니다.

    testpmd -w <pci address nic1> \
    -w <pci address nic2> \
    -- -i
    

시작되면 show port info all을 실행하여 포트 정보를 확인합니다. net_netvsc인 DPDK 포트가 하나 또는 두 개 표시되어야 합니다.

  1. 트래픽을 시작하려면 start <port> /stop <port>를 사용합니다.

이전 명령은 testpmd에 권장되는 대화형 모드로 testpmd를 시작합니다.

기초: 단일 발신자/단일 수신자

다음 명령은 초당 패킷 통계를 주기적으로 인쇄합니다.

  1. TX 측에서 다음 명령을 실행합니다.

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=txonly \
      --eth-peer=<port id>,<receiver peer MAC address> \
      --stats-period <display interval in seconds>
    
  2. RX 측에서 다음 명령을 실행합니다.

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=rxonly \
      --eth-peer=<port id>,<sender peer MAC address> \
      --stats-period <display interval in seconds>
    

가상 머신에서 이전 명령을 실행하는 경우 컴파일하기 전에 가상 머신의 실제 IP 주소와 일치하도록 app/test-pmd/txonly.c에서 IP_SRC_ADDRIP_DST_ADDR을 변경합니다. 그렇지 않으면 패킷은 수신자에 도달하기 전에 삭제됩니다.

고급: 단일 발신자/단일 전달자

다음 명령은 초당 패킷 통계를 주기적으로 인쇄합니다.

  1. TX 측에서 다음 명령을 실행합니다.

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=txonly \
      --eth-peer=<port id>,<receiver peer MAC address> \
      --stats-period <display interval in seconds>
    
  2. FWD 측에서 다음 명령을 실행합니다.

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address NIC1> \
      -w <pci address NIC2> \
      -- --nb-cores <number of cores to use for test pmd> \
      --forward-mode=io \
      --eth-peer=<recv port id>,<sender peer MAC address> \
      --stats-period <display interval in seconds>
    

가상 머신에서 이전 명령을 실행하는 경우 컴파일하기 전에 가상 머신의 실제 IP 주소와 일치하도록 app/test-pmd/txonly.c에서 IP_SRC_ADDRIP_DST_ADDR을 변경합니다. 그렇지 않으면 패킷은 전달자에게 도달하기 전에 삭제됩니다. 일부 코드를 변경하지 않는 한 testpmd 전달자가 3계층 주소를 수정하지 않기 때문에 전달된 트래픽을 세 번째 컴퓨터가 수신하도록 할 수 없습니다.

sudo yum install -y dpdk

참조