다음을 통해 공유


Azure Virtual Machine에 대한 네트워크 처리량 최적화

Azure VM(가상 머신)에는 네트워크 처리량에 추가로 최적화할 수 있는 기본 네트워크 설정이 있습니다. 이 문서에서는 Ubuntu 및 Red Hat과 같은 주요 배포를 포함하여 Windows 및 Linux VM에 대한 네트워크 처리량을 최적화하는 방법을 설명합니다.

Windows 가상 머신

Windows VM에서 가속화된 네트워킹을 지원하는 경우 최적의 처리량을 위해 해당 기능을 사용하도록 설정합니다. 자세한 내용은 가속화된 네트워킹을 사용하여 Windows VM 만들기를 참조하세요.

다른 모든 Windows VM의 경우 RSS(수신측 크기 조정)를 사용하면 RSS가 없는 VM보다 더 높은 최대 처리량에 도달할 수 있습니다. RSS는 Windows VM에서 기본적으로 사용되지 않도록 설정되어 있을 수 있습니다. RSS가 사용하도록 설정되어 있는지 확인하고 사용하도록 설정하려면 다음 단계를 수행합니다.

  1. Get-NetAdapterRss PowerShell 명령을 사용하여 네트워크 어댑터에 대해 RSS를 사용하도록 설정되어 있는지 확인합니다. 다음 예제에서는 Get-NetAdapterRss RSS에서 반환된 출력이 활성화되지 않았습니다.

    Name                    : Ethernet
    InterfaceDescription    : Microsoft Hyper-V Network Adapter
    Enabled                 : False
    
  2. RSS를 사용하도록 설정하려면 다음 명령을 입력합니다.

    Get-NetAdapter | % {Enable-NetAdapterRss -Name $_.Name}
    

    이 명령에는 출력이 없습니다. 이 명령은 NIC(네트워크 인터페이스 카드) 설정을 변경합니다. 그로 인해 약 1분 동안 일시적으로 연결이 끊깁니다. 연결이 끊긴 동안 다시 연결 중 대화 상자가 나타납니다. 일반적으로 세 번째 시도 후 연결이 복원합니다.

  3. Get-NetAdapterRss 명령을 다시 입력하여 VM에서 RSS가 사용되도록 설정되어 있는지 확인합니다. 성공하면 다음 예제 출력이 반환됩니다.

    Name                    : Ethernet
    InterfaceDescription    : Microsoft Hyper-V Network Adapter
    Enabled                 : True
    

Linux 가상 머신

RSS는 Azure의 Linux VM(Virtual Machine)에서 항상 기본적으로 사용하도록 설정됩니다. 2017년 10월 이후에 출시된 Linux 커널에는 Linux VM이 더 높은 네트워크 처리량을 얻도록 하는 새로운 네트워크 최적화 옵션이 포함되어 있습니다.

최적의 처리량을 위해 Azure 가속 네트워킹 사용

Azure는 네트워크 성능, 대기 시간, 지터를 실제로 향상시킬 수 있는 가속화된 네트워킹을 제공합니다. 현재 가상 머신 크기에 따라 사용되는 두 가지 기술이 있습니다. 사용 가능한 멜 라녹스와 Microsoft에서 개발한 MANA 입니다.

Azure 플랫폼에 맞춰 최적화된 커널

Ubuntu(정식) 및 SUSE와 같은 일부 배포에는 Azure 조정 커널이 있습니다.

Azure 커널에는 일반적으로 이름에 azure 문자열이 포함되어 있으므로, Azure 커널을 사용하고 있는지 확인하려면 다음 명령을 사용하세요.

uname -r

#sample output on Azure kernel on a Ubuntu Linux VM
6.8.0-1017-azure

기타 Linux 배포

대부분의 최신 배포는 최신 커널을 사용하여 크게 개선되었습니다. 현재 커널 버전을 확인하여 4.19보다 최신 커널을 실행하고 있는지 확인합니다. 여기에는 네트워킹의 몇 가지 향상된 기능(예: BBR Congestion-Based 정체 제어 지원)이 포함되어 있습니다.

Azure의 Linux VM에서 일관된 전송 속도 달성

Linux VM은 특히 서유럽 및 미국 서부와 같은 지역 간에 대용량 파일(1GB~50GB)을 전송할 때 네트워크 성능 문제가 발생하는 경우가 많습니다. 이러한 문제는 이전 커널 버전뿐만 아니라 기본 커널 구성, 기본 네트워크 버퍼 설정 및 기본 정체 제어 알고리즘으로 인해 발생하며 이로 인해 패킷이 지연되고 처리량이 제한되고 리소스 사용이 비효율적입니다.

일관된 네트워크 성능을 얻으려면 Azure의 여러 상황에서 효과적인 것으로 입증된 다음 최적화를 구현하는 것이 좋습니다.

  • 네트워크 버퍼 설정: 커널 매개 변수를 조정하여 읽기 및 쓰기 메모리 버퍼를 최대화합니다. /etc/sysctl.d/99-azure-network-buffers.conf에 이 구성들을 추가하세요.
