ENA Express로 EC2 인스턴스 간 네트워크 성능 향상 - Amazon Elastic Compute Cloud

ENA Express로 EC2 인스턴스 간 네트워크 성능 향상

ENA Express는 AWS Scalable Reliable Datagram(SRD) 기술로 구동됩니다. SRD는 동적 라우팅을 사용하여 스루풋을 늘리고 테일 지연 시간을 최소화하는 고성능 네트워크 전송 프로토콜입니다. ENA Express를 사용하면 동일한 가용 영역에 있는 두 EC2 인스턴스 간에 통신할 수 있습니다.

ENA Express의 이점
  • 가용 영역 내에서 단일 흐름에 사용할 수 있는 최대 대역폭을 5Gbps에서 25Gbps로 집계 인스턴스 제한까지 늘립니다.

  • 특히 네트워크 부하가 높은 기간 동안, EC2 인스턴스 간 네트워크 트래픽의 테일 지연 시간을 줄입니다.

  • 혼잡한 네트워크 경로를 감지하고 피합니다.

  • 수신 측의 패킷 재정렬 작업이나 필요한 대부분의 재전송 작업과 같은 일부 작업을 네트워크 계층에서 직접 처리합니다. 따라서 애플리케이션 계층을 다른 작업에 사용할 수 있습니다.

참고
  • 애플리케이션이 초당 많은 양의 패킷을 송수신하고 대부분의 시간, 특히 네트워크에 정체가 없는 기간 동안 지연 시간을 최적화해야 하는 경우 향상된 네트워킹이 네트워크에 더 적합할 수 있습니다.

  • ENA Express 트래픽은 로컬 영역의 서브넷 간에 전송할 수 없습니다.

인스턴스에서 네트워크 인터페이스 연결에 대해 ENA Express를 활성화하면, 전송 인스턴스가 수신 인스턴스와의 통신을 시작하고 SRD는 ENA Express가 전송 인스턴스와 수신 인스턴스 모두에서 작동하는지 감지합니다. ENA Express가 작동 중인 경우 통신에 SRD 전송이 사용될 수 있습니다. ENA Express가 작동하지 않는 경우 통신이 표준 ENA 전송으로 폴백됩니다.

네트워크 트래픽이 적은 시간 동안 패킷이 ENA Express를 사용하면 패킷 지연 시간(수십 마이크로초)이 약간 증가할 수 있습니다. 이 시간 동안 특정 네트워크 성능 특성을 우선시하는 애플리케이션은 ENA Express를 통해 다음과 같은 이점을 얻을 수 있습니다.

  • 프로세스는 동일한 가용 영역 내 5Gbps~25Gbps의 늘어난 최대 단일 흐름 대역폭부터 최대 집계 인스턴스 제한까지 이점을 누릴 수 있습니다. 예를 들어, 특정 인스턴스 유형이 최대 12.5Gbps를 지원하는 경우 단일 흐름 대역폭도 12.5Gbps로 제한됩니다.

  • 더 오래 실행되는 프로세스의 경우 네트워크 정체 기간 동안 테일 지연 시간이 감소해야 합니다.

  • 네트워크 응답 시간에 대해 보다 원활하고 표준적인 배포에 따른 이점이 있습니다.

ENA Express의 작동 방식

ENA Express는 AWS Scalable Reliable Datagram(SRD) 기술로 구동됩니다. 각 네트워크 흐름의 패킷을 서로 다른 AWS 네트워크 경로에 분산하고, 혼잡 징후가 감지되면 분포를 동적으로 조정합니다. 또한 수신 측에서 패킷 재정렬을 관리합니다.

ENA Express가 의도한 대로 네트워크 트래픽을 관리하려면, 전송 및 수신 인스턴스와 해당 인스턴스 간 통신이 다음 요구 사항을 모두 충족해야 합니다.

  • 전송 인스턴스 유형과 수신 인스턴스 유형이 모두 지원되어야 합니다. 자세한 내용은 ENA Express를 지원하는 인스턴스 유형 표를 참조하세요.

  • 전송 인스턴스와 수신 인스턴스 모두에 ENA Express가 구성되어 있어야 합니다. 구성에 차이가 있는 경우, 트래픽이 표준 ENA 전송으로 기본 설정되는 상황이 발생할 수 있습니다. 다음 시나리오는 이 경우에 어떤 일이 발생하는지 보여줍니다.

    시나리오: 구성의 차이

    Instance ENA Express가 활성화됨 UDP가 ENA Express 사용
    인스턴스 1
    인스턴스 2 아니요

    이 경우 두 인스턴스 모두에 ENA Express가 활성화되어 있으므로 두 인스턴스 간의 TCP 트래픽에 ENA Express를 사용할 수 있습니다. 하지만 인스턴스 중 하나는 UDP 트래픽에 ENA Express를 사용하지 않으므로, UDP를 통한 이 두 인스턴스 간의 통신에는 표준 ENA 전송이 사용됩니다.

  • 전송 인스턴스와 수신 인스턴스가 동일한 가용 영역에서 실행되어야 합니다.

  • 인스턴스 간 네트워크 경로에 미들웨어 박스가 포함되지 않아야 합니다. ENA Express는 현재 미들웨어 박스를 지원하지 않습니다.

  • (Linux 인스턴스만 해당) 대역폭의 잠재력을 최대한 활용하려면 드라이버 버전 2.2.9 이상을 사용하세요.

  • (Linux 인스턴스만 해당) 지표를 생성하려면 드라이버 버전 2.8 이상을 사용합니다.

