Monitoreo y ajuste del rendimiento del servidor de aplicaciones Oracle (carga de CPU alta)
Me acaban de contratar una empresa y mi jefe me dio un problema de rendimiento para resolverlo lo antes posible. No tengo ninguna experiencia con Java EE antes en el lado del servidor.
Permítanme comenzar lo que aprendí sobre el sistema y todavía no pude encontrar la solución:
Contamos con un Servidor de Aplicaciones Oracle (10.1.) y el servidor de base de datos Oracle (9.2.), los chicos del software escribieron una especie de gran proyecto J2EE (proyecto X) usando específicamente JSF 1.2 con Ajax que solo se usa en este proyecto. Utilizan activamente PL/SQL en su código.
Entonces, iniciamos el servidor de aplicaciones (máquina Solaris), todo parece estar bien. los usuarios comienzan a usar la aplicación a partir del lunes desde diferentes ubicaciones (la aplicación 200 tiene cuentas de usuario, acabo de verificar y veo que el grupo de conexiones está configurado correctamente, la sesión está activa solo 15 minutos).
Después de un tiempo (2 días), la utilización de la CPU aumenta,% 60,por la noche sigue igualnada cambió (la cantidad de usuarios en línea es casi 1 o 2 en este momento), inclusocomienza a usar la CPU asignada para otras aplicaciones en el mismo servidor porque liberaron Si no reiniciamos el servidor, la utilización llega a %90 después de 2 días, la aplicación es tan lenta que los usuarios finales comienzan a llamar.
El principal problema es que los ingenieros de software dicen que el código es claro y los administradores del sistema y del DBA dicen que tenemos la configuración correcta; las otras aplicaciones parecen estar bien, por qué este problema ocurre solo para la aplicación X.
Empiezo a copiar la base de datos a una plataforma de prueba y la actualizo a la última versión, también hago lo mismo con el servidor de aplicaciones (Weblogic) si hay un error o no. Solo probé por mí mismo, solo un usuario y el panel de administración de Weblogic. Puedo rastrear los hilos y volcarlos. Me di cuenta de que hay algunos hilos que se muestran comocurvidad. Cuando revisé los manuales y controlé el seguimiento, veo que me indica el número de línea donde se llama el código PL/SQL desde un archivo .java. El software ing. dice que sí, tenemos códigos PL/SQL realmente complejos, pero¿Cuál es la relación con el servidor de aplicaciones?Este es el problema del servidor DB, supongo que tienen razón...
Sé que la pregunta tiene muchos huecos, me gustaría dar más detalles pero agradezco la forma en que me guías.
Gracias de antemano ...
Editar: el servidor tiene suficiente CPU y memoria para ejecutar aplicaciones más complejas
Respuesta1
Las llamadas intensas de PL/SQL deberían bloquear el subproceso, por lo que el uso de la CPU debería disminuir.
Mi primera opción para un servidor de aplicaciones lento es verificar los registros de gc, buscando colecciones importantes frecuentes (que indican una pérdida de memoria o que la JVM simplemente necesita más memoria).
Los sistemas que cuido se convirtieron en unlotemás estable después de cambiar de los controladores gruesos de Oracle a los controladores jdbc livianos, aunque los problemas se habían manifestado principalmente como que el contenedor fallaba.
Los registros deberían ser un buen indicador de cualquier problema en el sistema, pero mucho depende de lo que los desarrolladores decidan escribir allí. SQL lento podría provocar que se agote el grupo de conexiones; asegúrese de que el grupo registre las estadísticas de conexión. También asegúrese de que ulimit esté configurado correctamente para la JVM.
Dado que está ejecutando 9i en el nivel de base de datos, no tendrá la funcionalidad AWR; tendrá que ejecutar el paquete de estadísticas (pero esto ya debería ser una práctica estándar para la gestión del rendimiento de sus sitios) para identificar qué está causando los problemas en la base de datos.
La degradación gradual del rendimiento es indicativa de una pérdida de memoria en la aplicación; generalmente esto se debe a que los objetos no están desreferenciados y, por lo tanto, no son elegibles para la recolección de basura, es decir, un problema de programación. Esto debería ser evidente en la mayoría de las herramientas de creación de perfiles de Java.
Me di cuenta de que hay algunos hilos que se muestran como acaparados.
A menos que estés probando esto con una carga de trabajo realista, los resultados son prácticamente inútiles.