DPDK로 더 빠른 네트워크 패킷 처리 사용 설정


이 문서에서는 더 빠른 네트워크 패킷 처리를 위해 가상 머신(VM) 인스턴스에서 데이터 영역 개발 키트(DPDK)를 사용 설정하는 방법을 설명합니다.

DPDK는 빠른 패킷 처리, 낮은 지연 시간, 일관적인 성능이 필요한 성능 집약적인 애플리케이션을 위한 프레임워크입니다. DPDK는 커널 네트워크를 우회하고 사용자 공간에서 직접 실행되는 데이터 영역 라이브러리 및 네트워크 인터페이스 컨트롤러(NIC) 집합을 제공합니다. 예를 들어 VM에서 DPDK 사용 설정은 다음을 실행할 때 유용합니다.

  • 네트워크 함수 가상화(NFV) 배포

  • 소프트웨어 정의 네트워킹(SDN) 애플리케이션

  • 동영상 스트리밍 또는 Voice over IP 애플리케이션

다음과 같은 가상 NIC(vNIC) 유형 중 하나를 사용하여 VM에서 DPDK를 실행할 수 있습니다.

  • 권장: gVNIC

    특히 Compute Engine을 위해 설계되었고 차세대 vNIC로서 virtIO를 계승하며 확장성 및 보안이 뛰어난 고성능 가상 네트워크 인터페이스입니다.

  • VirtIO-Net

    VM이 블록 스토리지 및 네트워킹 어댑터와 같은 물리적 하드웨어에 효율적으로 액세스할 수 있게 해주는 오픈소스 이더넷 드라이버입니다.

물리적 하드웨어 대신 가상 환경에서 DPDK를 실행할 때의 한 가지 문제는 가상 환경에서 고성능 애플리케이션을 위한 SR-IOV 및 I/O 메모리 관리 단위(IOMMU) 지원이 부족하다는 것입니다. 이러한 제한을 극복하기 위해서는 다음 드라이버 중 하나를 사용해서 호스트 가상 주소 대신 게스트 물리적 주소로 DPDK를 실행해야 합니다.

시작하기 전에

  • 아직 인증을 설정하지 않았다면 설정합니다. 인증은 Google Cloud 서비스 및 API에 액세스하기 위해 ID를 확인하는 프로세스입니다. 로컬 개발 환경에서 코드 또는 샘플을 실행하려면 다음과 같이 Compute Engine에 인증하면 됩니다.

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Google Cloud CLI를 설치한 후 다음 명령어를 실행하여 초기화합니다.

      gcloud init
    2. Set a default region and zone.
    3. REST

      로컬 개발 환경에서 이 페이지의 REST API 샘플을 사용하려면 gcloud CLI에 제공하는 사용자 인증 정보를 사용합니다.

        Google Cloud CLI를 설치한 후 다음 명령어를 실행하여 초기화합니다.

        gcloud init

      자세한 내용은 Google Cloud 인증 문서의 REST 사용 인증을 참조하세요.

요구사항

DPDK를 실행할 VM을 만들 때 다음을 확인합니다.

  • 애플리케이션을 실행할 때 네트워크 연결 부족 문제를 방지하려면 다음과 같이 2개의 Virtual Private Cloud 네트워크를 사용합니다.

    • 제어 영역을 위한 VPC 네트워크

    • 데이터 영역을 위한 VPC 네트워크

  • 두 VPC 네트워크 모두 다음 항목을 지정해야 합니다.

    • 고유한 IP 주소 범위가 있는 서브넷

    • 서브넷에 대해 동일한 리전

    • 동일한 유형의 VNIC(gVNIC 또는 VirtIO-Net)

  • VM을 만들 때는 다음이 필요합니다.

    • 2개의 VPC 네트워크 서브넷과 동일한 리전을 지정해야 합니다.

    • DPDK에 사용하려는 vNIC 유형을 지정해야 합니다.

    • gVNIC 또는 VirtIO-Net에 대해 지원되는 머신 시리즈를 지정해야 합니다.

제한사항

VM에서 DPDK를 실행할 때는 다음 제한사항이 적용됩니다.

  • VM에 사용된 2개의 VPC 네트워크에 대해 단일 스택 서브넷만 사용할 수 있습니다.

  • 2개의 VPC 네트워크에 대해 vNIC 유형으로 gVNIC를 사용하는 경우 다음을 확인해야 합니다.

  • VM을 만들 때 높은 네트워크 성능을 위해 VM당 Tier_1 네트워킹 성능을 사용 설정하려면 다음을 지정해야 합니다.