요구 사항이 하나라도 충족되지 않을 경우, 인스턴스는 표준 TCP/UDP 프로토콜을 사용하지만 SRD 없이 통신합니다.

인스턴스 네트워크 드라이버가 최적의 성능을 발휘하도록 구성되었는지 확인하려면, ENA 드라이버에 대한 권장 모범 사례를 검토하세요. 이러한 모범 사례는 ENA Express에도 적용됩니다. 자세한 내용은 GitHub 웹 사이트에서 ENA Linux Driver Best Practices and Performance Optimization Guide(ENA Linux 드라이버 모범 사례 및 성능 최적화 가이드)를 참조하세요.

참고

Amazon EC2는 인스턴스와 연결(attachment)로서 해당 인스턴스에 연결된 네트워크 인터페이스 간의 관계를 참조합니다. ENA Express 설정이 이 연결에 적용됩니다. 네트워크 인터페이스가 인스턴스에서 분리되면, 이 연결은 더 이상 존재하지 않으며 해당 연결에 적용된 ENA Express 설정도 더 이상 적용되지 않습니다. 네트워크 인터페이스가 남아 있을 수 있지만, 인스턴스가 종료될 때도 마찬가지입니다.

전송 인스턴스와 수신 인스턴스 모두에서 네트워크 인터페이스 연결에 대해 ENA Express를 활성화한 후에는 ENA Express 지표를 사용하여 인스턴스에서 SRD 기술이 제공하는 성능 개선의 이점을 최대한 활용할 수 있습니다. ENA Express 지표에 대한 자세한 내용은 ENA Express의 지표 섹션을 참조하세요.

ENA Express를 지원하는 인스턴스 유형

다음 탭에서는 ENA Express를 지원하는 인스턴스 유형을 보여줍니다.

