Desarrollo y diseño eficientes: mejora de la eficiencia operativa y la productividad de las aplicaciones Spring | Equipo técnico de JD Cloud

introducción

Situación actual y antecedentes.

El marco Spring es uno de los marcos de desarrollo Java más utilizados y proporciona funciones potentes y flexibilidad, pero en aplicaciones grandes, el tiempo de inicio y el rendimiento de la aplicación pueden verse afectados debido a la complejidad y las dependencias del marco Spring. Esto puede provocar lentitud en el proceso de desarrollo e ineficiencias en el desarrollo. Optimizar la velocidad de inicio y el rendimiento de las aplicaciones Spring es una tarea importante. Al analizar y optimizar el proceso de inicialización de la aplicación, reducir las dependencias innecesarias y la carga de componentes, y utilizar la inicialización asincrónica, la carga diferida y otras tecnologías, el inicio de la aplicación puede ser rendimiento significativamente mejorado. Esto ayudará a los desarrolladores a mejorar la eficiencia del desarrollo, reducir el tiempo de depuración y brindar una mejor experiencia de usuario.

Los paquetes jar comerciales en línea son generalmente relativamente grandes, un paquete jar pesa cientos de megabytes y el tiempo de inicio es del orden de 10 minutos, lo que ralentiza nuestra respuesta a una rápida expansión en caso de falla y la eficiencia del desarrollo local y depuración. Así que hice un análisis para ver por qué el inicio del programa Spring es lento y cómo optimizarlo. El efecto actual es que el tiempo de inicio de la mayoría de las aplicaciones grandes se puede acortar entre un 70% y un 80%.

Incluye principalmente los siguientes contenidos.

  • SpringBean carga el análisis visual de la línea de tiempo que requiere mucho tiempo (✅)
  • Análisis de dependencia visual de SpringBean (✅)
  • Aplicar paquete de tarro descargado (Tarro adelgazante) (✅)
  • Gráfico de llama del reloj de pared del hilo del proceso de inicio de la aplicación (✅)

importancia e impacto

Eficiencia de desarrollo mejorada : una velocidad de inicio de aplicaciones más rápida puede reducir significativamente el tiempo de desarrollo y depuración. Los desarrolladores pueden iniciar aplicaciones más rápido, realizar pruebas funcionales y depuración, aumentando así la eficiencia del desarrollo y la velocidad de iteración.
Eficiencia de implementación y expansión mejorada : optimizar la velocidad de inicio puede reducir el tiempo y el costo de implementar y expandir aplicaciones. Las aplicaciones de inicio rápido pueden responder más rápidamente a los cambios de carga, mejorando la escalabilidad y la resiliencia del sistema.
Optimización de la utilización de recursos : al reducir el tiempo de inicialización y optimizar la carga de recursos, se puede reducir el uso de memoria y CPU de la aplicación. Esto ayuda a mejorar la utilización del servidor y reduce el costo de ejecutar aplicaciones.

herramienta de análisis

  •  Arthas : Arthas es una herramienta de diagnóstico Java de código abierto que puede monitorear y diagnosticar aplicaciones Java en tiempo real. Proporciona un amplio conjunto de comandos y funciones para analizar problemas de rendimiento de las aplicaciones, incluido el consumo de recursos y los tiempos de carga durante el inicio.
  •  JVM Sandbox : JVM Sandbox es una tecnología basada en Java Security Manager que se utiliza para aislar y restringir el acceso a aplicaciones Java. Puede ayudar a reducir el consumo de recursos y el tiempo de carga al inicio y mejorar la velocidad de inicio de la aplicación.
  •  Async Profiler : Async Profiler es una herramienta de creación de perfiles de rendimiento Java asincrónica de baja sobrecarga para recopilar y analizar datos de rendimiento de aplicaciones. Puede ayudarle a identificar cuellos de botella en el rendimiento durante el inicio y otros problemas que afectan la velocidad de inicio.
  •  Aceleración de inicio: método de inicialización asincrónica : El método de inicialización asincrónica es una tecnología de aceleración de inicio que puede reducir el tiempo de inicio y mejorar la capacidad de respuesta de la aplicación al ejecutar algunas tareas de inicialización de forma asincrónica. Esto se puede lograr mediante el uso de grupos de subprocesos, marcos asíncronos o anotaciones asíncronas.
  •  Informe de inicio de Spring Boot : Spring Boot Startup Report es una herramienta para generar informes de inicio de aplicaciones Spring Boot. Puede proporcionar información detallada del proceso de inicio, incluido el tiempo de carga de cada bean, el tiempo necesario para la configuración automática, etc., para ayudarlo a analizar y optimizar el proceso de inicio.
  • Jaeger UI : Jaeger UI es una herramienta para visualizar y analizar datos de seguimiento distribuidos. Al utilizar la interfaz de usuario de Jaeger, puede monitorear y analizar el proceso de inicio de su aplicación e identificar posibles problemas de rendimiento y cuellos de botella.
  •  Spring Startup Analyzer : Spring Startup Analyzer es una herramienta que se utiliza para recopilar datos del proceso de inicio de la aplicación Spring y generar informes de análisis interactivos. Su objetivo es ayudar a analizar los puntos de bloqueo de inicio de las aplicaciones Spring y admitir la inicialización asincrónica de Spring Beans para reducir y optimizar el tiempo de inicio de las aplicaciones Spring. La herramienta admite la ejecución en sistemas operativos Linux, Mac y Windows e implementa su interfaz de usuario con referencia a spring-boot-startup-report. Con Spring Startup Analyzer, puede recopilar datos del proceso de inicio de la aplicación y generar informes HTML visuales. Este informe puede ayudarlo a analizar el rendimiento inicial de su aplicación Spring e identificar posibles oportunidades de optimización.