DPDK를 실행할 VM 구성

이 섹션에서는 DPDK를 실행하도록 VM을 만드는 방법을 설명합니다.

VPC 네트워크 만들기

Google Cloud 콘솔, Google Cloud CLI, Compute Engine API를 사용해서 데이터 영역 및 제어 영역에 대해 2개의 VPC 네트워크를 만듭니다. 나중에 VM을 만들 때 이러한 네트워크를 지정할 수 있습니다.

콘솔

  1. 데이터 영역을 위한 VPC 네트워크를 만듭니다.

    1. Google Cloud 콘솔에서 VPC 네트워크로 이동합니다.

      VPC 네트워크로 이동

      VPC 네트워크 페이지가 열립니다.

    2. VPC 네트워크 만들기를 클릭합니다.

      VPC 네트워크 만들기 페이지가 열립니다.

    3. 이름 필드에 네트워크 이름을 입력합니다.

    4. 새 서브넷 섹션에서 다음을 수행합니다.

      1. 이름 필드에 서브넷 이름을 입력합니다.

      2. 리전 메뉴에서 서브넷의 리전을 선택합니다.

      3. IPv4(단일 스택)(기본값)를 선택합니다.

      4. IPv4 범위에서 CIDR 표기법으로 유효한 IPv4 범위 주소를 입력합니다.

      5. 완료를 클릭합니다.

    5. 만들기를 클릭합니다.

      VPC 네트워크 페이지가 열립니다. VPC 네트워크 만들기가 완료되려면 최대 1분이 걸릴 수 있습니다.

  2. VM에 대한 SSH 연결을 허용하는 방화벽 규칙을 사용해서 제어 영역에 대한 VPC 네트워크를 만듭니다.

    1. VPC 네트워크 만들기를 다시 클릭합니다.

      VPC 네트워크 만들기 페이지가 열립니다.

    2. 이름 필드에 네트워크 이름을 입력합니다.

    3. 새 서브넷 섹션에서 다음을 수행합니다.

      1. 이름 필드에 서브넷 이름을 입력합니다.

      2. 리전 메뉴에서 데이터 영역 네트워크의 서브넷에 지정한 것과 동일한 리전을 선택합니다.

      3. IPv4(단일 스택)(기본값)를 선택합니다.

      4. IPv4 범위에서 CIDR 표기법으로 유효한 IPv4 범위 주소를 입력합니다.

      5. 완료를 클릭합니다.

    4. IPv4 방화벽 규칙 탭에서 NETWORK_NAME-allow-ssh 체크박스를 선택합니다.

      여기서 NETWORK_NAME은 이전 단계에서 지정한 네트워크 이름입니다.

    5. 만들기를 클릭합니다.

      VPC 네트워크 페이지가 열립니다. VPC 네트워크 만들기가 완료되려면 최대 1분이 걸릴 수 있습니다.

