2009-09-08 8 views
8

Nuestra aplicación tiene ~ 10 hilos haciendo tareas separadas (sin conjuntos de hilos). No estamos experimentando un punto muerto, pero siempre estamos tratando de reducir la latencia para responder a una solicitud, por lo que estamos interesados ​​en determinar qué bloqueos son los más disputados. jconsole muestra con qué frecuencia se bloquean los hilos, y no es muy frecuente, pero aún queremos saber qué bloqueos son los más disputados.Determinar qué bloqueos son los más disputados?

Estamos trabajando con Sun JVM, por lo que JLA de IBM no es útil, y no estamos utilizando Solaris, por lo que no podemos usar dTrace.

EDIT: Quiero hacer esta observación en la producción, donde un generador de perfiles frenaría la aplicación inaceptable. Este es un sistema de comercio, si somos lentos, perdemos dinero, por lo que no ejecutamos perfiles en producción. También es bastante difícil simular los muchos intercambios con los que hablamos en una prueba de rendimiento.

+0

DTrace es el único sistema personalmente estoy consciente de que hace lo que quiere sin necesidad de herramientas de perfilado. – aperkins

+0

Pensando más en esto, creo que la instrumentación es el mejor enfoque. Puede registrar solicitudes de bloqueo individuales o mantener contadores globales. –

Respuesta

7

conseguir un buen perfilador como YourKit. Puede decirle cuánto tiempo se usa y bloquea en métodos particulares y monitores de objetos contenidos en él. Por ejemplo:

alt text http://i25.tinypic.com/j8ocbm.jpg


En lo que respecta a su comentario acerca de las métricas de producción, que son bastante limitados en lo que pueda reunir. La mayor parte de la información que obtendrá será del ThreadMXBean, que le puede dar metadatos sobre todos los hilos en ejecución. Sin embargo, no le dará información sobre la contención de un monitor de objetos específico.

No quiero entrar en mi torre de marfil aquí, pero realmente creo que su mejor opción es tratar de replicar su entorno de producción lo más cerca posible. Pasar algún tiempo configurando eso ahora pagará dividendos muchas veces en el futuro.

Incluso ejecutar un generador de perfiles en un entorno simulado, pero no lo suficientemente bueno, probablemente le proporcione buena información.

+0

JProfiler tiene una funcionalidad similar. Pero quiero hacer esta observación en producción, donde un generador de perfiles ralentizaría la aplicación inaceptablemente. Este es un sistema de comercio, si somos lentos, se pierde dinero, por lo que no se ejecutan perfiladores en la producción. También es bastante difícil simular los muchos intercambios con los que hablamos en un entorno de prueba de rendimiento. –

+0

@Ted, editaría su pregunta para agregar esa información ya que altera dramáticamente lo que puede y no puede hacer. – Kevin

+0

Gracias Kevin, editado. Tenemos un entorno de prueba de rendimiento que ha sido muy útil en el pasado, pero creo que la mayoría de las tiendas financieras de alta frecuencia han decidido que pasar demasiado tiempo simulando el mundo real no es productivo. Buscaré un comercio en el que podamos ejecutar un generador de perfiles sin demasiado daño. –

4

Para problema similar en la base de datos, registramos una línea justo antes de solicitar e inmediatamente después de adquirir un bloqueo. También registramos uno después de liberarlo. A continuación, procesamos estos datos para generar el tipo de estadísticas que está buscando.

EDIT: En la parte superior de un sistema desarrollado, AspectJ podría ser una buena opción para generar los registros.

5

Ted, simpatizo con su situación, pero cuando el rendimiento es tan crítico, le recomiendo que muerda la bala y simule.

No debería ser tan difícil como teme: en lugar de tratar de generar flujo de mensajes desde sus intercambios, ¿por qué no registrar el flujo entrante y volver a reproducirlo en la simulación?

Sin algo como esto, siempre se encontrará con el problema de Heisenberg: afectando el sistema que está midiendo.

Cuestiones relacionadas