General purpose
인스턴스 유형 아키텍처
m6a.12xlarge x86_64
m6a.16xlarge x86_64
m6a.24xlarge x86_64
m6a.32xlarge x86_64
m6a.48xlarge x86_64
m6a.metal x86_64
m6i.8xlarge x86_64
m6i.12xlarge x86_64
m6i.16xlarge x86_64
m6i.24xlarge x86_64
m6i.32xlarge x86_64
m6i.metal x86_64
m6id.8xlarge x86_64
m6id.12xlarge x86_64
m6id.16xlarge x86_64
m6id.24xlarge x86_64
m6id.32xlarge x86_64
m6id.metal x86_64
m7a.12xlarge x86_64
m7a.16xlarge x86_64
m7a.24xlarge x86_64
m7a.32xlarge x86_64
m7a.48xlarge x86_64
m7a.metal-48xl x86_64
m7g.12xlarge arm64
m7g.16xlarge arm64
m7g.metal arm64
m7gd.12xlarge arm64
m7gd.16xlarge arm64
m7gd.metal arm64
m7i.12xlarge x86_64
m7i.16xlarge x86_64
m7i.24xlarge x86_64
m7i.48xlarge x86_64
m7i.metal-24xl x86_64
m7i.metal-48xl x86_64
m8g.12xlarge arm64
m8g.16xlarge arm64
m8g.24xlarge arm64
m8g.48xlarge arm64
m8g.metal-24xl arm64
m8g.metal-48xl arm64
Compute optimized
인스턴스 유형 아키텍처
c6a.12xlarge x86_64
c6a.16xlarge x86_64
c6a.24xlarge x86_64
c6a.32xlarge x86_64
c6a.48xlarge x86_64
c6a.metal x86_64
c6gn.16xlarge arm64
c6i.8xlarge x86_64
c6i.12xlarge x86_64
c6i.16xlarge x86_64
c6i.24xlarge x86_64
c6i.32xlarge x86_64
c6i.metal x86_64
c6id.8xlarge x86_64
c6id.12xlarge x86_64
c6id.16xlarge x86_64
c6id.24xlarge x86_64
c6id.32xlarge x86_64
c6id.metal x86_64
c7a.12xlarge x86_64
c7a.16xlarge x86_64
c7a.24xlarge x86_64
c7a.32xlarge x86_64
c7a.48xlarge x86_64
c7a.metal-48xl x86_64
c7g.12xlarge arm64
c7g.16xlarge arm64
c7g.metal arm64
c7gd.12xlarge arm64
c7gd.16xlarge arm64
c7gd.metal arm64
c7i.12xlarge x86_64
c7i.16xlarge x86_64
c7i.24xlarge x86_64
c7i.48xlarge x86_64
c7i.metal-24xl x86_64
c7i.metal-48xl x86_64
c8g.12xlarge arm64
c8g.16xlarge arm64
c8g.24xlarge arm64
c8g.48xlarge arm64
c8g.metal-24xl arm64
c8g.metal-48xl arm64
Memory optimized
인스턴스 유형 아키텍처
r6a.12xlarge x86_64
r6a.16xlarge x86_64
r6a.24xlarge x86_64
r6a.32xlarge x86_64
r6a.48xlarge x86_64
r6a.metal x86_64
r6i.8xlarge x86_64
r6i.12xlarge x86_64
r6i.16xlarge x86_64
r6i.24xlarge x86_64
r6i.32xlarge x86_64
r6i.metal x86_64
r6id.8xlarge x86_64
r6id.12xlarge x86_64
r6id.16xlarge x86_64
r6id.24xlarge x86_64
r6id.32xlarge x86_64
r6id.metal x86_64
r7a.12xlarge x86_64
r7a.16xlarge x86_64
r7a.24xlarge x86_64
r7a.32xlarge x86_64
r7a.48xlarge x86_64
r7a.metal-48xl x86_64
r7g.12xlarge arm64
r7g.16xlarge arm64
r7g.metal arm64
r7gd.12xlarge arm64
r7gd.16xlarge arm64
r7gd.metal arm64
r7i.12xlarge x86_64
r7i.16xlarge x86_64
r7i.24xlarge x86_64
r7i.48xlarge x86_64
r7i.metal-24xl x86_64
r7i.metal-48xl x86_64
r8g.12xlarge arm64
r8g.16xlarge arm64
r8g.24xlarge arm64
r8g.48xlarge arm64
r8g.metal-24xl arm64
r8g.metal-48xl arm64
u7i-12tb.224xlarge x86_64
u7in-16tb.224xlarge x86_64
u7in-24tb.224xlarge x86_64
u7in-32tb.224xlarge x86_64
x2idn.16xlarge x86_64
x2idn.24xlarge x86_64
x2idn.32xlarge x86_64
x2idn.metal x86_64
x2iedn.8xlarge x86_64
x2iedn.16xlarge x86_64
x2iedn.24xlarge x86_64
x2iedn.32xlarge x86_64
x2iedn.metal x86_64
x8g.12xlarge arm64
x8g.16xlarge arm64
x8g.24xlarge arm64
x8g.48xlarge arm64
x8g.metal-24xl arm64
x8g.metal-48xl arm64
Accelerated computing
인스턴스 유형 아키텍처
g6.48xlarge x86_64
g6e.12xlarge x86_64
g6e.24xlarge x86_64
g6e.48xlarge x86_64
Storage optimized
인스턴스 유형 아키텍처
i4g.4xlarge arm64
i4g.8xlarge arm64
i4g.16xlarge arm64
i4i.8xlarge x86_64
i4i.12xlarge x86_64
i4i.16xlarge x86_64
i4i.24xlarge x86_64
i4i.32xlarge x86_64
i4i.metal x86_64
im4gn.4xlarge arm64
im4gn.8xlarge arm64
im4gn.16xlarge arm64

Linux Windows 인스턴스의 사전 조건

ENA Express가 효과적으로 작동할 수 있도록 하려면 다음과 같이 Linux 인스턴스 설정을 업데이트하세요.

  • 인스턴스에서 점보 프레임을 사용하는 경우, 다음 명령을 실행하여 최대 전송 단위(MTU)를 8900으로 설정합니다.

    [ec2-user ~]$ sudo ip link set dev eth0 mtu 8900
  • 다음과 같이 수신기(Rx) 링 크기를 늘립니다.

    [ec2-user ~]$ ethtool -G device rx 8192
  • ENA Express 대역폭을 최대화하려면 다음과 같이 TCP 대기열 제한을 구성합니다.

    1. TCP 작은 대기열 제한을 1MB 이상으로 설정합니다. 이렇게 하면 소켓에서 전송을 위해 대기열에 등록되는 데이터 양이 증가합니다.

      sudo sh -c 'echo 1048576 > /proc/sys/net/ipv4/tcp_limit_output_bytes'
    2. eth 디바이스에서 바이트 대기열 제한이 Linux 배포에 대해 활성화되어 있는 경우 비활성화합니다. 이렇게 하면 장치 대기열에 전송을 위해 등록되는 데이터가 증가합니다.

      sudo sh -c 'for txq in /sys/class/net/eth0/queues/tx-*; do echo max > ${txq}/byte_queue_limits/limit_min; done'
      참고

      Amazon Linux 배포용 ENA 드라이버는 기본적으로 바이트 대기열 제한을 비활성화합니다.

Linux 인스턴스의 ENA Express 설정에 대한 성능 튜닝

최적의 ENA Express 성능을 위해 Linux 인스턴스 구성을 확인하려면 Amazon GitHub 리포지토리에서 사용 가능한 다음 스크립트를 실행할 수 있습니다.

https://github.com/amzn/amzn-ec2-ena-utilities/blob/main/ena-express/check-ena-express-settings.sh

이 스크립트는 일련의 테스트를 실행하고 권장 및 필수 구성 변경을 모두 제안합니다.