gcloud

  1. 데이터 영역에 대해 VPC 네트워크를 만들려면 다음 단계를 수행합니다.

    1. --subnet-mode 플래그를 custom으로 설정해서 gcloud compute networks create 명령어를 사용하여 수동으로 생성된 서브넷으로 VPC 네트워크를 만듭니다

      gcloud compute networks create DATA_PLANE_NETWORK_NAME \
          --bgp-routing-mode=regional \
          --mtu=MTU \
          --subnet-mode=custom
      

      다음을 바꿉니다.

      • DATA_PLANE_NETWORK_NAME: 데이터 영역의 VPC 네트워크 이름입니다.

      • MTU: 네트워크의 최대 패킷 크기인 최대 전송 단위(MTU)입니다. 값은 1300에서 8896 사이여야 합니다. 기본값은 1460입니다. MTU를 1460보다 큰 값으로 설정하기 전에 최대 전송 단위를 확인합니다.

    2. gcloud compute networks subnets create 명령어를 사용하여 바로 전에 만든 VPC 데이터 영역 네트워크의 서브넷을 만듭니다.

      gcloud compute networks subnets create DATA_PLANE_SUBNET_NAME \
          --network=DATA_PLANE_NETWORK_NAME \
          --range=DATA_PRIMARY_RANGE \
          --region=REGION
      

      다음을 바꿉니다.

      • DATA_PLANE_SUBNET_NAME: 데이터 영역 네트워크의 서브넷 이름입니다.

      • DATA_PLANE_NETWORK_NAME: 이전 단계에서 지정한 데이터 영역 네트워크의 이름입니다.

      • DATA_PRIMARY_RANGE: CIDR 표기법으로 표시된 서브넷의 유효한 IPv4 범위입니다.

      • REGION: 서브넷을 만들려는 리전입니다.

  2. VM에 대해 SSH 연결을 허용하는 방화벽 규칙으로 제어 영역에 대한 VPC 네트워크를 만들려면 다음 단계를 수행합니다.

    1. --subnet-mode 플래그를 custom으로 설정해서 gcloud compute networks create 명령어를 사용하여 수동으로 생성된 서브넷으로 VPC 네트워크를 만듭니다

      gcloud compute networks create CONTROL_PLANE_NETWORK_NAME \
          --bgp-routing-mode=regional \
          --mtu=MTU \
          --subnet-mode=custom
      

      다음을 바꿉니다.

      • CONTROL_PLANE_NETWORK_NAME: 제어 영역의 VPC 네트워크 이름입니다.

      • MTU: 네트워크의 최대 패킷 크기인 MTU입니다. 값은 1300에서 8896 사이여야 합니다. 기본값은 1460입니다. MTU를 1460보다 큰 값으로 설정하기 전에 최대 전송 단위를 확인합니다.

    2. gcloud compute networks subnets create 명령어를 사용하여 바로 전에 만든 VPC 제어 영역 네트워크의 서브넷을 만듭니다.

      gcloud compute networks subnets create CONTROL_PLANE_SUBNET_NAME \
          --network=CONTROL_PLANE_NETWORK_NAME \
          --range=CONTROL_PRIMARY_RANGE \
          --region=REGION
      

      다음을 바꿉니다.

      • CONTROL_PLANE_SUBNET_NAME: 제어 영역 네트워크의 서브넷 이름입니다.

      • CONTROL_PLANE_NETWORK_NAME: 이전 단계에서 지정한 제어 영역 네트워크의 이름입니다.

      • CONTROL_PRIMARY_RANGE: CIDR 표기법으로 표시된 서브넷의 유효한 IPv4 범위입니다.

      • REGION: 서브넷을 만들려는 리전입니다. 데이터 영역 네트워크의 서브넷에 지정한 리전과 일치해야 합니다.

    3. --allow 플래그가 tcp:22로 설정된 gcloud compute firewall-rules create 명령어를 사용해서 제어 영역 네트워크에 SSH 연결을 허용하는 VPC 방화벽 규칙을 만듭니다.

      gcloud compute firewall-rules create FIREWALL_RULE_NAME \
          --action=allow \
          --network=CONTROL_PLANE_NETWORK_NAME \
          --rules=tcp:22
      

      다음을 바꿉니다.

      • FIREWALL_RULE_NAME: 방화벽 규칙의 이름입니다. rule.

      • CONTROL_PLANE_NETWORK_NAME: 이전 단계에서 만든 제어 영역 네트워크의 이름입니다.

