2011-08-23 43 views
13

Como publiqué en Performance drop after 5 days running web application, how to spot the bottleneck?, tengo un problema con una aplicación que se vuelve lenta después de funcionar por un tiempo.Cómo usar VisualVM para detectar el cuello de botella/problema

Tengo funcionando VisualVM e hice una instantánea entre diferentes momentos. Ahora la aplicación es muy lenta, pero no tengo idea de cómo detectar el cuello de botella. No tienen muchas diferencias entre sí y lo único que crece un poco es el Heap, que se recolecta con éxito después de un tiempo.

¿Alguien me puede dar algunos consejos?

Estas son las instantáneas (apps):

[1] http://www.2shared.com/file/W4XJ6HtE/application-1314108550032.html

[2] http://www.2shared.com/fadmin/22521338/f512f97e/application-1314097232727.apps.html

Gracias!

EDITAR: Mirando más de cerca, he notado que la CPU ni siquiera se usa mucho ... ¡y el sistema es realmente lento!

+0

En la segunda instantánea (que va más de una hora, mientras que el primero va más de 4 segundos solamente) hay una cierta carga de la CPU y casi sin carga creada por el GC. Si la CPU es el cuello de botella, debe intentar establecer qué métodos están causando esto. Puedes hacer esto dentro de jvisualvm, también. – ziggystar

+0

¿En qué servidor de aplicaciones se ejecuta la aplicación? ¿Está detrás de un front-end de servidor web? En caso afirmativo, ¿cómo están los 2 conectados (qué módulo)? – atrain

Respuesta

4

En realidad, hay algunas herramientas mejores que VisualVM.

Usted podría intentar JProfiler, que es un buen perfilador (pero pagado)

Y puede probar con el perfilador Netbeans, que es gratuito y funciona muy bien

Con VisualVM sólo verá el estado actual de su aplicación (uso de memoria y CPU, JMX, clases cargadas, etc.).

+3

Hay mejores herramientas; pero esto no significa que los necesites en este caso (lo que actualmente no puedo juzgar). JvisualVM también incluye un generador de perfiles (tanto de instrumentación como de muestreo) y un generador de perfiles de memoria. También puedes instalar complementos adicionales. – ziggystar

+0

@ziggystar ¡Es bueno saberlo, no lo sabía! –

6

Como primer paso, sugeriría identificar qué es exactamente lento. ¿Ejecuta algún trabajo lentamente? ¿O demuestra un bajo rendimiento en el manejo de trabajos de diferentes clientes?

¿Qué recurso no es suficiente?

  • Si está utilizando algunos servicios externos (como la base de datos o servidor RPC) siempre registrar su tiempo de respuesta y comprobar que antes de hacer cualquier otra medida de optimización.
  • Podría ser una falta de potencia del procesador. Solo mira el uso de la CPU.
  • Podría ser una falta de memoria. Use el registro de gc para detectar ese tipo de problemas. Hay un good topic al respecto.
  • Podría ser una falta de velocidad del disco duro. Use el iostato y conozca los límites de rendimiento de su disco duro.
  • Podría ser una falta de rendimiento de la red. Verifica el uso del canal de red.
  • También es posible que se quede sin algunos límites específicos del sistema operativo, como la cantidad de archivos abiertos y/o conectores de red. Compruebe que informe correctamente todas las excepciones de nivel de sistema operativo en los archivos de registro.

Como ha identificado qué recurso es insuficiente y la parte de su programa que lo sufre, puede intentar encontrar la pieza de código para optimizar. Tomar una herramienta aleatoria y ejecutar su aplicación a través de ella sin saber qué buscar no tiene sentido.

Según mi experiencia personal, es muy raro que tenga un método lento, que se puede encontrar con un generador de perfiles.Lo más probable es que se trate de una IO inesperada y/o sincronización en algún lugar de su algoritmo o esquema de base de datos defectuoso.

0

No asumiría de entrada que es un problema con su aplicación. Si es un sistema basado en Windows, mire el antivirus, cualquier planificador de actualización que se ejecute en ese momento.

Asegúrate de que los registros se estén renovando y de que la depuración se haya filtrado correctamente para que no se salgan de control.

Compruebe las instantáneas sql para cualquier consulta de larga ejecución. Verifique la carga de DB y el montón de DB.

Si tiene Visual VM ejecutándose por un tiempo, asegúrese de tener algunos hilos listos para aceptar el trabajo/las conexiones se mostrarán en amarillo (inactivo).

Un disparo en la oscuridad Eclipse Memory Analyzer

Tome un volcado del montón cuando se observa una desaceleración y ejecutarlo a través del analizador.

Si está en un sistema basado en Unix, revise los descriptores de archivos ulimit -a para asegurarse de que el proceso java no se haya agotado.

Comprobar los ajustes de límite de ningún retraso TCP y Nagle en el servidor

Cuestiones relacionadas