¿Cómo se soluciona un aumento de la métrica TargetResponseTime correspondiente a un equilibrador de carga de aplicación?

6 minutos de lectura
0

Noté un aumento en la métrica TargetResponseTime del equilibrador de carga de aplicación. ¿Cómo se soluciona este problema?

Descripción breve

TargetResponseTime es el tiempo transcurrido, en segundos, entre el momento en que la solicitud sale del equilibrador de carga y el momento en que se recibe una respuesta del destino. Esto equivale al campo target_processing_time en los registros de acceso del Application Load Balancer.

Las posibles causas de un aumento del TargetResponseTime incluyen:

  • Los alojamientos no se encuentran en buen estado.
  • Las instancias del backend se encuentran sobrecargadas por demasiadas solicitudes.
  • Hay una alta utilización de la CPU en las instancias del backend.
  • Hay uno o varios destinos defectuosos.
  • Hay problemas con las dependencias de las aplicaciones web que se ejecutan en las instancias del backend.

Resolución

Los alojamientos no se encuentran en buen estado.

Verifique que todos los destinos del equilibrador de carga de aplicación se encuentran en buen estado. Consulte ¿Cómo se pueden solucionar los problemas y los errores de las comprobaciones de estado del equilibrador de carga de aplicación?

Las instancias del backend se encuentran sobrecargadas por demasiadas solicitudes

Verifique la estadística Suma de las métricas RequestCount y ActiveConnectionCount de Amazon CloudWatch correspondiente al Application Load Balancer. Un aumento de la suma que coincida con el aumento del TargetResponseTime puede indicar que las instancias del backend están sobrecargadas por la carga de solicitudes.

Para solucionar este problema, configure un grupo de Auto Scaling para las instancias de backend. Consulte el Tutorial: Configurar una aplicación escalada y con equilibrio de carga.

Hay una alta utilización de la CPU en las instancias del backend

Verifique la métrica CPUUtilization de CloudWatch correspondiente a las instancias del backend. Si la utilización de la CPU es alta, o hay un pico de utilización, actualice las instancias a un tipo de instancia más grande.

Hay uno o varios destinos defectuosos

Si tiene destinos defectuosos, siga estos pasos para resolver el problema:

1.    Habilite el registro de acceso para el equilibrador de carga.

2.    Descargue los registros de acceso correspondientes al intervalo de tiempo en el que TargetResponseTime es alto. Por ejemplo, para descargar los registros de acceso correspondientes al periodo comprendido entre el 01-02-2022T03:00 y el 01-02-2022T03:35 mediante 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]*"

Nota: Sustituya bucket-name por el nombre del bucket; aws-account-id por el ID de la cuenta de AWS; y, region por la región de AWS en la que se encuentra la cuenta.

3.    Utilice las herramientas de línea de comandos para analizar los registros de acceso:

Los registros de acceso de Elastic Load Balancing (ELB) están comprimidos en formato .gzip.

Paso opcional: utilice el siguiente comando para extraer los registros:

$   gzip -dr ./alblogs

Escenarios de ejemplo

Para obtener la latencia máxima para target_processing_time, ejecute el siguiente comando.

Archivo de registro comprimido:

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

Archivo de registro sin comprimir:

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

De forma alternativa, realice lo siguiente:

Para contar el número de solicitudes que tienen un target_processing_time “>=N” segundos por destino, modifique N con el número de segundos correspondiente a sus necesidades.

Ejemplo de comando para un archivo de registro comprimido:

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

Ejemplo de comando para un archivo de registro sin comprimir:

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

Salida de ejemplo:

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

En el ejemplo anterior, el destino con la dirección IP 10.3.19.141 es el responsable de la mayor parte del aumento del TargetResponseTime. En este caso, verifique el sistema operativo (OS) y la aplicación web del destino.

Existen problemas con las dependencias de las aplicaciones web que se ejecutan en las instancias del backend

Ejecute una captura de paquetes en el destino para identificar el retraso en la respuesta del destino. Para el sistema operativo Linux, utilice tcpdump.

Para capturar una transmisión completa HTTP POST entrante y saliente, incluidas la solicitud y la respuesta HTTP en el puerto 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'

Para capturar una transmisión completa HTTP GET entrante y saliente, incluidas la solicitud y la respuesta HTTP en el puerto 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'

Salidas de ejemplo:

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

Nota: En las salidas del ejemplo anterior, HTTP GET responde a las 14:04:12 y el destino responde a las 14:04:21. El TargetResponseTime es de aproximadamente 9 segundos. Puede utilizar X-Amzn-Trace-Id: Root para rastrear este registro en los registros de acceso.

Ejemplo de comando para un archivo de registro comprimido:

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

Ejemplo de comando para un archivo de registro sin comprimir:

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

Salida de ejemplo:

0.008 9.002 0.000

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años