API

  1. 데이터 영역에 대해 VPC 네트워크를 만들려면 다음 단계를 수행합니다.

    1. autoCreateSubnetworks 필드를 false로 설정해서 networks.insert 메서드에 대해 POST 요청을 수행하여 수동으로 생성된 서브넷으로 VPC 네트워크를 만듭니다.

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks
      
      {
        "autoCreateSubnetworks": false,
        "name": "DATA_PLANE_NETWORK_NAME",
        "mtu": MTU
      }
      

      다음을 바꿉니다.

      • PROJECT_ID: 현재 프로젝트의 프로젝트 ID입니다.

      • DATA_PLANE_NETWORK_NAME: 데이터 영역의 네트워크 이름입니다.

      • MTU: 네트워크의 최대 패킷 크기인 최대 전송 단위(MTU)입니다. 값은 1300에서 8896 사이여야 합니다. 기본값은 1460입니다. MTU를 1460보다 큰 값으로 설정하기 전에 최대 전송 단위를 확인합니다.

    2. subnetworks.insert 메서드POST 요청을 수행하여 VPC 데이터 영역 네트워크에 대해 서브넷을 만듭니다.

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks
      
      {
        "ipCidrRange": "DATA_PRIMARY_RANGE",
        "name": "DATA_PLANE_SUBNET_NAME",
        "network": "projects/PROJECT_ID/global/networks/DATA_PLANE_NETWORK_NAME"
      }
      

      다음을 바꿉니다.

      • PROJECT_ID: 데이터 영역 네트워크가 있는 프로젝트의 프로젝트 ID입니다.

      • REGION: 서브넷을 만들려는 리전입니다.

      • DATA_PRIMARY_RANGE: CIDR 표기법으로 표시된 새 서브넷의 기본 IPv4 범위입니다.

      • DATA_PLANE_SUBNET_NAME: 이전 단계에서 만든 데이터 영역 네트워크의 서브넷 이름입니다.

      • DATA_PLANE_NETWORK_NAME: 이전 단계에서 만든 데이터 영역 네트워크의 이름입니다.

  2. VM에 대해 SSH 연결을 허용하는 방화벽 규칙으로 제어 영역에 대한 VPC 네트워크를 만들려면 다음 단계를 수행합니다.

    1. autoCreateSubnetworks 필드를 false로 설정해서 networks.insert 메서드에 대해 POST 요청을 수행하여 수동으로 생성된 서브넷으로 VPC 네트워크를 만듭니다.

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks
      
      {
        "autoCreateSubnetworks": false,
        "name": "CONTROL_PLANE_NETWORK_NAME",
        "mtu": MTU
      }
      

      다음을 바꿉니다.

      • PROJECT_ID: 현재 프로젝트의 프로젝트 ID입니다.

      • CONTROL_PLANE_NETWORK_NAME: 제어 영역의 네트워크 이름입니다.

      • MTU: 네트워크의 최대 패킷 크기인 MTU입니다. 값은 1300에서 8896 사이여야 합니다. 기본값은 1460입니다. MTU를 1460보다 큰 값으로 설정하기 전에 최대 전송 단위를 확인합니다.

    2. subnetworks.insert 메서드POST 요청을 수행하여 VPC 데이터 컨트롤 네트워크에 대해 서브넷을 만듭니다.

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks
      
      {
        "ipCidrRange": "CONTROL_PRIMARY_RANGE",
        "name": "CONTROL_PLANE_SUBNET_NAME",
        "network": "projects/PROJECT_ID/global/networks/CONTROL_PLANE_NETWORK_NAME"
      }
      

      다음을 바꿉니다.

      • PROJECT_ID: 제어 영역 네트워크가 있는 프로젝트의 프로젝트 ID입니다.

      • REGION: 서브넷을 만들려는 리전입니다.

      • CONTROL_PRIMARY_RANGE: CIDR 표기법으로 표시된 새 서브넷의 기본 IPv4 범위입니다.

      • CONTROL_PLANE_SUBNET_NAME: 이전 단계에서 만든 제어 영역 네트워크의 서브넷 이름입니다.

      • CONTROL_PLANE_NETWORK_NAME: 이전 단계에서 만든 제어 영역 네트워크의 이름입니다.

    3. firewalls.insert 메서드POST 요청을 수행하여 제어 영역 네트워크에 대해 SSH 연결을 허용하는 VPC 방화벽 규칙을 만듭니다. 요청에서 IPProtocol 필드를 tcp로 설정하고 ports 필드를 22로 설정합니다.

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
      
      {
        "allowed": [
          {
            "IPProtocol": "tcp",
            "ports": [ "22" ]
          }
        ],
        "network": "projects/PROJECT_ID/global/networks/CONTROL_PLANE_NETWORK_NAME"
      }
      

      다음을 바꿉니다.

      • PROJECT_ID: 제어 영역 네트워크가 있는 프로젝트의 프로젝트 ID입니다.

      • CONTROL_PLANE_NETWORK_NAME: 이전 단계에서 만든 제어 영역 네트워크의 이름입니다.

VPC 네트워크를 만들 때 추가 구성 옵션을 보려면 VPC 네트워크 만들기 및 관리를 참조하세요.

DPDK에 VPC 네트워크를 사용하는 VM 만들기

Google Cloud 콘솔, gcloud CLI, Compute Engine API를 사용해서 이전에 만든 2개의 VPC 네트워크에서 gVNIC 또는 virtIO-Net를 사용 설정하는 VM을 만듭니다.

추천: UIO 및 IOMMU가 없는 VFIO 드라이버에 대한 패키지 관리자 지원으로 인해 Ubuntu LTS 또는 Ubuntu Pro를 해당 운영체제 이미지로 지정합니다. 이러한 운영체제를 지정하지 않으려면 빠른 패킷 처리를 위해 Debian 11 이상을 지정하는 것이 좋습니다.

콘솔

