Application Load Balancer에 대한 TargetResponseTime 지표 증가 문제를 해결하려면 어떻게 해야 하나요?

4분 분량
0

Application Load Balancer TargetResponseTime 지표가 증가하는 것을 확인했습니다. 이 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

TargetResponseTime은 요청이 로드 밸런서를 떠나는 시점과 대상에서 응답이 수신된 시점 사이 경과된 시간(초)입니다. 이는 Application Load Balancer 액세스 로그의 target_processing_time 필드와 같은 개념입니다.

TargetResponseTime이 증가하는 원인은 다음과 같습니다.

  • 호스트의 상태가 좋지 않습니다.
  • 백엔드 인스턴스가 너무 많은 요청에 과부하되었습니다.
  • 백엔드 인스턴스의 CPU 사용률이 높습니다.
  • 하나 이상의 대상에 결함이 있습니다.
  • 백엔드 인스턴스에서 실행되는 웹 애플리케이션 종속성에 문제가 있습니다.

해결 방법

호스트의 상태가 좋지 않음

모든 Application Load Balancer 대상의 상태가 정상인지 확인합니다. Application Load Balancer 상태 확인이 실패하는 문제를 수정 및 해결하려면 어떻게 해야 하나요?를 참조하세요.

백엔드 인스턴스가 너무 많은 요청에 과부하됨

Application Load Balancer에 대한 Amazon CloudWatchRequestCountActiveConnectionCount 수 지표의 합계 통계를 확인합니다. TargetResponseTime와 합계가 동시에 증가한다면 백엔드 인스턴스가 요청 로드로 인해 과부하가 걸린다는 뜻일 수 있습니다.

이 문제를 해결하려면 백엔드 인스턴스에 Auto Scaling 그룹을 구성하십시오. 튜토리얼: 조정 및 로드 밸런싱된 애플리케이션 설정을 참조하세요.

백엔드 인스턴스의 CPU 사용률 높음

백엔드 인스턴스의 CloudWatch CPUUtilization 지표를 점검합니다. CPU 사용률이 높거나 사용률이 급증하는 경우 인스턴스를 더 큰 인스턴스 유형으로 업그레이드하십시오.

하나 이상의 대상에 결함이 있음

대상에 결함이 있는 경우 다음 단계에 따라 문제를 해결하십시오.

1.    로드 밸런서에 대한 액세스 로깅을 활성화합니다.

2.    TargetResponseTime이 높을 때 시간 범위에 대한 액세스 로그를 다운로드합니다. 예를 들어 AWS 명령줄 인터페이스(AWS CLI)를 사용하여 2022-02-01T03:00 에서 2022-02-01T03:35 사이의 액세스 로그를 다운로드하려면 다음과 같이 하십시오.

aws s3 cp s3://bucket-name[/prefix]/AWSLogs/aws-account-id/elasticloadbalancing/region/2022/02/01/ ./alblogs --recursive --exclude "*" --include "*20220201T03[0123]*"

참고: bucket-name을 버킷 이름으로 바꾸고, aws-account-id를 AWS 계정의 ID로, region을 계정이 위치한 AWS 리전으로 바꿉니다.

3.    명령줄 도구를 사용하여 액세스 로그를 분석합니다.

Elastic Load Balancing(ELB) 액세스 로그는.gzip 형식으로 압축됩니다.

선택적 단계: 로그를 추출하려면 다음 명령을 사용합니다.

$   gzip -dr ./alblogs

예제 시나리오

target_processing_time에 대한 최대 지연 시간을 가져오려면 다음 명령을 실행합니다.

압축된 로그 파일:

$zcat *.log.gz | awk '$7 != -1' | awk 'BEGIN{a=0}{if ($7>0+a) a=$7} END{print a}'

압축되지 않은 로그 파일:

$cat *.log | awk '$7 != -1' | awk 'BEGIN{a=0}{if ($7>0+a) a=$7} END{print a}'

또는

