Automatizar Java Performance Tuning

Por Carl Brahms
Publicado en septiembre de 2008


¿Por qué el hecho de automatizar la generación de carga y el proceso de ajuste de desempeño puede ahorrar mucho tiempo y esfuerzo?

El ajuste puede resultar una experiencia muy difícil y que consume mucho tiempo, en especial para entornos que exigen el mejor desempeño. Los beneficios de un buen ajuste implican un entorno más estable, menos cortes de servicio y un mejor desempeño general. Si tiene la suerte suficiente de tener personal interno y un entorno dedicado al ajuste de desempeño, usted se encuentra en una posición poco frecuente. En cambio, si es como el resto de nosotros, cuyos esfuerzos en el ajuste de desempeño son comprimidos en ventanas de tiempo reducidas, este artículo le mostrará cómo automatizar el proceso hace que todo sea más fácil, rápido y completo que haciéndolo manualmente.

Principios Básicos del Ajuste de Desempeño

El ajuste de desempeño Java es un proceso continuo—y a menudo largo y frustrante. Raramente, el ajuste puede resolver los problemas de desempeño de una sola vez. Algunas veces, puede tener problemas para alcanzar su desempeño ideal, independientemente de cuánto hardware agregue, o cuántas horas invierte en argumentos de memoria poco claros. A fin de obtener el mejor desempeño para empezar, usted necesita objetivos de desempeño claros, un diseño bien pensado, una implementación sólida y, por último, un minucioso ajuste de desempeño.

Empiece con Objetivos Claros de Desempeño

Antes de dar algún paso para optimizar su desempeño, usted debe determinar cuáles son sus objetivos. Esto se debe a que el comportamiento esperado y la cantidad de usuarios, cantidad de datos y tamaño de las solicitudes determinan en gran medida qué tipo de decisiones deberá tomar con respecto al ajuste. Cada entorno es exclusivo y un claro entendimiento sobre cuáles son los límites ambientales y de aplicaciones, así como a qué nivel de desempeño y carga apunta, lo ayudará con su línea de progreso cuando se encuentre en medio del proceso.

Ajuste los Parámetros del Servidor WebLogic

Hay literalmente cientos de configuraciones WebLogic que puede ajustar: tamaños de grupos, ajuste de buffering acumulado para conexiones, caché, parámetros JDBC y JMS, las prioridades de configuración con los gerentes de trabajo, clustering, etc. Para saber dónde comenzar, vea las Principales Recomendaciones de Ajuste para el Servidor WebLogic.

Busque los Cuellos de Botella

El problema no radica siempre en los parámetros de JVM o WebLogic. Asegúrese de que las configuraciones del SO y de red sean las adecuadas para los requisitos de la aplicación, en especial si utiliza UNIX o Linux. Monitoree el disco de su servidor, I/O de red y la utilización de CPU mientras se encuentra en proceso de carga. El tamaño en bloque de su base de datos, el tamaño en grupo y otros parámetros de ajuste de desempeño específicos de proveedores también deberían analizarse si se limita el desempeño de la base de datos. Cualquier restricción subyacente de los recursos puede causar una degradación significativa en el desempeño.

Y tenga en cuenta que el punto central es simplemente cumplir con sus objetivos de desempeño, no eliminar todos los cuellos de botella. Siempre habrá un cuello de botella o una parte más lenta en el sistema, pero lo que importa es cumplir con sus objetivos de desempeño y mantener a los clientes satisfechos.

Ajuste el Código de sus Aplicaciones

Puede resultar obvio manifestar esto pero las aplicaciones necesitan estar diseñadas teniendo en cuenta el desempeño. Es fácil que en los actuales entornos SOA las aplicaciones se vuelvan demasiado complejas y tengan muchos problemas que afecten el desempeño. Las aplicaciones mal diseñadas pueden ser la causa de los cuellos de botella de las bases de datos, las redes o los recursos del sistema. Diseñe sus aplicaciones utilizando patrones de desempeño probados, hágalo simple.

Ajuste su Heap