다음을 수행해서 이전 단계에서 만든 2개의 VPC 네트워크 서브넷을 사용하는 VM을 만듭니다.

  1. Google Cloud 콘솔에서 VM 인스턴스로 이동합니다.

    VM 인스턴스로 이동

    VM 인스턴스 페이지가 열립니다.

  2. 인스턴스 만들기를 클릭합니다.

    인스턴스 만들기 페이지가 열립니다.

  3. 이름 필드에 VM의 이름을 입력합니다.

  4. 리전 메뉴에서 이전 단계에서 네트워크를 만든 것과 동일한 리전을 선택합니다.

  5. 영역 메뉴에서 VM의 영역을 선택합니다.

  6. 머신 구성 섹션에서 다음을 수행합니다.

    1. 다음 옵션 중 하나를 선택합니다.

      • 일반적인 워크로드의 경우 범용 탭(기본값)을 선택합니다.

      • 성능 집약적인 워크로드의 경우 컴퓨팅 최적화 탭을 선택합니다.

      • 메모리 대 vCPU비율이 높은 워크로드의 경우 메모리 최적화 탭을 선택합니다.

      • 그래픽 처리 장치(GPU)를 사용하는 워크로드의 경우 GPU 탭을 선택합니다.

    2. 선택사항. 이전 단계에서 GPU를 지정했고 VM에 연결할 GPU를 변경하려면 다음 중 하나 이상을 수행합니다.

      1. GPU 유형 메뉴에서 GPU 유형을 선택합니다.

      2. GPU 수 메뉴에서 GPU 수를 선택합니다.

    3. 시리즈 목록에서 머신 계열을 선택합니다.

    4. 머신 유형 메뉴에서 머신 유형을 선택합니다.

    5. 선택사항: 고급 구성을 펼치고 안내에 따라 이 VM에 맞게 머신을 추가로 맞춤설정합니다.

  7. 선택사항: 부팅 디스크 섹션에서 변경을 클릭한 후 안내에 따라 디스크 이미지를 변경합니다.

  8. 고급 옵션 섹션을 확장합니다.

  9. 네트워킹 섹션을 확장합니다.

  10. 네트워크 성능 구성 섹션에서 다음을 수행합니다.

    1. 네트워크 인터페이스 카드 메뉴에서 다음 중 하나를 선택합니다.

      • gVNIC를 사용하려면 gVNIC를 선택합니다.

      • VirtIO-Net를 사용하려면 VirtIO를 선택합니다.

    2. 선택사항: 높은 네트워크 성능 및 지연 시간 감소를 위해서는 Tier_1 네트워킹 사용 설정 체크박스를 선택합니다.

  11. 네트워크 인터페이스 섹션에서 다음을 수행합니다.

    1. 기본값 행에서 "default" 항목 삭제를 클릭합니다.

    2. 네트워크 인터페이스 추가를 클릭합니다.

      새 네트워크 인터페이스 섹션이 표시됩니다.

    3. 네트워크 메뉴에서 이전 단계에서 만든 제어 영역 네트워크를 선택합니다.

    4. 완료를 클릭합니다.

    5. 네트워크 인터페이스 추가를 다시 클릭합니다.

      새 네트워크 인터페이스 섹션이 표시됩니다.

    6. 네트워크 메뉴에서 이전 단계에서 만든 데이터 영역 네트워크를 선택합니다.

    7. 완료를 클릭합니다.

  12. 만들기를 클릭합니다.

    VM 인스턴스 페이지가 열립니다. VM 만들기가 완료되는 데 최대 1분이 걸릴 수 있습니다.

gcloud

다음 플래그와 함께 gcloud compute instances create 명령어를 사용하여 이전 단계에서 만든 2개의 VPC 네트워크 서브넷을 사용하는 VM을 만듭니다.

gcloud compute instances create VM_NAME \
    --image-family=IMAGE_FAMILY \
    --image-project=IMAGE_PROJECT \
    --machine-type=MACHINE_TYPE  \
    --network-interface=network=CONTROL_PLANE_NETWORK_NAME,subnet=CONTROL_PLANE_SUBNET_NAME,nic-type=VNIC_TYPE \
    --network-interface=network=DATA_PLANE_NETWORK_NAME,subnet=DATA_PLANE_SUBNET_NAME,nic-type=VNIC_TYPE \
    --zone=ZONE

