Passer au contenu

Comment puis-je résoudre le problème d'une augmentation de la métrique TargetResponseTime pour un Application Load Balancer ?

Lecture de 5 minute(s)
0

Je souhaite résoudre un problème lié à l'augmentation de la métrique TargetResponseTime pour l’Application Load Balancer.

Résolution

TargetResponseTime est équivalent au champ target_processing_time dans les journaux d'accès à l'Application Load Balancer.

Les problèmes suivants peuvent entraîner une augmentation de la métrique TargetResponseTime.

Les hôtes sont non sains

Pour résoudre les problèmes liés aux cibles de l'Application Load Balancer non saines, consultez la section Comment puis-je résoudre les problèmes liés à l'échec des surveillances de l’état des Application Load Balancers ?

Les instances de backend sont submergées par un trop grand nombre de requêtes

Vérifiez la statistique Somme des métriques Amazon CloudWatch RequestCount et ActiveConnectionCount pour votre Application Load Balancer. Si la somme augmente avec l'augmentation de TargetResponseTime, un trop grand nombre de requêtes risque de surcharger les instances de backend.

Pour résoudre ce problème, configurez un groupe Auto Scaling pour vos instances de backend. Pour plus d'informations, consultez la section Didacticiel : Configurer une application mise à l’échelle et à charge équilibrée.

L'utilisation du processeur sur les instances de backend est élevée

Vérifiez les métriques CloudWatch CPUUtilization pour vos instances de backend. Si l'utilisation du processeur est élevée ou s'il y a un pic d'utilisation, mettez à niveau vos instances vers un type d'instance plus important.

Une cible est défectueuse

Si vous rencontrez des cibles défectueuses, procédez comme suit :

  1. Activez les journaux d'accès pour votre équilibreur de charge.
  2. Téléchargez les journaux d'accès pour la période pendant laquelle TargetResponseTime est élevé. Par exemple, pour télécharger les journaux d'accès entre le 01/02/22T 03:00 et le 01-02-22T 03:35, exécutez la commande suivante :
    aws s3 cp s3://bucket-name[/prefix]/AWSLogs/aws-account-id/elasticloadbalancing/region/2022/02/01/ ./alblogs --recursive --exclude "*" --include "*20220201T03[0123]*"
    Remarque : Remplacez bucket-name par le nom de votre compartiment, aws-account-id par l'ID de votre compte AWS et region par la région AWS dans laquelle se trouve votre compte.

Après avoir téléchargé les journaux d'accès, exécutez les commandes suivantes pour les analyser.

Journaux d'accès ELB

Les journaux d'accès Elastic Load Balancing (ELB) sont compressés au format .gzip. Pour extraire les journaux, exécutez la commande suivante :

gzip -dr ./alblogs

Latence maximale

Pour obtenir la latence maximale pour la cible target_processing_time, exécutez l'une des commandes suivantes.

Fichier journal compressé :

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

Fichier journal non compressé :

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

Comptabilisez le nombre de requêtes

Pour comptabiliser le nombre de requêtes dont la cible target_processing_time « >=N » secondes par cible, modifiez N en fonction du nombre de secondes correspondant à vos exigences. Exécutez l'une des commandes suivantes.

Fichier journal compressé :

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

Fichier journal non compressé :

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

Exemple de sortie :

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

Dans l'exemple de sortie précédent, la cible dont l'adresse IP est 10.3.19.141 est responsable de la majeure partie de l'augmentation de TargetResponseTime. Dans ce cas, vérifiez le système d'exploitation et l'application Web de la cible.

Il existe des problèmes liés aux dépendances des applications Web qui s'exécutent sur les instances de backend

Pour identifier le délai de réponse cible, exécutez une capture de paquets sur la cible. Pour le système d'exploitation Linux, utilisez tcpdump.

Pour capturer une transmission HTTP POST entrante et sortante complète incluant la requête HTTP et la réponse sur le port TCP/80, exécutez la commande suivante :

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'

Pour capturer une transmission HTTP GET entrante et sortante complète incluant la requête HTTP et la réponse sur le port TCP/80, exécutez la commande suivante :

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'

Exemples de sortie :

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> ................

Remarque : Dans l'exemple de sortie précédent, le HTTP GET répond à 14:04:12 et la cible répond à 14:04:21. Le TargetResponseTime est d'environ 9 secondes. Pour suivre l'enregistrement dans les journaux d'accès, utilisez X-Amzn-Trace-Id: Racine.

Pour un fichier journal compressé, exécutez la commande suivante :

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

Pour un fichier journal décompressé, exécutez la commande suivante :

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

Exemple de sortie :

0.008 9.002 0.000
AWS OFFICIELA mis à jour il y a 2 ans