net.ipv4.tcp_mem = 4096 87380 67108864
net.ipv4.udp_mem = 4096 87380 33554432
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.core.rmem_default = 33554432
net.core.wmem_default = 33554432
net.ipv4.udp_wmem_min = 16384
net.ipv4.udp_rmem_min = 16384
net.core.wmem_max = 134217728
net.core.rmem_max = 134217728
net.core.busy_poll = 50
net.core.busy_read = 50
  • 커널 4.19 이상에 대한Congestion-Based 혼잡 제어: BBR(병목 대역폭 및 왕복 전파 시간) 혼잡 제어를 활성화하면 자주 처리량이 향상될 수 있습니다. 이 구성을 /etc/sysctl.d/99-azure-congestion-control.conf에 추가합니다.
net.ipv4.tcp_congestion_control = bbr 
  • 일반적으로 더 나은 일관성, 처리량에 도움이 되는 추가 TCP 매개 변수: 다음 구성을 /etc/sysctl.d/99-azure-network-extras.conf추가합니다.
# For deployments where the Linux VM is BEHIND an Azure Load Balancer, timestamps MUST be set to 0
net.ipv4.tcp_timestamps = 1

# Reuse does require tcp_timestamps to be enabled. If tcp_timestamps are disabled because of load balancers, you should set reuse to 2.
net.ipv4.tcp_tw_reuse = 1

# Allowed local port range. This will increase the number of locally available ports (source ports)
net.ipv4.ip_local_port_range = 1024 65535

# Maximum number of packets taken from all interfaces in one polling cycle (NAPI poll). In one polling cycle interfaces which are # registered to polling are probed in a round-robin manner.
net.core.netdev_budget = 1000

# For high-performance environments, it's recommended to increase from the default 20KB to 65KB, in some extreme cases, for environments that support 100G+ networking, you can 
# increase it to 1048576
net.core.optmem_max = 65535

# F-RTO is not recommended on wired networks. 
net.ipv4.tcp_frto = 0

# Increase the number of incoming connections / number of connections backlog
net.core.somaxconn = 32768
net.core.netdev_max_backlog = 32768
net.core.dev_weight = 64
  • 큐 분야(qdisc): Azure의 패킷 처리는 기본 qdisc fq를 .로 설정하여 향상됩니다. 이 구성을 /etc/sysctl.d/99-azure-qdisc.conf에 추가합니다.
net.core.default_qdisc = fq 
  • TX/RX에 대한 NIC 링 버퍼 최적화: 네트워크 인터페이스에 /etc/udev/rules.d/99-azure-ring-buffer.rules 적용되도록 udev 규칙을 만듭니다.
# Setup Accelerated Interface ring buffers (Mellanox / Mana) 
SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION=="add",  RUN+="/usr/sbin/ethtool -G $env{INTERFACE} rx 1024 tx 1024"

# Setup Synthetic interface ring buffers (hv_netvsc)
SUBSYSTEM=="net", DRIVERS=="hv_netvsc*", ACTION=="add",  RUN+="/usr/sbin/ethtool -G $env{INTERFACE} rx 1024 tx 1024"
  • /etc/udev/rules.d/99-azure-qdisc.rules에서 qdisc가 네트워크 인터페이스에 적용되도록 udev 규칙을 만듭니다.
ACTION=="add|change", SUBSYSTEM=="net", KERNEL=="enP*", PROGRAM="/sbin/tc qdisc replace dev \$env{INTERFACE} root noqueue" 
ACTION=="add|change", SUBSYSTEM=="net", KERNEL=="eth*", PROGRAM="/sbin/tc qdisc replace dev \$env{INTERFACE} root fq“ 
  • IRQ(인터럽트 요청) 예약: 워크로드에 따라 irqbalance 서비스가 특정 노드에서 IRQ를 예약하지 못하도록 제한할 수 있습니다. IRQBalance를 사용할 때, IRQ가 예약되지 않아야 하는 CPU를 지정하도록 /etc/default/irqbalance을 업데이트할 수 있습니다. 이 경우, 제외가 필요한 CPU를 제외할 마스크를 결정해야 합니다.

마스크를 계산하는 방법에 대한 더 많은 정보는 여기에서 확인할 수 있습니다.

아래 예제에서는 CPU 8-15를 제외한다고 가정합니다.

IRQBALANCE_BANNED_CPULIST=0000ff00
  • UDEV 규칙: 큐 길이를 최적화하고 디바이스 플래그를 효율적으로 관리하는 규칙을 추가합니다. 에서 다음 규칙을 만듭니다./etc/udev/rules.d/99-azure-txqueue-len.rules
SUBSYSTEM=="net", ACTION=="add|change", KERNEL=="eth*", ATTR{tx_queue_len}="10000“ 

패킷이 두 번 지연된 경우

Linux 성능 네트워킹과 관련하여 Mellanox 드라이버(mlx4 또는 mlx5)와 함께 SR-IOV을 사용하는 경우, Azure와 관련하여 두 개의 인터페이스, 하나는 합성 인터페이스이고 다른 하나는 가상 인터페이스를 생성한다는 것입니다. 자세한 내용을 알아보십시오.

추가 참고 사항

시스템 관리자는 다음과 같은 /etc/sysctl.d//etc/modules-load.d/구성 파일을 편집하여 이러한 솔루션을 구현할 수 있습니다/etc/udev/rules.d/. 커널 드라이버 업데이트 및 시스템 구성에서 잠재적인 회귀를 검토해야 합니다.

특정 구성 및 문제 해결에 대한 자세한 내용은 네트워킹 성능에 대한 Azure 설명서를 참조하세요.