다음을 바꿉니다.

  • VM_NAME: VM의 이름입니다.

  • IMAGE_FAMILY: 부팅 디스크가 초기화되는 운영체제의 이미지 계열입니다. 또는 --image=IMAGE 플래그를 지정하고 IMAGE를 특정 이미지 버전으로 바꿀 수 있습니다. Compute Engine 이미지 프로젝트에서 사용 가능한 이미지 목록 확인 방법을 알아보세요.

  • IMAGE_PROJECT: 디스크 이미지가 포함된 이미지 프로젝트의 이름입니다.

  • MACHINE_TYPE: VM에 대한 사전 정의 또는 커스텀 머신 유형입니다.

  • VNIC_TYPE: 제어 영역 및 데이터 영역 네트워크에 사용할 vNIC 유형입니다. 값은 다음 중 하나여야 합니다.

    • gVNIC를 사용하려면 GVNIC를 지정합니다.

    • VirtIO-Net를 사용하려면 VIRTIO_NET를 지정합니다.

  • CONTROL_PLANE_NETWORK_NAME: 이전 단계에서 만든 제어 영역 네트워크의 이름입니다.

  • CONTROL_PLANE_SUBNET_NAME: 이전 단계에서 만든 제어 영역 네트워크의 서브넷 이름입니다.

  • DATA_PLANE_NETWORK_NAME: 이전 단계에서 만든 데이터 영역 네트워크의 이름입니다.

  • DATA_PLANE_SUBNET_NAME: 이전 단계에서 자동으로 만든 제어 영역 네트워크의 서브넷 이름입니다.

  • ZONE: VM을 만들 영역입니다. 이전 단계에서 만든 서브넷과 동일한 리전 내에서 영역을 지정합니다.

예를 들어 us-central1-a 영역에서 SSD 영구 디스크가 512GB이고 vCPU 60개, Tier_1 네트워킹 및 둘 다 gVNIC가 사용되는 데이터 영역 및 제어 영역 네트워크를 포함하는 사전 정의된 C2 머신 유형으로 지정된 dpdk-vm이라는 VM을 만들려면 다음 명령어를 실행합니다.

gcloud compute instances create dpdk-vm \
    --boot-disk-size=512GB \
    --boot-disk-type=pd-ssd \
    --image-project=ubuntu-os-cloud \
    --image-family=ubuntu-2004-lts \
    --machine-type=c2-standard-60 \
    --network-performance-configs=total-egress-bandwidth-tier=TIER_1 \
    --network-interface=network=control,subnet=control,nic-type=GVNIC \
    --network-interface=network=data,subnet=data,nic-type=GVNIC \
    --zone=us-central1-a

API

다음 필드를 사용해서 instances.insert 메서드POST 요청을 수행하여 이전 단계에서 만든 2개의 VPC 네트워크 서브넷을 사용하는 VM을 만듭니다.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  "name": "VM_NAME",
  "machineType": "MACHINE_TYPE",
  "disks": [
    {
      "initializeParams": {
        "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE_FAMILY"
      }
    }
  ],
  "networkInterfaces": [
    {
      "network": "global/networks/CONTROL_PLANE_NETWORK_NAME",
      "subnetwork": "regions/REGION/subnetworks/CONTROL_PLANE_SUBNET_NAME",
      "nicType": "VNIC_TYPE"
    },
    {
      "network": "global/networks/DATAPLANE_NETWORK_NAME",
      "subnetwork": "regions/REGION/subnetworks/DATA_PLANE_SUBNET_NAME",
      "nicType": "VNIC_TYPE"
    }
  ]
}

다음을 바꿉니다.

  • PROJECT_ID: 제어 영역 VPC 네트워크와 데이터 영역 VPC 네트워크가 있는 프로젝트의 프로젝트 ID입니다.

  • ZONE: VM을 만들 영역입니다.

  • VM_NAME: VM의 이름입니다.

  • MACHINE_TYPE: VM에 대한 사전 정의 또는 커스텀 머신 유형입니다.

  • IMAGE_PROJECT: 디스크 이미지가 포함된 이미지 프로젝트의 이름입니다.

  • IMAGE_FAMILY: 부팅 디스크가 초기화되는 운영체제의 이미지 계열입니다. 또는 특정 이미지 버전을 지정할 수 있습니다. Compute Engine 이미지 프로젝트에서 이미지 목록 확인 방법을 알아보세요.

  • CONTROL_PLANE_NETWORK_NAME: 이전 단계에서 만든 제어 영역 네트워크의 이름입니다.

  • REGION: 제어 영역 및 데이터 영역 네트워크의 서브넷이 있는 리전입니다.

  • CONTROL_PLANE_SUBNET_NAME: 이전 단계에서 만든 제어 영역 네트워크의 서브넷 이름입니다.

  • VNIC_TYPE: 제어 영역 및 데이터 영역 네트워크에 사용할 vNIC 유형입니다. 값은 다음 중 하나여야 합니다.

    • gVNIC를 사용하려면 GVNIC를 지정합니다.

    • VirtIO-Net를 사용하려면 VIRTIO_NET를 지정합니다.

  • DATA_PLANE_NETWORK_NAME: 이전 단계에서 만든 데이터 영역 네트워크의 이름입니다.

  • DATA_PLANE_SUBNET_NAME: 이전 단계에서 만든 제어 영역 네트워크의 서브넷 이름입니다.

