¿Cómo solucionar problemas de la CPU?

El diagnóstico y la resolución de problemas de la CPU en producción que también se encuentran en el entorno de la nube pueden volverse complicados y tediosos. Su aplicación puede tener millones de líneas de código, tratar de identificar la línea exacta de código que está causando que la CPU se dispare, podría ser equivalente a encontrar una aguja en el pajar. En este artículo, aprendamos cómo encontrar esa aguja (es decir, la línea de código de CPU) en cuestión de segundos/minutos.

Para ayudar a los lectores a comprender mejor esta técnica de solución de problemas, creamos una aplicación de muestra y la implementamos en la instancia de AWSEC2. Una vez que se lanzó esta aplicación, provocó que el consumo de CPU aumentara hasta un 199,1 %. Ahora vamos a guiarlo a través de los pasos que seguimos mientras resolvíamos este problema. Básicamente, hay 3 pasos simples:

  1. Identificar subprocesos que consumen CPU
  2. Capturar volcados de subprocesos
  3. Identifique las líneas de código que están causando que la CPU se dispare

1. Identifique los subprocesos que están causando picos en la CPU

En la instancia EC2, podrían estar ejecutándose varios procesos. El primer paso es identificar el proceso que está causando que la CPU se dispare. La mejor manera de hacerlo es usar el comando ‘TOP’ que está presente en * nixflavor de los sistemas operativos.

Ejecute el comando ‘arriba’ desde la consola

$ top

Este comando mostrará todos los procesos que se ejecutan en la instancia EC2 ordenados por procesos que consumen mucha CPU que se muestran en la parte superior. Cuando emitimos el comando en la instancia EC2, vimos el siguiente resultado:

arriba-v1.PNG

Fig: comando ‘superior’ emitido desde una instancia de AWS EC2

Desde la salida, puede notar que el proceso # 31294 consume el 199.1% de la CPU. Es un consumo bastante alto. Bien, ahora hemos identificado el proceso en la instancia EC2 que está causando que la CPU se dispare. El siguiente paso es identificar los subprocesos en este proceso que están causando que la CPU se dispare.

Ejecute el comando ‘top -H -p {pid}’ desde la consola. Ejemplo

$ top -H -p 31294

Este comando mostrará todos los subprocesos que están causando que la CPU se dispare en este proceso 31294 en particular. Cuando emitimos este comando en la instancia EC2, vimos el siguiente resultado:

arriba-v2.PNG

Fig: comando ‘top -H -p {pid}’ emitido desde una instancia de AWS EC2

De la salida se puede notar:

1. Id. de subproceso 31306 que consume el 69,3 % de la CPU
2. Id. de subproceso 31307 que consume el 65,6 % de la CPU
3. Id. de subproceso 31308 que consume el 64,0 % de la CPU
4.Todos los demás subprocesos restantes consumen una cantidad insignificante de CPU.

Este es un buen paso adelante, ya que hemos identificado los subprocesos que están causando picos en la CPU. Como siguiente paso, necesitamos capturar volcados de subprocesos para que podamos identificar las líneas de código que están causando que la CPU se dispare.

2. Capturar volcados de subprocesos

Un volcado de subprocesos es una instantánea de todos los subprocesos que están presentes en la aplicación. El estado del subproceso, el seguimiento de la pila (es decir, la ruta del código que el subproceso está ejecutando), la información relacionada con la identificación del subproceso de cada subproceso en la aplicación se informa en el volcado del subproceso.

Existen 8 opciones diferentes para capturar volcados de subprocesos. Puedes elegir la opción que más te convenga. Una de las opciones más sencillas para realizar un volcado de subprocesos es utilizar la herramienta ‘jstack’ que se incluye en JDK. Esta herramienta se puede encontrar en la carpeta $JAVA_HOME/bin. A continuación se muestra el comando para capturar el volcado de subprocesos:

jstack -l  {pid} > {file-path} 

dónde

pid: es el ID de proceso de la aplicación, cuyo volcado de subprocesos debe capturarse

file-path: es la ruta del archivo donde se escribirá el volcado de subprocesos.

Ejemplo:

jstack-l 31294 > /opt/tmp/threadDump.txt 

Según el ejemplo, el volcado de subprocesos del proceso se generaría en el archivo /opt/tmp/threadDump.txt.

  1. Identifique las líneas de código que están causando que la CPU se dispare
    El siguiente paso es analizar el volcado de subprocesos para identificar las líneas de código que están causando que la CPU se dispare. Recomendamos analizar los volcados de subprocesos a través de fastThread, una herramienta gratuita de análisis de volcados de subprocesos en línea.

Ahora subimos el volcado de subprocesos capturados a la herramienta fastThread. La herramienta generó esto hermoso reportaje visual. El informe tiene varias secciones. En la esquina superior derecha del informe, hay un cuadro de búsqueda. Allí ingresamos los ID de los subprocesos que consumían mucha CPU. Básicamente, los identificadores de subprocesos que identificamos en el paso n.º 1, es decir, ‘31306,31307, 31308’.

La herramienta fastThread mostró el seguimiento de la pila de estos 3 subprocesos como se muestra a continuación.

fastthread-search.PNG

Fig: herramienta fastThread que muestra un hilo que consume CPU

Puede notar que los 3 subprocesos están en estado EJECUTABLE y ejecutan esta línea de código:

 com.buggyapp.cpuspike.Object1.execute(Object1.java:13) 

Aparentemente, el siguiente es el código fuente de la aplicación.

1: package com.buggyapp.cpuspike;
2:
3: /**
4: * 
5: * @author Test User
6: */
7: public class Object1 {
8:	
9:	public static void execute() {
10:		
11:		while (true) {
12:		
13:			doSomething();
14:		}		
15:	}
16:	
17:	public static void doSomething() {
18:		
19:	}
20: } 

Puede ver que la línea #13 en object1.java es ‘hacerAlgo();’. Puede ver que el método ‘doSomething ()’ no hace nada, pero se invoca una cantidad infinita de veces debido a que no termina el ciclo while en línea # 11. Si un subproceso comienza en un número infinito de veces, entonces la CPU comenzará a aumentar Eso es exactamente lo que sucede en este programa de muestra. Si se soluciona el bucle sin terminación en la línea n.º 11, este problema de aumento de la CPU desaparecerá.

Conclusión

Para resumir, primero debemos usar la herramienta ‘TOP’ para identificar las identificaciones de subprocesos que están causando el aumento de la CPU, luego debemos capturar los volcados de subprocesos, el siguiente paso es analizar los volcados de subprocesos para identificar las líneas exactas de código que están causando la CPU. para subir. ¡Disfruta de la resolución de problemas, feliz pirateo!

Biografía del autor:

Ram Lakshmanán

Todos los días, millones y millones de personas en América del Norte (bancos, viajes y comercio) usan las aplicaciones que Ram Lakshmanan ha diseñado. Ram es un orador aclamado en las principales conferencias sobre temas de escalabilidad, disponibilidad y rendimiento. Recientemente, ha fundado una startup, que se especializa en solución de problemas de rendimiento

Similar Posts

Leave a Reply

Your email address will not be published.