Independientemente de cómo sea su aplicación, si su heap es poca o invierte mucho tiempo en la recolección de basura, debería intentar ajustar el tamaño de heap general y sus generaciones. El desempeño de aplicaciones se ve a menudo favorecido o dificultado significativamente por el tamaño del heap disponible.
Encontrar el tamaño adecuado de heap para sus servidores WebLogic es esencial para un buen desempeño. Como regla general de tamaño, usted quiere tener alrededor de la mitad del heap libre al final de cada recolección de basura. Otra forma de decir esto es que el área de almacenamiento debería ser al menos el doble del tamaño de sus objetos activos.

Tal vez el más básico de los pasos para el ajuste del desempeño de heap es configurar el tamaño de heap mínimo y máximo para que sean iguales. Esta recomendación también es relevante para configurar el tamaño de la nueva generación en Sun HotSpot, o el tamaño Nursery si utiliza Oracle JRockit. Por defecto, JVM desperdicia recursos expandiendo y reduciendo constantemente el tamaño del heap.

No tema experimentar e intentar configurar el tamaño al máximo nivel que pueda manejar su sistema, restando la memoria necesaria para el SO y otras aplicaciones. Un heap más grande reduce la frecuencia de recolección de basura, pero puede demorar más realizar las recolecciones más grandes de basura.

VM siempre utiliza más memoria que el tamaño de almacenamiento para manejar las bibliotecas nativas y permGen (en el caso de Sun HotSpot), por lo tanto, tenga cuidado de no exceder el tamaño total de la RAM física. La paginación de memoria del SO en el disco reducirá drásticamente el desempeño.

Pruebe con Recolectores de Basura

La recolección de basura es el mecanismo utilizado para reclamar espacio de almacenamiento de objetos que ya no se utilizan. Existen varios esquemas para la recolección de basura que varían desde JVM hasta JVM, y todos utilizan los recursos del sistema de diferentes maneras. Su trabajo en el proceso de ajuste es identificar qué tipo de esquema para recolección de basura funciona mejor para sus objetivos particulares de aplicaciones y desempeño. Los objetivos incluidos en la elección de un recolector son minimizar los tiempos de pausa en la recolección de basura y mejorar el rendimiento de la recolección de basura.

Para obtener información sobre cómo utilizar los esquemas de recolección de basura de JRockit, vea la sección sobre "Elegir y Ajustar un Coleccionista de Basura". Para obtener un informe general detallado de los esquemas para recolección de basura disponibles con Sun HotSpot VM, lea Ajustar la Recolección de Basura con 5.0 Java Virtual Machine de Sun.

Otras Consideraciones

Hay varias opciones específicas para el desempeño JVM que son ofrecidas por JRockit y Hotspot JVMs. Solamente la lista de parámetros WebLogic que impactan sobre el desempeño es muy extensa. Lo más esencial para el ajuste productivo es que los desarrolladores, arquitectos, ingenieros de sistemas, el departamento de pruebas QA, los ingenieros de red y los DBAtrabajen juntos como equipo. Tener una participación multidisciplinaria en el proceso de ajuste puede contribuir a lograr un trabajo más corto, mejores resultados y, por último, reducir el costo y el tiempo que lleva.

Los Beneficios de la Automatización

Ahora que hemos repasado algunos puntos básicos del ajuste de desempeño de WebLogic, observemos cómo el hecho de automatizar estas tareas puede realmente lograr que el ajuste de desempeño del proceso sea fácil, consuma menos tiempo y sea más efectivo.

Cambios Rápidos, Ajuste Frecuente

He visto una y otra vez que automatizar el proceso de ajuste de desempeño produce resultados mucho mejores que los de los expertos. Esto se debe principalmente a que el proceso automatizado puede realizar cambios rápidamente y medir el impacto sobre el desempeño, de una manera más rápida y completa que el ser humano que haya tomado más café. Y, al volverse el ajuste un proceso fácil, usted puede realizar ajustes en cada lanzamiento de códigos y mantenerse actualizado respecto de los cambios en las aplicaciones. Aparecen demasiados problemas de desempeño debido a cambios menores en la funcionalidad de la aplicación que nadie pensó que producirían cierto impacto.

Asimismo, mucha gente asume incorrectamente que el ajuste es opcional porque sus actuales tiempos de respuesta son suficientes. Es fácil pasar por alto el hecho de que un ajuste adecuado aumenta la estabilidad y longevidad de un servidor. Los cortes de servicio pueden originarse por no realizar ajustes o por realizar ajustes incorrectos, y un entorno adecuadamente ajustado se ejecuta más previsiblemente y es más estable.

