Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
내 평균 사용률이 낮은데 Amazon EC2 인스턴스가 네트워크 제한을 초과하는 이유는 무엇입니까?
Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스의 평균 네트워크 사용률이 낮지만, 인스턴스가 여전히 대역폭 또는 PPS(Packets Per Second, 초당 패킷 수) 할당량을 초과합니다.
간략한 설명
평균 사용률이 낮더라도 bw_in_allowance_exceeded, bw_out_allowance_exceeded 또는 pps_allowance_exceeded Elastic Network Adapter(ENA) 네트워크 성능 지표가 증가할 수 있습니다. 이 문제의 가장 일반적인 원인은 마이크로버스트라고 하는 네트워크 리소스에 대한 수요가 잠깐 급증했기 때문입니다. 마이크로버스트는 일반적으로 몇 초, 밀리초 또는 마이크로초 동안만 지속됩니다. Amazon CloudWatch 지표는 이를 반영할 만큼 세분화되어 있지 않습니다. 예를 들어 CloudWatch의 NetworkIn 및 NetWorkout 인스턴스 지표를 사용하여 초당 평균 처리량을 계산할 수 있습니다. 하지만 마이크로버스트로 인해 계산된 속도가 인스턴스 유형의 사용 가능한 인스턴스 대역폭보다 낮을 수 있습니다.
bw_in_allowance_exceeded 및 bw_out_allowance_exceeded 지표의 증가는 ‘최대’ 대역폭(예: ‘초당 최대 10기가비트(Gbps)’)을 갖는 더 작은 인스턴스에서도 발생합니다. 더 작은 인스턴스는 네트워크 I/O 크레딧을 사용하여 제한된 시간 동안 기준 대역폭을 초과하여 버스트합니다. 크레딧이 고갈되면 트래픽이 기준 대역폭에 맞게 조정되고 지표가 증가합니다. 인스턴스 버스트는 최선의 노력을 기준으로 발생하므로 인스턴스에 사용 가능한 I/O 크레딧이 있더라도 지표가 증가할 수 있습니다.
최적이 아닌 트래픽 패턴으로 인해 낮은 PPS 속도에서 패킷이 손실되는 경우에도 pps_allowance_exceeded 지표가 증가합니다. 비대칭 라우팅, 오래된 드라이버, 작은 패킷, 조각 및 연결 추적은 워크로드의 PPS 성능에 영향을 미칩니다.
해결 방법
평균 계산
CloudWatch는 60초마다 Amazon EC2 지표를 샘플링하여 1분 내에 전송되는 총 바이트 또는 패킷을 캡처합니다. Amazon EC2는 샘플을 집계하여 5분 간격으로 CloudWatch에 게시합니다. 해당 기간의 각 통계는 서로 다른 값을 보여줍니다.
세부 모니터링을 사용하는 경우 CloudWatch는 집계 없이 1분간격으로 NetworkIn 및 NetWorkout 지표를 게시합니다. 합계, 최소, 평균 및 최대 값은 동일하며 SampleCount의 값은 1입니다. CloudWatch는 항상 5분 간격으로 NetworkPacketsIn 및 NetworkPacketsOut 지표를 집계하여 게시합니다.
다음 방법을 사용하여 기간 내 평균 처리량을 초당 바이트 수(Bps) 또는 PPS로 계산합니다.
- 지정된 기간의 단순 평균을 구하려면 합계를 기간이나 값의 타임스탬프 차이(DIFF_TIME)로 나눕니다.
- 활동이 가장 많은 분 단위 평균을 구하려면 최대를 60초로 나눕니다.
Bps를 Gbps로 변환하려면 계산 결과를 1,000,000,000바이트로 나눈 다음 8비트를 곱합니다.
CloudWatch 지표의 마이크로버스트
다음 예는 CloudWatch에서 마이크로버스트가 어떻게 나타나는지 보여줍니다. 인스턴스는 10Gbps의 네트워크 대역폭을 허용하며 기본 모니터링을 사용합니다.
60초 샘플에서 약 24GB의 아웃바운드 데이터 전송은 사용 가능한 모든 대역폭을 사용합니다. 데이터 전송은 bw_out_allowance_exceeded 값을 증가시키고 평균 속도 9.6Gbps로 약 20초 안에 완료됩니다. Amazon EC2는 다른 데이터를 전송하지 않으며 인스턴스는 나머지 4개 샘플(240초) 동안 유휴 상태를 유지합니다.
5분 동안의 Gbps 평균 처리량은 마이크로버스트 동안의 처리량보다 훨씬 낮습니다.
수식: AVERAGE_Gbps = SUM(NetworkOut) / PERIOD(NetworkOut) / 1,000,000,000바이트 * 8비트
SUM(NetworkOut) = (~24GB * 샘플 1개) + (~0GB * 샘플 4개) = ~24GB
PERIOD(NetworkOut) = 300초(5분)
AVERAGE_Gbps = ~24 / 300 / 1,000,000,000 * 8 = ~0.64Gbps
가장 높은 샘플을 기준으로 평균 처리량을 계산하더라도 이 양은 여전히 마이크로버스트 기간 동안의 처리량을 반영하지 않습니다.
수식: AVERAGE_Gbps = MAXIMUM(NetworkOut) / 60초 / 1,000,000,000바이트 / 8비트
MAXIMUM(NetworkOut) = ~24GB
AVERAGE_Gbps = ~24 GB / 60 / 1,000,000,000 * 8 = ~3.2Gbps
고해상도 데이터가 있으면 더 정확한 평균을 얻을 수 있습니다. 1초 간격으로 운영 체제(OS) 네트워크 사용 지표를 수집하면 평균 처리량이 잠시 약 9.6Gbps에 도달합니다.
마이크로버스트 모니터링
Linux 및 Windows에서 CloudWatch 에이전트를 사용하면 최대 1초 간격으로 OS 수준 네트워크 지표를 CloudWatch에 게시할 수 있습니다. 에이전트는 ENA 네트워크 성능 지표를 게시할 수도 있습니다.
참고: 고해상도 지표는 가격이 더 높습니다.
또한 OS 도구를 사용하여 최대 1초 간격으로 네트워크 통계를 모니터링할 수 있습니다. Windows 인스턴스의 경우 성능 모니터를 사용하십시오. Linux의 경우 sar, nload, iftop, iptraf-ng 또는 netqtop을 사용하십시오.
마이크로버스트를 명확하게 식별하려면 OS의 패킷 캡처를 수행한 후, Wireshark를 사용하여 1밀리초 간격으로 I/O 그래프를 작성합니다. 자세한 내용은 Wireshark 웹사이트의 Wireshark 다운로드 및 8.8. "I/O 그래프" 창을 참조하십시오.
이 메서드에는 다음과 같은 제한 사항이 있습니다.
- 네트워크 허용량은 마이크로초 수준에서 대략 비례합니다. 예를 들어 대역폭 성능이 10Gbps인 인스턴스 유형은 1밀리초에 약 10메가비트(Mb)를 보내고 받을 수 있습니다.
- 패킷 캡처는 추가 시스템 부하를 유발하고 전체 처리량 및 PPS 속도를 감소시킬 수 있습니다.
- 전체 버퍼로 인한 패킷 손실에 따라 패킷 캡처에 일부 패킷이 포함되지 않을 수 있습니다.
- 타임스탬프는 네트워크가 패킷을 전송한 시간 또는 ENA가 패킷을 수신한 시간을 정확하게 반영하지 않습니다.
- Amazon EC2는 인스턴스에 도달하기 전에 할당량을 초과하는 트래픽을 구성하기 때문에 I/O 그래프에서 인바운드 트래픽의 활동이 더 적을 수 있습니다.
패킷 대기열 및 삭제
네트워크가 패킷을 대기열에 넣으면 그에 따른 지연 시간은 밀리초 단위로 측정됩니다. TCP 연결은 처리량의 규모를 조정하고 EC2 인스턴스 유형의 할당량을 초과할 수 있습니다. 그 결과, BBR(Bottleneck Bandwidth and Round Trip, 병목 대역폭과 왕복 전파 시간) 또는 지연 시간을 신호로 사용하는 기타 혼잡 제어 알고리즘을 사용하는 경우에도 일부 패킷 대기열이 예상됩니다. 네트워크가 패킷을 삭제하면 TCP는 손실된 세그먼트를 자동으로 재전송합니다. 패킷 대기열과 삭제 모두 지연 시간을 늘리고 처리량을 낮출 수 있습니다. 하지만 복구 작업은 볼 수 없습니다. 일반적으로 볼 수 있는 유일한 오류는 애플리케이션이 낮은 제한 시간을 사용하거나 네트워크에서 충분한 패킷이 삭제되어 연결이 강제로 종료되는 경우입니다.
ENA 네트워크 성능 지표는 대기열에 있는 패킷과 삭제된 패킷을 구분하지 않습니다. Linux에서 연결 수준의 TCP 지연 시간을 측정하려면 ss 또는 tcprtt 명령을 사용하십시오. TCP 재전송을 측정하려면 연결 수준 통계에는 ss 또는 tcpretrans 명령을 사용하고 시스템 전체 통계에는nstat를 사용하십시오. BCC(BPF Compiler Collection, BPF 컴파일러 컬렉션)에 속하는 tcprtt 및 tcpretrans 도구를 다운로드하려면 GitHub 웹사이트에서 bcc를 참조하십시오. 또한 패킷 캡처를 사용하여 지연 시간 및 재전송을 측정할 수 있습니다.
참고: 인스턴스 할당량 초과로 인해 네트워크에서 삭제된 패킷은 ip 또는 ifconfig에 대한 삭제 카운터에 나타나지 않습니다.
마이크로버스트 방지
먼저 패킷 대기열 또는 삭제의 영향을 파악하기 위해 애플리케이션의 KPI(Key Performance Indicator, 주요 성과 지표)와 ENA 네트워크 성능 지표를 비교합니다.
KPI가 필수 임계값 미만이거나 애플리케이션 로그 오류가 발생하는 경우 다음 조치를 취하여 패킷 대기열 및 삭제를 줄이십시오.
- 스케일 업: 네트워크 허용량이 더 높은 인스턴스로 인스턴스 크기를 늘립니다. C7gn과 같이 "n"이 포함된 인스턴스 유형은 네트워크 허용량이 더 높습니다.
- 스케일 아웃: 트래픽을 여러 인스턴스로 분산하여 개별 인스턴스에서 발생하는 트래픽과 경합을 줄입니다.
Linux 기반 작업의 경우 마이크로버스트를 방지하기 위해 다음 전략을 구현할 수도 있습니다. 워크로드에 부정적인 영향을 미치지 않으면서 트래픽 쉐이핑을 줄이는지 확인하기 위해 테스트 환경에서 전략을 테스트하는 것이 가장 좋습니다.
참고: 다음 전략은 아웃바운드 트래픽에만 해당됩니다.
SO_MAX_PACING_RATE
SO_MAX_PACING_RATE 소켓 옵션을 사용하여 연결에 대한 최대 페이싱 속도를 Bps로 지정합니다. 그러면 Linux 커널은 소켓의 패킷 간에 지연을 발생시켜 처리량이 지정한 할당량을 초과하지 않도록 합니다.
이 방법을 사용하려면 다음 변경 사항을 구현해야 합니다.
- 애플리케이션 코드 변경.
- 커널에서의 지원. 자세한 내용은 GitHub 웹사이트의 net: introduce SO_MAX_PACING_RATE를 참조하십시오.
- FQ(Fair Queue) 대기열 규율 또는 TCP 계층에서의 조절에 대한 커널 지원(TCP에만 해당).
자세한 내용은 man7 웹사이트의 getsockopt(2) - Linux 매뉴얼 페이지 및 tc-fq(8) - Linux 매뉴얼 페이지를 참조하십시오. 또한 GitHub 웹사이트의 tcp: 조절을 위한 내부 구현을 참조하십시오.
qdiscs
Linux는 패킷을 스케줄링하기 위해 각 ENA 대기열에 대해 pfifo_fast 대기열 규율(qdisc)의 기본 구성을 사용합니다. fq qdisc를 사용하여 개별 흐름에서 트래픽 버스트를 줄이고 처리량을 조절합니다. 또는 fq_codel 및 cake를 사용하여 네트워크 혼잡을 줄이고 지연 시간을 개선하는 AQM(Active Queue Management, 능동적 대기열 관리) 기능을 제공합니다. 자세한 내용은 man7 웹사이트의 tc(8) - Linux 매뉴얼 페이지를 참조하십시오.
TCP의 경우 클라이언트 및 서버에서 ECN(Explicit Congestion Notification, 명시적 혼잡 알림)을 활성화합니다. 그런 다음 ECN을 ECN CE(Congestion Experienced, 혼잡 경험) 표시를 수행할 수 있는 qdisc와 결합합니다. CE 마크를 사용하면 OS에서 연결 처리량을 낮춰 인스턴스 할당량 초과로 인한 지연 및 패킷 손실을 줄일 수 있습니다. 이 솔루션을 사용하려면 연결의 평균 왕복 시간(RTT) 기준 낮은 CE 임계값으로 qdisc를 구성해야 합니다. 연결 간 평균 RTT가 크게 변하지 않는 경우에만 이 솔루션을 사용하는 것이 가장 좋습니다. 예를 들어 인스턴스는 하나의 가용 영역에서만 트래픽을 관리합니다.
성능 문제로 인해 인스턴스 수준에서 집계된 대역폭 쉐이핑을 설정하는 것은 모범 사례가 아닙니다.
단순 전송(Tx) 큐
단순 전송 Tx 큐를 사용하여 PPS 쉐이핑을 줄이십시오. BQL(Byte Queue Limits, 바이트 큐 제한)은 Tx 큐의 진행 중인 바이트 수를 동적으로 제한합니다. BQL을 활성화하려면 GRUB의 커널 명령줄에 ena.enable_bql=1을 추가하십시오.
참고: 이 솔루션을 사용하려면 ENA 드라이버 버전 2.6.1g 이상이 있어야 합니다. BQL은 K로 끝나는 Linux 커널 버전의 ENA 드라이버에 이미 활성화되어 있습니다.
자세한 내용을 보려면 LWN.net 웹사이트의 bql: 바이트 큐 제한을 참조하십시오.
ENA Express를 사용할 때 대역폭을 최대화하려면 BQL을 비활성화해야 합니다.
또한 ethtool을 사용하여 Tx 큐 길이를 기본값인 1,024개 패킷에서 줄일 수 있습니다. 자세한 내용은 man7 웹사이트의 ethtool(8) - Linux 매뉴얼 페이지를 참조하십시오.
관련 정보

관련 콘텐츠
- 질문됨 2년 전lg...
- 질문됨 4달 전lg...
- 질문됨 9달 전lg...
- 질문됨 한 달 전lg...
- 질문됨 일 년 전lg...