예를 들어 us-central1-a 영역에서 SSD 영구 디스크가 512GB이고 vCPU 60개, Tier_1 네트워킹 및 둘 다 gVNIC가 사용되는 데이터 영역 및 제어 영역 네트워크를 포함하는 사전 정의된 C2 머신 유형으로 지정된 dpdk-vm이라는 VM을 만들려면 다음 POST 요청을 수행합니다.

POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/instances

{
  "name": "dpdk-vm",
  "machineType": "c2-standard-60",
  "disks": [
    {
      "initializeParams": {
        "diskSizeGb": "512GB",
        "diskType": "pd-ssd",
        "sourceImage": "projects/ubuntu-os-cloud/global/images/ubuntu-2004-lts"
      },
      "boot": true
    }
  ],
  "networkInterfaces": [
    {
      "network": "global/networks/control",
      "subnetwork": "regions/us-central1/subnetworks/control",
      "nicType": "GVNIC"
    },
    {
      "network": "global/networks/data",
      "subnetwork": "regions/us-central1/subnetworks/data",
      "nicType": "GVNIC"
    }
  ],
  "networkPerformanceConfig": {
    "totalEgressBandwidthTier": "TIER_1"
  }
}

VM을 만들 때 추가 구성 옵션을 보려면 VM 인스턴스 만들기 및 시작을 참조하세요.

VM에 DPDK 설치

VM에 DPDK를 설치하려면 다음 단계를 수행합니다.

  1. SSH를 사용하여 이전 섹션에서 만든 VM에 연결합니다.

  2. DPDK 설치의 종속 항목을 구성합니다.

    sudo apt-get update && sudo apt-get upgrade -yq
    sudo apt-get install -yq build-essential ninja-build python3-pip \
        linux-headers-$(uname -r) pkg-config libnuma-dev
    sudo pip install pyelftools meson
    
  3. DPDK를 설치합니다.

    wget https://fast.dpdk.org/rel/dpdk-23.07.tar.xz
    tar xvf dpdk-23.07.tar.xz
    cd dpdk-23.07
    
  4. 예시를 사용해서 DPDK를 빌드하려면 다음 안내를 따르세요.

    meson setup -Dexamples=all build
    sudo ninja -C build install; sudo ldconfig
    

드라이버 설치

드라이버 설치를 위해 DPDK를 준비하려면 다음 방법 중 하나를 선택하여 드라이버를 설치합니다.

IOMMU가 없는 VFIO 설치

IOMMU가 없는 VFIO 드라이버를 설치하려면 다음 단계를 수행합니다.

  1. VFIO가 사용 설정되었는지 확인합니다.

    cat /boot/config-$(uname -r) | grep NOIOMMU
    

    VFIO가 사용 설정되지 않았으면 UIO 설치 단계를 따릅니다.

  2. VFIO에서 비IOMMU 모드를 사용 설정합니다.

    sudo bash -c 'echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode'
    

UIO 설치

DPDK에서 UIO 드라이버를 설치하려면 다음 방법 중 하나를 선택합니다.

Git을 사용하여 UIO 설치

git을 사용하여 DPDK에 UIO 드라이버를 설치하려면 다음 단계를 수행합니다.

  1. igb_uio git 저장소를 VM의 디스크에 클론합니다.

    git clone https://dpdk.org/git/dpdk-kmods
    
  2. 클론된 git 저장소의 상위 디렉터리에서 모듈을 빌드하고 DPDK에 UIO 드라이버를 설치합니다.

    pushd dpdk-kmods/linux/igb_uio
    sudo make
    sudo depmod && sudo insmod igb_uio.ko
    popd
    