Solución de optimización Spring Startup Analyzer

Con la ayuda de las capacidades del analizador de inicio de Spring, tomamos el proyecto ARK de la línea de negocios como ejemplo para realizar una investigación en profundidad sobre cómo optimizar y mejorar la eficiencia del proceso de inicio de los proyectos Spring. Primero observemos la situación básica de inicio de ARK:

Descripción general del inicio

  •  Hora(s) de inicio: hora de inicio
  •  Num of Bean: Número de beans inicializados
  •  Frascos usados/total: Número/cantidad total de frascos utilizados
  •  Tarros sin usar/total: Número/cantidad total de tarros sin usar
  •  ClassLoader Count: número de cargadores de clases

Detalles de inicialización de Spring Bean

  •  Nombre: El nombre de primer nivel corresponde al nombre del Bean.
  •  Duración con hijos (ms): tiempo de carga de referencia del frijol
  •  Duración (ms): el tiempo de carga del propio Bean.
  •  Detalle: Contiene información sobre el cargador de clases y el subproceso para cargar el Bean (habrá varios diferentes si se carga de forma asincrónica)



SpringBean carga el análisis visual de la línea de tiempo que requiere mucho tiempo

Este elemento de observación se puede profundizar hasta el último nivel de la referencia de Bean y puede ver el tiempo de carga de cada nivel.



Gráfico de llama de reloj de pared de hilo de proceso de inicio de aplicación

Cómo entender los gráficos de llamas

 

El eje y representa la pila de llamadas, siendo cada nivel una función. Cuanto más profunda es la pila de llamadas, más alta es la llama, con la función que se ejecuta en la parte superior y su función principal debajo.

El eje x representa el número de muestras, si una función ocupa un ancho mayor en el eje x, significa que ha sido muestreada más veces, es decir, tarda más en ejecutarse. Tenga en cuenta que el eje x no representa el tiempo, pero todas las pilas de llamadas se fusionaron y organizaron en orden alfabético.

El gráfico de llama sirve para ver qué función de nivel superior ocupa el ancho más grande. Siempre que hay una "meseta", significa que la función puede tener problemas de rendimiento.

El color no tiene un significado especial, porque el gráfico de llama representa la actividad de la CPU, por lo que generalmente se eligen colores cálidos.

Descripción general del gráfico de llamas

Como se puede observar en el diagrama general, hay tres funciones de entrada que ocupan un porcentaje mayor, veamos cada una de ellas a continuación.



Imagen parcial de llama 1

Se puede ver en esta parte del gráfico de llama que Springfox realiza muchas inicializaciones durante el proceso de inicio, lo que lleva mucho tiempo. Para proyectos que no necesitan esta función, puede eliminarla directamente.



Imagen parcial de llama 2

Comprender el proceso de inicialización de los frijoles primaverales.

Como puede verse en esta imagen, el proceso de creación de beans también lleva mucho tiempo.



Imagen de la parte de llama 3

Como puede verse en esta figura, registrar BeanPostProcessor también lleva mucho tiempo.



Aplicar paquete de frasco descargado (Tarro adelgazante)

Este elemento de observación puede recopilar paquetes Jar que no se utilizan después de que se inicia el proyecto.



Efectos de implementación y optimización.

Pasos de operación y elementos de configuración.

Instalar el analizador de inicio de primavera

Instalación manual

1. Haga clic en Liberar para descargar la última versión del paquete tar.gz.
2. Crea una nueva carpeta y descomprímela.

Para sistemas Linux/Mac, puede considerar usar los siguientes comandos:

