Comment puis-je résoudre les problèmes liés à une augmentation de la métrique TargetResponseTime pour Application Load Balancer ?

Dernière mise à jour : 14/07/2022

J'ai remarqué une augmentation de la métrique TargetResponseTime d'Application Load Balancer. Comment puis-je résoudre ce problème ?

Brève description

TargetResponseTime est le temps écoulé, en secondes, entre le moment où la demande quitte l'équilibreur de charge et celui où une réponse de cible est reçue. Ceci est équivalent au champ target_processing_time dans les journaux d'accès d'Application Load Balancer.

Les causes possibles d'une augmentation de TargetResponseTime sont les suivantes :

  • Les hôtes ne sont pas en bon état.
  • Les instances backend reçoivent un trop grand nombre de requêtes.
  • Il y a une utilisation élevée du CPU sur les instances backend.
  • Une ou plusieurs cibles sont défectueuses.
  • Il y a des problèmes liés aux dépendances d'applications Web exécutées sur les instances backend.

Résolution

Les hôtes ne sont pas en bon état

Vérifiez que toutes les cibles d'Application Load Balancer sont en bon état. Reportez-vous à Comment puis-je résoudre les problèmes de surveillance de l'état pour Application Load Balancers ?

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

Vérifiez la statistique Sum (Somme) des métriques Amazon CloudWatch RequestCount et ActiveConnectionCount pour votre Application Load Balancer. Une augmentation de somme qui coïncide avec l'augmentation de TargetResponseTime peut indiquer que les instances backend sont surchargées par la charge de requête.

Pour résoudre ce problème, configurez un groupe Auto Scaling pour vos instances backend. Reportez-vous à Tutoriel : configurer une application mise à l'échelle et à charge équilibrée.

Il y a une utilisation élevée du CPU sur les instances backend

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

Une ou plusieurs cibles sont défectueuses

Si vous rencontrez des cibles défectueuses, suivez ces étapes pour résoudre le problème :

1.    Activez la journalisation des 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 2022-02-01T03:00 et 2022-02-01T03:35 à l'aide d'AWS Command Line Interface (AWS CLI) :

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.

3.    Utilisez les outils de ligne de commande pour analyser les journaux d'accès :

Les journaux d'accès Elastic Load Balancing (ELB) sont compressés au format .gzip.

Étape facultative : pour extraire les journaux, utilisez la commande suivante :

$   gzip -dr ./alblogs

Exemples de scénarios

Pour obtenir la latence maximale pour target_processing_time, exécutez la commande suivante.

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}'

-ou-

Pour compter le nombre de requêtes ayant un target_processing_time « >=N » secondes par cible, modifiez N avec le nombre de secondes correspondant à vos besoins.

Exemple de commande pour un fichier journal compressé :

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

Exemple de commande pour un 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 précédent, la cible avec l'adresse IP 10.3.19.141 compte pour la plus grande partie de l'augmentation de TargetResponseTime. Dans ce cas, vérifiez le système d'exploitation (SE) et l'application Web de la cible.

Il y a des problèmes avec les dépendances d'applications Web exécutées sur les instances backend

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

Pour capturer une transmission HTTP POST entrante et sortante complète, y compris la requête et la réponse HTTP sur le port TCP/80 :

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, y compris la requête et la réponse HTTP sur le port TCP/80 :

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 sorties :

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, GET HTTP répond à 14:04:12 et la cible répond à 14:04:21. Le TargetResponseTime est d'environ 9 secondes. Vous pouvez utiliser X-Amzn-Trace-Id: Root pour retrouver ce registre dans les journaux d'accès.

Exemple de commande pour un fichier journal compressé :

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

Exemple de commande pour un fichier journal non compressé :

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

Exemple de sortie :

0.008 9.002 0.000

Cet article vous a-t-il été utile ?


Avez-vous besoin d'aide pour une question technique ou de facturation ?