Inyección de fallas simple usando Arthas

Tabla de contenido

 

1. Concepto

En segundo lugar, la lógica general

Tres documentos relacionados

Cuatro, práctica de inyección de fallas


1. Concepto

Arthas es un producto de diagnóstico y monitoreo en línea que puede ver la carga de la aplicación, la memoria, el gc y la información del estado del hilo en tiempo real desde una perspectiva global, y puede diagnosticar problemas comerciales sin modificar el código de la aplicación, incluida la visualización de llamadas a métodos. La supervisión de la ejecución del método consume mucho tiempo, la información de carga de clases, etc., mejora en gran medida la eficiencia de la resolución de problemas en línea.

En segundo lugar, la lógica general

 La lógica general de Arthas también se implementa sobre la Instrumentationbase de Java  . Todas las clases cargadas serán cargadas por el Agente. addTransformerDespués de pasar , serán mejoradas, y luego se Adviceentrelazarán las correspondientes. La búsqueda de clases y métodos son todas las pasadas SearchUtilrealizadas por Instrumentel loadAllClassmétodo todas las clases cargadas de JVM coinciden por nombre, se devolverá el mismo.

Tres documentos relacionados

Inicio rápido

Uso avanzado

Cuatro, práctica de inyección de fallas

Con la premisa de garantizar la estabilidad de su propio servicio, para simular la situación anormal del servicio de invocación remota, se utiliza el método del código de servicio en línea de actualización en caliente de Arthas para realizar la inyección de fallas.


1. Descarga Arthas al servidor

curl -o /tmp/arthas-boot.jar https://arthas.aliyun.com/arthas-boot.jar


2. Obtenga el número de proceso del servicio

ps -ef | grep 服务名

3. Utilice Arthas adjunto al servicio

/home/work/bin/服务名/java/bin/java -jar /tmp/arthas-boot.jar

4. Ingrese el número antes del número de proceso de servicio y presione Enter para ingresar a la interfaz de operación de arthas


5. En la interfaz de Arthas, use el comando sc y el parámetro -d para especificar el nombre completo para encontrar la información relevante de la clase Demo y obtener el valor Hash correspondiente al ClassLoader de la clase Demo cargada

sc -d com.***.Demo | grep classLoaderHash | head -n1

6. Compile el archivo Demo.java. Puede cargar el código modificado por adelantado, usar el comando mc en la interfaz de Arthas para compilar la clase Demo y usar el parámetro -c para especificar el valor hash del ClassLoader obtenido en el paso (parámetro -d directorio de salida para archivos compilados)

$ mc -c hash值 /tmp/服务名/Demo.java -d /tmp/服务名

7. Después de obtener el archivo Demo.class compilado (puede haber un archivo de clase Demo $ 1 anónimo, si no se modifica la lógica de la clase anónima, no se requiere actualización en caliente), puede usar el comando retrasform para actualizar el código en caliente. (la ruta del archivo de clase es / Tmp / service name / com / *** / Demo.class de salida en el paso anterior).

$ retransform /tmp/服务名/com/***/Demo.class

8. Verifique cuántas clases cargadas en caliente y actualizadas hay. La misma es la identificación agregada. Después de la eliminación, se ejecuta de acuerdo con la identificación más grande, que es el reemplazo más reciente.

retransform -l 

9. Una vez finalizada la práctica, use el comando retransform para deshacer la actualización.

retransform --deleteAll

10. Nota: Después de la cancelación, el valor predeterminado no se restaura. Todavía hay una salida de registro especialmente agregada, y jad sigue siendo la versión afectada. Si desea mostrar la versión anterior para que surta efecto, debe ejecutar el siguiente comando para restaurarlo completamente.

retransform --classPattern com.***.Demo

11. Salir de arthas

如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。

如果想完全退出arthas,可以执行stop命令。

12. Nota: Cuando cierre la sesión y vuelva a ingresar a la interfaz de operación de arthas a través de comandos, si se informa un error de ocupación del puerto de arthas 3658

[ERROR] The telnet port 3658 is used by process 2822 instead of target process 6062, you will connect to an unexpected process.
[ERROR] 1. Try to restart arthas-boot, select process 2822, shutdown it first with running the 'stop' command.
[ERROR] 2. Or try to stop the existing arthas instance: java -jar arthas-client.jar 127.0.0.1 3658 -c "stop"
[ERROR] 3. Or try to use different telnet port, for example: java -jar arthas-boot.jar --telnet-port 9998 --http-port -1

13. De acuerdo con el indicador, ejecute el comando para ingresar normalmente. Si usa arthas para probar múltiples servicios al mismo tiempo en una máquina, puede usar diferentes números de puerto telnet:

/home/work/bin/服务名/java/bin/java -jar /tmp/arthas-boot.jar --telnet-port 9998 --http-port -1

 

Supongo que te gusta

Origin blog.csdn.net/xiao__jia__jia/article/details/114944434
Recomendado
Clasificación