대상당 target_processing_time이 “>=N” 초인 요청 수를 계산하려면 요구 사항에 대한 초 수로 N을 수정합니다.

압축된 로그 파일에 대한 예제 명령:

$zcat *.log.gz | awk '{if($7 >= N){print $5}}' | sort | uniq -c

압축되지 않은 로그 파일에 대한 예제 명령:

$cat *.log | awk '{if($7 >= N){print $5}}' | sort | uniq -c

출력 예시:

12 10.10.20.111:80 
12 10.10.60.163:80
254 10.10.70.7:80
6 10.10.80.109:80
20656 10.3.19.141:80

앞의 예에서 IP 주소가 10.3.19.141인 대상이 TargetResponseTime 증가의 원인인 경우가 대다수입니다. 이 경우 대상에 대한 OS(운영 체제) 및 웹 애플리케이션을 확인합니다.

백엔드 인스턴스에서 실행되는 웹 애플리케이션 종속성에 문제가 있음

대상에서 패킷 캡처를 실행하여 대상 응답의 지연을 식별합니다. 리눅스 OS의 경우 tcpdump를 사용합니다.

포트 TCP/80에서 HTTP 요청 및 응답을 포함하여 전체 수신 및 발신 POST HTTP 전송을 캡처하려면 다음을 수행합니다.

tcpdump -i any -ns 0 -A 'tcp dst port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504F5354 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x3C21444F'

포트 TCP/80에서 HTTP 요청 및 응답을 포함하여 전체 수신 및 발신 GET HTTP 전송을 캡처하려면 다음을 수행합니다.

tcpdump -i any -ns 0 -A 'tcp dst port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x3C21444F'

출력 예:

14:04:12.186593 IP 10.10.30.219.13000 > 10.10.60.10.http: Flags [P.], seq 641705534:641705793, ack 1587610435, win 106, options [nop,nop,TS val 1165674323 ecr 263805247],
    length 259: HTTP: GET / HTTP/1.1 E..7."@...I. .. < 2..P&?.>^..C...j9...... Ez.S..Y?GET / HTTP/1.1 X-Forwarded-For: 54.66.76.204 X-Forwarded-Proto: http X-Forwarded-Port: 80 Host: labalbinternet-1236602672.ap-southeast-2.elb.amazonaws.com
    X-Amzn-Trace-Id: Root=1-6254355c-15db4904726649b66a1e47d7 User-Agent: curl/7.79.1 Accept: */* ................
14:04:21.187892 IP 10.10.60.10.http > 10.10.30.219.13000: Flags [P.], seq 1:592, ack 259, win 488, options [nop,nop,TS val 263814250
    ecr 1165674323], length 591: HTTP: HTTP/1.1 200 OK E...\.@.@.l. < ...P2.^..C&?.A....qn..... ..|jEz.SHTTP/1.1 200 OK Date: Mon, 11 Apr 2022 14:04:12 GMT Server: Apache/2.4.52 () OpenSSL/1.0.2k-fips X-Powered-By: PHP/7.2.34 Upgrade: h2,h2c
    Connection: Upgrade Transfer-Encoding: chunked Content-Type: text/html; charset=UTF-8 159 PHP file name: /index.php<br> ................

참고: 앞의 예제 출력에서 GET HTTP는 14:04:12에 응답하고 대상은 14:04:21에 응답합니다. TargetResponseTime은 약 9초입니다. X-Amzn-Trace-Id: Root를 사용하여 액세스 로그에서 이 레코드를 추적할 수 있습니다.

압축된 로그 파일에 대한 예제 명령:

$zcat *.log.gz | awk '{if($20 ~ "1-6254355c-15db4904726649b66a1e47d7"){print $6,$7,$8 }}'

압축되지 않은 로그 파일에 대한 예제 명령:

$cat *.log | awk '{if($20 ~ "1-6254355c-15db4904726649b66a1e47d7"){print $6,$7,$8 }}'

출력 예시:

0.008 9.002 0.000

AWS 공식
AWS 공식업데이트됨 2년 전