Linux 패키지를 사용하여 UIO 설치

Linux 패키지를 사용하여 DPDK에 UIO 드라이버를 설치하려면 다음 단계를 수행합니다.

  1. dpdk-igb-uio-dkms 패키지를 설치합니다.

    sudo apt-get install -y dpdk-igb-uio-dkms
    
  2. DPDK에 UIO 드라이버를 설치합니다.

    sudo modprobe igb_uio
    

드라이버에 DPDK 바인딩 및 테스트

이전 섹션에서 설치한 드라이버에 DPDK를 바인딩하려면 다음 단계를 수행합니다.

  1. 현재 네트워크 인터페이스의 Peripheral Component Interconnect(PCI) 슬롯 번호를 가져옵니다.

    sudo lspci | grep -e "gVNIC" -e "Virtio network device"
    

    예를 들어 VM에 네트워크 인터페이스로 ens4가 사용되는 경우 PCI 슬롯 번호는 00:04.0입니다.

  2. 네트워크 어댑터에 연결된 네트워크 인터페이스를 중지합니다.

    sudo ip link set NETWORK_INTERFACE_NAME down
    

    NETWORK_INTERFACE_NAME을 VPC 네트워크에 지정된 네트워크 인터페이스의 이름으로 바꿉니다. VM이 사용 중인 네트워크 인터페이스를 보려면 네트워크 인터페이스의 구성을 확인합니다.

    sudo ifconfig
    
  3. 드라이버에 DPDK를 바인딩합니다.

    sudo dpdk-devbind.py --bind=DRIVER PCI_SLOT_NUMBER
    

    다음을 바꿉니다.

    • DRIVER: DPDK를 바인딩할 드라이버입니다. 다음 값 중 하나를 지정합니다.

      • UIO 드라이버: igb_uio

      • IOMMU가 없는 VFIO 드라이버: vfio-pci

    • PCI_SLOT_NUMBER: 00:0NUMBER.0 형식의 현재 네트워크 인터페이스의 PCI 슬롯 번호입니다.

  4. /mnt/huge 디렉터리를 만든 후 DPDK에 대해 버퍼에 사용할 hugepage를 만듭니다.

    sudo mkdir /mnt/huge
    sudo mount -t hugetlbfs -o pagesize=1G none /mnt/huge
    sudo bash -c 'echo 4 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages'
    sudo bash -c 'echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages'
    
  5. DPDK 라이브러리에 포함된 testpmd 예시 애플리케이션을 실행하여 이전 단계에서 만든 네트워크 인터페이스를 DPDK가 사용할 수 있는지 테스트합니다.

    sudo ./build/app/dpdk-testpmd
    

    DPDK 테스트에 대한 자세한 내용은 Testpmd 명령줄 옵션을 참조하세요.

DPDK 바인딩 해제

DPDK를 사용한 후에는 이전 섹션에서 설치한 드라이버로부터 바인딩을 해제할 수 있습니다. DPDK를 바인딩 해제하려면 다음 단계를 수행합니다.

  1. 드라이버에서 DPDK를 바인딩 해제합니다.

    sudo dpdk-devbind.py -u PCI_SLOT_NUMBER
    

    PCI_SLOT_NUMBER를 이전 단계에서 지정한 PCI 슬롯 번호로 바꿉니다. 현재 네트워크 인터페이스의 PCI 슬롯 번호를 확인하려면 다음 안내를 따릅니다.

    sudo lspci | grep -e "gVNIC" -e "Virtio network device"
    

    예를 들어 VM에 네트워크 인터페이스로 ens4가 사용되는 경우 PCI 슬롯 번호는 00:04.0입니다.

  2. Compute Engine 네트워크 드라이버를 새로고침합니다.

    sudo bash -c 'echo PCI_SLOT_NUMBER > /sys/bus/pci/drivers/VNIC_DIRECTORY/bind'
    sudo ip link set NETWORK_INTERFACE_NAME up
    

    다음을 바꿉니다.

    • PCI_SLOT_NUMBER: 이전 단계에서 지정한 PCI 슬롯 번호입니다.

    • VNIC_DIRECTORY: vNIC의 디렉터리입니다. 사용 중인 vNIC 유형에 따라 다음 값 중 하나를 지정합니다.

      • gVNIC: gvnic

      • VirtIO-Net: virtio-pci

    • NETWORK_INTERFACE_NAME: 이전 섹션에서 지정한 네트워크 인터페이스의 이름입니다.

다음 단계