mkdir -p ${HOME}/spring-startup-analyzercd 下载路径
tar -zxvf spring-startup-analyzer.tar.gz -C 安装路径/spring-startup-analyzer

Instalación de scripts (linux/mac)

curl -sS https://raw.githubusercontent.com/linyimin0812/spring-startup-analyzer/main/bin/install.sh | sh

Ruta de instalación predeterminada del script:$HOME/spring-startup-analyzer

Lanzamiento de la aplicación

spring-startup-analyzer se inicia como agente, así que simplemente agregue parámetros al comando de inicio .-javaagent:安装路径/spring-startup-analyzer/lib/spring-profiler-agent.jar

  •  Para iniciar la aplicación usando la línea de comando de Java, agregue parámetros a la línea de comando, por ejemplo:
java -javaagent:/Users/runner/spring-startup-analyzer/lib/spring-profiler-agent.jar \
    -Dproject.name=mac-demo \
    -Dspring-startup-analyzer.admin.http.server.port=8066 \
    -jar /Users/runner/spring-startup-analyzer/ARK.jar

  •  Para comenzar en IDEA, debe agregar:



Ruta del archivo de registro:安装路径/spring-startup-analyzer/logs

  •  startup.log: registro durante el inicio
  •  transform.log: información de clase/método retransformada

Una vez iniciada la aplicación, se generará en la consola y en los archivos startup.log . Puede utilizar esta salida para determinar si la colección está completa.======= spring-startup-analyzer finished, click http://localhost:xxxx to visit details. ======

Mejoras en el tiempo de inicio y el rendimiento

Antes de la optimización

El tiempo de inicio promedio del prelanzamiento es de 10 minutos y no se puede iniciar localmente. Cada requisito debe enviarse al entorno de prelanzamiento para su verificación. El ciclo de desarrollo y lanzamiento es relativamente largo y la cantidad de bibliotecas de producción conectadas. al entorno previo al lanzamiento no se puede aumentar arbitrariamente. El proyecto hace referencia a 585 frascos, de los cuales 337 frascos no se utilizan.



Análisis de frijol lento

Del análisis, podemos ver que las interfaces en la parte superior de la clasificación que consumen mucho tiempo son todas cargas relacionadas con jsf, y también hay un bean relacionado con es.

Ruta de la función: Detalles de la invocación del método --> AbstractAutowireCapableBeanFactory.createBean



optimización de inicio jsf

Nota: La "Dirección del centro de registro" en index="Dirección del centro de registro" se ha hecho anónima. Verifique la configuración en su propio código en el escenario específico.

Cuando se inicia el centro de registro del productor jsf, extraerá un lote de IP e intentará registrar jsf constantemente. En el entorno de oficina, estas IP son inaccesibles, lo que provoca que se reintente el proceso de inicio.

    <!-- 预发、生产的注册中心 -->
    <jsf:registry id="jsfRegistry" protocol="jsfRegistry" index="注册中心地址"/>

Agregue la configuración de host de la dirección de publicación jsf en el host local. Reemplace el siguiente *.*.*.* con el suyo propio cuando lo use. Puede realizar una prueba de ping. Dirección del centro de registro para obtener. Reemplace "dirección del centro de registro" con la dirección después del índice anterior

*.*.*.* 注册中心地址 

Inicie el proyecto nuevamente, la duración alcanza los 185 segundos.



Habilitar la carga diferida de Bean

Inicialice ES Bean para carga diferida y habilite la carga diferida global. La duración alcanza los 131 segundos;

Carga diferida global:

1. Dependiendo de la versión de Spring, la forma de habilitar la carga diferida global puede ser diferente.

2. No se recomienda habilitar la carga diferida global en el entorno de producción, porque básicamente nuestros servicios se implementan en k8. Es posible que cuando el servicio se esté escalando y el tráfico sea grande, el servicio se inicie correctamente debido a la carga diferida. configuración., volverá al estado listo del servicio de contenedor acoplable, lo que provocará que k8s asigne tráfico al servicio, lo que provocará problemas inesperados.



Tarro adelgazante

Los paquetes Jar que no son utilizados por la aplicación se pueden eliminar cuidadosamente. Al eliminarlos uno por uno, cada paquete debe compilarse e iniciarse repetidamente para verificar si afectará el proyecto. Este es un proceso continuo y de largo plazo. No solo es beneficioso para el tiempo de inicio, sino que obviamente mejora la eficiencia de la compilación, lo que reduce una gran cantidad del proceso de copia de Jar.



efecto final

