내용으로 건너뛰기

Application Load Balancer에 대한 TargetResponseTime 지표가 증가하는 문제를 어떻게 해결합니까?

4분 분량
0

Application Load Balancer TargetResponseTime 지표가 증가하는 문제를 해결하고 싶습니다.

해결 방법

TargetResponseTime은 Application Load Balancer 액세스 로그의 target_processing_time 필드와 동일합니다.

다음과 같은 문제로 인해 TargetResponseTime 지표가 증가할 수 있습니다.

호스트가 비정상

비정상 Application Load Balancer 대상의 문제를 해결하려면 Application Load Balancer의 상태 확인 실패 문제를 어떻게 해결합니까?를 참조하십시오.

백엔드 인스턴스가 너무 많은 요청으로 인해 과부하 상태임

Application Load Balancer에 대한 RequestCountActiveConnectionCount Amazon CloudWatch 지표의 합계 통계를 확인합니다. TargetResponseTime이 늘어나 합계가 증가하면 너무 많은 요청으로 인해 백엔드 인스턴스에 과부하가 발생할 수 있습니다.

이 문제를 해결하려면 백엔드 인스턴스에 Auto Scaling 그룹을 구성하십시오. 자세한 내용은 자습서: 확장 및 로드 밸런싱된 애플리케이션 설정을 참조하십시오.

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

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

대상에 결함이 있음

대상에 결함이 있는 경우 다음 단계를 완료하십시오.

  1. 로드 밸런서의 액세스 로그를 활성화합니다.
  2. TargetResponseTime이 높은 시간 범위에 대한 액세스 로그를 다운로드합니다. 예를 들어, 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 리전으로 바꾸십시오.

액세스 로그를 다운로드한 후 다음 명령을 실행하여 로그를 분석합니다.

ELB 액세스 로그

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)와 웹 애플리케이션을 확인합니다.

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

대상 응답의 지연을 파악하려면 대상에서 패킷 캡처를 실행합니다. Linux 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 공식업데이트됨 2년 전