跳至内容

如何对应用程序负载均衡器的 TargetResponseTime 指标增加进行故障排除?

3 分钟阅读
0

我想对应用程序负载均衡器的 TargetResponseTime 指标增加进行故障排除。

解决方法

TargetResponseTime 等同于应用程序负载均衡器访问日志中的 target_processing_time 字段。

以下问题可能会导致 TargetResponseTime 指标增加。

主机运行不正常

要解决运行不正常的应用程序负载均衡器目标,请参阅如何对应用程序负载均衡器的运行状况检查失败进行故障排除?

请求过多导致后端实例不堪重负

查看您的应用程序负载均衡器的 Amazon CloudWatch 指标 RequestCountActiveConnectionCount总和统计数据。如果总和随着 TargetResponseTime 的增加而增加,则过多请求可能会导致后端实例不堪重负。

要解决此问题,请为您的后端实例配置自动扩缩组。有关详细信息,请参阅 Tutorial: Set up a scaled and load-balanced application(教程:设置经过扩展和负载均衡的应用程序)。

后端实例上的 CPU 利用率高

检查后端实例的 CloudWatch 指标 CPUUtilization。如果 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 访问日志

弹性负载均衡 (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

在前面的输出示例中,TargetResponseTime 增加的主要原因来自 IP 地址为 10.3.19.141 的目标。在这种情况下,请检查该目标的操作系统 (OS) 和 Web 应用程序。

在后端实例上运行的 Web 应用程序依赖关系存在问题

要确定目标响应的延迟,请在目标上运行数据包捕获。对于 Linux 操作系统,请使用 tcpdump

要捕获完整的传入和传出 POST HTTP 传输(包括端口 TCP/80 上的 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'

要捕获完整的传入和传出 GET HTTP 传输(包括端口 TCP/80 上的 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 年前