Después de completar la optimización anterior:

  •  Los proyectos se pueden iniciar y depurar localmente, lo que mejora enormemente la eficiencia para los desarrolladores.
  •  Una vez optimizada la versión preliminar con esta solución, se puede acortar el tiempo de compilación y publicación del proyecto, lo que mejora en gran medida los requisitos de iteración y verificación rápida.
  •  La eficiencia general de inicio aumenta entre un 70% y un 80%.
  •  En las computadoras con chip Intel, la velocidad de inicio es de 2min11s.
  •  En computadoras con chips m1, la velocidad será más rápida y el tiempo de arranque rondará los 90 segundos.
  •  Con esta idea, la mayoría de los proyectos Spring y Spring Boot se pueden optimizar. Se recomienda realizar una ronda de este tipo de solución de problemas y optimización con regularidad.

Optimice los puntos y métodos clave

  •  Retire los paquetes de frascos no utilizados : localice los paquetes de frascos no utilizados. Al analizar y organizar las dependencias del proyecto, estos paquetes jar no utilizados se pueden eliminar de la aplicación, lo que reduce la compilación, el tiempo de inicio y el consumo de recursos.
  •  Optimice la inicialización lenta de beans : busque beans que tarden mucho en iniciarse. Puede considerar optimizar estas interfaces y beans, como el uso de carga retrasada o carga asincrónica, para reducir el tiempo de inicio.
  •  Cancelar publicación innecesaria : para el entorno de desarrollo local, si no necesita publicar la interfaz jsf, puede cancelar la publicación de esta parte localmente para ahorrar tiempo de inicio.
  •  Activar la carga diferida global : al activar la carga diferida global, puede retrasar la carga de algunos componentes y recursos innecesarios, reduciendo así el tiempo de inicio. Asegúrate de cargarlo sólo cuando lo necesites.
  •  Dividir componentes grandes : para localizar componentes que tardan mucho en cargarse, considere dividirlos en varios componentes y cargar solo las partes necesarias al inicio. Esto reduce el tiempo de carga y el consumo de recursos al inicio.
  •  Utilice herramientas de análisis de rendimiento : combine con las herramientas de análisis de rendimiento mencionadas anteriormente, como Spring Startup Analyzer, Java Profiler, VisualVM, etc., para realizar análisis de rendimiento en la aplicación. Al monitorear y analizar los datos de rendimiento de las aplicaciones, se pueden encontrar cuellos de botella en el rendimiento y optimizarlos en consecuencia.
  •  Optimización y refactorización periódicas del código : revise y optimice periódicamente el código para identificar y eliminar posibles problemas de rendimiento. Utilice algoritmos y estructuras de datos optimizados para reducir cálculos y bucles innecesarios, optimizar consultas de bases de datos, etc., para mejorar el rendimiento de la aplicación.
  •  Utilice el mecanismo de almacenamiento en caché : utilice el almacenamiento en caché de forma racional para reducir el acceso frecuente a bases de datos u otros recursos. Al almacenar en caché los datos de uso frecuente o los resultados de los cálculos, la velocidad de respuesta y el rendimiento de la aplicación se pueden mejorar significativamente.
  •  Procesamiento paralelo : si hay algunas tareas independientes que se pueden procesar en paralelo, puede considerar el uso de mecanismos asincrónicos o de subprocesos múltiples para mejorar la velocidad y la eficiencia del procesamiento.

Suplemento informativo

dirección de descarga de Oracle JDK8

https://www.oracle.com/java/technologies/downloads/#java8-mac

cuenta de inicio de sesión de Oracle

Comuníquese con el autor para proporcionar una cuenta gratuita.

instalación de redis local

https://redis.io/docs/install/install-redis/install-redis-on-windows/

herramienta de análisis de inicio spring-startup-analyzer

https://github.com/linyimin0812/spring-startup-analyzer/blob/main/README_ZH.md

Autor: JD Health Liang Can

Fuente: Comunidad de desarrolladores de JD Cloud Indique la fuente al reimprimir

Microsoft lanza una nueva "aplicación de Windows" .NET 8 oficialmente GA, la última versión LTS Xiaomi anunció oficialmente que Xiaomi Vela es de código completamente abierto y el kernel subyacente es NuttX Alibaba Cloud 11.12. Se expone la causa de la falla: Servicio de clave de acceso (Acceso Clave) excepción Vite 5 publicó oficialmente el informe de GitHub: TypeScript reemplaza a Java y se convierte en el tercer lenguaje más popular Ofrece una recompensa de cientos de miles de dólares por reescribir Prettier en Rust Preguntar al autor de código abierto "¿Sigue vivo el proyecto?" Muy grosero y Bytedance irrespetuoso : uso de IA para ajustar automáticamente los operadores de parámetros del kernel de Linux Operación mágica: desconecta la red en segundo plano, desactiva la cuenta de banda ancha y obliga al usuario a cambiar el módem óptico
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/4090830/blog/10148336
Recomendado
Clasificación