如何疑難排解 Application Load Balancer TargetResponseTime 指標增加的問題?

3 分的閱讀內容
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 指標的 Sum (總和) 統計值。如果總和隨著 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 帳戶的 ID 取代 aws-account-id,並用帳戶所在的 AWS 區域取代 region

下載存取日誌後,請執行下列命令以分析日誌。

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

在先前的範例輸出中,大部分增加的 TargetResponseTime 是由 IP 位址為 10.3.19.141 的目標所導致。在此情況下,請檢查目標的作業系統 (OS) 和 Web 應用程式。

在後端執行個體上執行的 Web 應用程式相依性出現問題

若要識別目標回應的延遲情形,請在目標上執行封包擷取作業。對於 Linux 作業系統,請使用 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 官方已更新 5 個月前