Ahorro de Tiempo y Desempeño No Explotado

A menudo no ajustamos nuestros servidores con frecuencia ni lo suficientemente bien, simplemente porque el proceso consume demasiado tiempo. Cuando usted automatiza el proceso, el esfuerzo manual diario puede realizarse durante la noche, sin intervención. El personal que anteriormente invertía innumerables horas en el ajuste puede invertir su tiempo de una manera más productiva.

Los ahorros financieros generados gracias a la automatización del ajuste Java se acumulan rápidamente cuando se producen menos cortes de servicio, hay un mejor desempeño, una buena utilización de hardware y hay más tiempo libre para focalizarse más en su trabajo y menos en el "trabajo engorroso". A menudo, las ganancias de microsegundos en el desempeño de los actuales entornos exigentes se traducen en ahorros significativos de recursos.

Aprenda Observando

Resulta instructivo ver cómo los cambios de código y las diferentes variables de ajuste afectan el desempeño. Automatizar el ajuste y el análisis permite intentar con una combinación más diversa de parámetros, y con un monitoreo adecuado, usted puede ver los resultados juntos. Es como pararse sobre un equipo de expertos en desempeño; usted empieza a aprender por qué se tomaron ciertas decisiones de ajuste, haciendo que sea un proceso muy educativo.

Poder ajustar fácilmente sus servidores para cada lanzamiento de código es también algo excelente. Usted cuenta con la tranquilidad de saber que no habrá sorpresas al momento de poner en marcha la producción.

Ajuste Automatizado, paso a paso

En esta sección, usted conocerá el proceso de uso de Tune Wizard de Arcturus Applicare para encontrar los parámetros JVM con el mejor desempeño. En beneficio del tiempo, demostraré el proceso de probar una variedad de parámetros para la recolección de basura.

En pocas palabras, Tune Wizard da inicio a sus pruebas de carga, monitorea los servidores, analiza el comportamiento, toma decisiones basadas en la inteligencia embebida, ajusta la configuración y hace rebotar los servidores. Este proceso se repite, ajustando automáticamente varios parámetros de JVM, el SO y WebLogic hasta que encuentra la combinación con el mejor desempeño. Luego se produce un desglose de cada paso.

Figura 1

Figura 1: El proceso de la adaptación automatizada de JVM

Dado que el ajuste se vuelve demasiado fácil cuando lo automatiza, usted puede rápidamente encontrarse queriendo realizar un ajuste y experimentar. En Tune Wizard, existen varias opciones avanzadas que le otorgan control sobre la utilización de recursos, sobre lo cual hablaré más adelante. Como en cualquier proceso de ajuste de desempeño, necesitará saber algo sobre el comportamiento de las aplicaciones. Si su aplicación tiene un período de preparación o un período inicial del tiempo en caché, necesitará asegurarse de que ejecute la carga durante un período suficiente para obtener resultados precisos.

Elija los Parámetros de Prueba de Carga

Tune Wizard se integra con las herramientas de generación de carga Apache JMeter, HP Load Runner y The Grinder y también puede realizar cargas generadas a partir de sus propias aplicaciones Java personalizadas y shell scripts. Todavía no tenía la configuración de la herramienta de carga ni ningún script de carga generado, por lo tanto utilicé JMeter (viene incluido) para registrar un script de prueba al seguir estas instrucciones.

Al iniciar Tune Wizard, especifiqué el script de carga y me permitió personalizar cuántos usuarios simular. Seleccioné 70 usuarios para esta prueba, porque sé de pruebas anteriores que ahí es donde el desempeño de mi aplicación comienza a atenuarse.

La primera vez que ajusta sus servidores, puede no saber cuántos usuarios puede manejar su aplicación antes de que el desempeño empiece a caer. Si no sabía cuántos usuarios podía manejar mi entorno, podía utilizar una característica denominada determinación de la capacidad (Figura 2) antes de adivinar y comparar más servidores. El propósito de la determinación de la capacidad es encontrar el balance perfecto de un buen rendimiento sin exceder sus límites de utilización de recursos. La determinación de la capacidad permite establecer una cantidad inicial y máxima de usuarios para hacer el intento y, al ajustarlo, aumentará la carga hasta que se encuentra un punto medio entre el rendimiento y el uso de los recursos.

Figura 2

Figura 2: Automatización de la determinación de la capacidad

Elija las Condiciones de Prueba

Luego necesita elegir la cantidad de muestras de monitoreo que tomará para cada sesión de ajuste y el intervalo entre ellas. Como mencionamos anteriormente, si su aplicación tiene un período de preparación o un período inicial de tiempo de cache, usted puede ajustar los parámetros en este paso para asegurarse de que la duración de la prueba sea lo suficientemente extensa como para obtener una base precisa. Seleccioné 20 muestras por sesión, cada 60 segundos.

Figura 3

Figura 3: Dado que cada aplicación varía, usted puede afinar la cantidad de muestras y sus intervalos de acuerdo con lo necesario para poder capturar una base precisa

Haga un Click en " Go"

Ahora todo lo que queda por hacer es sentarse y relajarse. Usted también puede programar el ajuste para que comience en cualquier momento, de manera que no debe estar presente si quiere que el ajuste empiece después de las horas laborales. Tune Wizard probará cada uno de estos parámetros, y cuando el ajuste esté completo, Tune Wizard generará un informe con recomendaciones sobre cuáles parámetros tuvieron el mejor desempeño.

Mientras el servidor está en el proceso de carga, Tune Wizard monitorea el estado y el desempeño del servidor. Hace esto teniendo en cuenta el rendimiento, la información de heaps, el uso de CPU, los threads, las esperas, las colas—básicamente, todo lo que estaría observando si estuviese realizando la prueba de carga usted mismo. La frecuencia y el tiempo entre muestras pueden configurarse y personalizarse al inicio de la sesión de ajuste.

Este es uno de los aspectos más interesantes y valiosos de Tune Wizard y las demás características de Applicare. Incluye un motor de inteligencia artificial que toma decisiones inteligentes respecto del ajuste de desempeño. La base de conocimiento está creada a partir de la experiencia combinada de consultores de ajuste de desempeño, metodologías probadas de ajuste y las mejores prácticas. Es capaz de observar los datos generados durante la prueba de carga y tomar decisiones inteligentes sobre qué ajustar luego. Una vez que Tune Wizard llega a la mejor combinación posible, el ajuste terminará.

Puedo ver los cuadros de progreso en vivo en la consola Applicare o puedo esperar hasta que la prueba finalice y ver los informes. Si quiere verificar los datos para sacar sus propias conclusiones, hay una gran lista de informes y cuadros que muestran detalles completos del comportamiento de cada uno de los parámetros de ajuste.

Los Resultados

En esta sección se describen brevemente los resultados del ajuste, se muestran algunos de los cuadros creados por Applicare relacionados con las sesiones de ajuste, y se debate algunas recomendaciones adicionales realizadas por Applicare. Este no fue un ejercicio de ajuste exhaustivo, pero muestra lo que Tune Wizard puede hacer en un lapso breve con poca carga. El proceso de ajuste tardó 4 horas en completarse, probó 9 combinaciones diferentes de parámetros, ajustando las configuraciones JVM y otras configuraciones, incluso los threads, las configuraciones JDBC, etc. Tune Wizard busca áreas de la configuración que son demasiado pequeñas o demasiado grandes y las configura adecuadamente. De los parámetros de prueba que asigné a Tune Wizard, el que mejor desempeño tuvo fue:

-Xms512m -Xmx512m -XX:CompileThreshold=8000 -XX:PermSize=48m 
-XX:MaxPermSize=128m  -Xverify:none -XX:NewRatio=3 
-XX:SurvivorRatio=6 -XX:+UseParallelGC


Applicare has a selection of charts to show the tuning results, in the interest of space, I'm showing the throughput and heap charts showing the before/after. You can see the heap utilization is lower and the major GC pause times are less. You can also see that the throughput dropped at the same time as the major GC occurred, showing that our initial settings before tuning would result in long pause times during major GCs.

Figura 4

Figura 4: Este cuadro muestra que el rendimiento después del ajuste (azul) fue mejor que antes del ajuste (verde)

Figura 5

Figura 5: Una comparación del uso de heaps entre sesiones. El resultado final después del ajuste fue un menor uso de memoria

Otras Recomendaciones

Applicare también detectó problemas en el comportamiento del tiempo de ejecución de la aplicación y en la configuración del servidor. Detectó que EJB cache estaba mal configurado y sugirió aumentar el tamaño de caché.

Asimismo, el diagnóstico de Applicare arrojó que durante el proceso de ajuste, la cantidad de sesiones abiertas era lo suficientemente alta como para afectar el desempeño (más de 17.000 en algunos casos). Señaló las instancias en las cuales los Segundos de Intervalo de Invalidación de la Sesión de algunas de las aplicaciones web de mi aplicación tenían una configuración demasiado alta, y recomendó una reevaluación para evitar mantener abiertas las sesiones inactivas durante demasiado tiempo.

Lo bueno es que no tuve que adivinar ni ir en busca de estos cuellos de botella; ellos fueron presentados claramente por la herramienta.

Opciones Avanzadas

Tune Wizard incluye opciones predefinidas para cada JVM soportada por WebLogic, las cuales apuntan a encontrar el mejor coleccionista de basura para su entorno, pero también ofrece a los usuarios avanzados la flexibilidad para probar cualquier opción que quieran. Para esta prueba, he probado algunos de mis propios parámetros y se ha encontrado el que tiene mejor desempeño en tan solo algunas horas, lo cual me ahorró mucho esfuerzo.

applicare.jvmparams.param6= -Xmn256m -Xss128k -XX\:+UseConcMarkSweepGC 
-XX\:+UseParNewGC -XX\:SurvivorRatio\=8 -XX\:TargetSurvivorRatio\=90 
-XX\:MaxTenuringThreshold\=3 -Xms512m -Xmx512m -XX:CompileThreshold=8000 
-XX:PermSize=48m  -XX:MaxPermSize=128m  -Xverify:none 
applicare.jvmparams.param5= -Xmn256m -Xss128k -XX\:+UseParallelGC 
-XX\:+UseParallelOldGC -XX\:+UseBiasedLocking -Xms512m -Xmx512m 
-XX:CompileThreshold=8000 -XX:PermSize=48m  -XX:MaxPermSize=128m  
-Xverify:none applicare.jvmparams.param4= -Xmn256m -Xss128k 
-XX\:+UseParallelGC -XX\:+UseParallelOldGC -Xms512m -Xmx512m 
-XX:CompileThreshold=8000 -XX:PermSize=48m  -XX:MaxPermSize=128m  
-Xverify:none applicare.jvmparams.param3= -XX\:NewRatio\=3 
-XX\:SurvivorRatio\=6 -XX\:+UseConcMarkSweepGC -Xms512m -Xmx512m 
-XX:CompileThreshold=8000 -XX:PermSize=48m  -XX:MaxPermSize=128m  
-Xverify:none applicare.jvmparams.param2=-XX\:NewRatio\=3 
-XX\:SurvivorRatio\=6 -XX\:+UseParallelGC -Xms512m -Xmx512m 
-XX:CompileThreshold=8000 -XX:PermSize=48m  -XX:MaxPermSize=128m  
-Xverify:none applicare.jvmparams.param1=-XX\:+UseParallelGC 
-XX\:MaxGCPauseMillis\=3 -Xms512m -Xmx512m -XX:CompileThreshold=8000 
-XX:PermSize=48m  -XX:MaxPermSize=128m  -Xverify:none
                      

Usted también puede configurar la cantidad de CPU que quiere utilizar durante el ajuste de determinación de capacidad. A menudo, se presenta el caso donde usted comparte la misma área con múltiples servidores administrados, de manera que naturalmente querrá limitar el hardware para cada proceso de carga. Los límites sobre la longitud de cola aceptable, la cantidad de esperas y otras opciones configurables le ofrecen la capacidad de ajustar la herramienta a las exclusivas necesidades de ajuste de su entorno.

Conclusión

El proceso de ajuste de WebLogic sigue siendo el mismo—excepto el tedioso trabajo de ejecutar cargas, analizar el desempeño, realizar cambios adecuados y reiniciar el servidor WebLogic que son todos procesos automatizados. Tune Wizard es una herramienta para ahorrar tiempo que automatiza la generación de carga y el ajuste de desempeño.

En este artículo, he hablado sobre las características automatizadas de JVM Tuning, pero Applicare también automatiza el análisis de la configuración, la detección de problemas, la detección de las causas de origen y muchas otras características que apuntan a mejorar el desempeño y la disponibilidad.

Referencias



Carl Brahms es un ingeniero senior en Arcturus Technologies Inc.