2010-01-28 15 views
20

¿Usó Perf4J en su aplicación Java para recopilar y analizar las estadísticas de rendimiento?¿Ha utilizado Perf4J para recopilar y analizar medidas de rendimiento en la aplicación Java?

¿Cuál fue el patrón típico (utilizando archivos de registro, utilidades, UI, JMX, etc.)?

¿Usó anotaciones y funciones basadas en AOP?

¿Usó alguna integración JMX?

¿Cómo manejó la configuración de producción?

¿Incluyó las vistas e informes de estadísticas de rendimiento como una función en su aplicación?

Por favor, diga si y por qué decidió en la biblioteca alternativa/enfoque.

+0

Me he topado con Perf4J pero nunca lo intenté, por lo que estaría interesado también. – Mark

Respuesta

11

Estoy usando Per4j para supervisar el rendimiento del punto final del servicio web y también el servicio interno y el rendimiento de la clase dao.

Principalmente solo registro las estadísticas de rendimiento sin procesar en un archivo rodante diario. Luego uso el jar en la línea de comando para analizar los datos con diferentes timeslices a mi gusto. A menudo utilizo la opción de línea de comandos -g para generar un archivo html que luego puedo abrir y visualizar visualmente, lo cual es realmente útil.

Me gusta usar Spring AOP con la anotación @Profiled. Hace el tiempo muy limpio. Tenía algunas dudas sobre el rendimiento degradante de perf4j, y podría ofrecer fácilmente que podría desactivar el inicio de sesión eliminando el TimingAspect de mi archivo Spring applicationContext.xml.

<!-- just remove and all uses of @Profiled do nothing --> 
<bean id="timingAspect" class="org.perf4j.log4j.aop.TimingAspect"/> 

Tenga en cuenta el valor medio y tenga en cuenta el valor máximo. Mientras realizamos la optimización del rendimiento, tuvimos una llamada al método que tenía valores wild con una gran desviación estándar. La mayoría de los valores se encontraban alrededor de la mediana, sin embargo, hubo una gran cantidad de llamadas que fueron 100 veces más que el promedio. Más de error de usuario que nada, pero ten cuidado.

Uso el AsyncCoalescingStatisticsAppender con un intervalo de tiempo de 15000, pero apenas leo el registro. Como tengo los registros de rendimiento sin procesar, puedo cortar y cambiar eso ejecutando perf4j en la línea de comando.

Probé la integración JMX y funciona según lo prometido en la documentación. Pero no tengo un uso real en este momento para eso.

Tengo planes para exponer los datos usando SNMP y si es útil contribuiré.

En total, recomiendo Perf4j.

3

He usado Perf4J, y finalmente lo abandoné porque ya estaba usando Spring AOP. Me encantaría simplemente integrar los dos, pero estaba teniendo problemas con él (debido a los apiladores Perf4J).

Intenté usar Perf4j a través de anotaciones y AOP sin JMX. Puede manejar producción cfg a través de archivos de configuración.

En general, me gustó el enfoque Perf4j pero como ya estaba usando Spring para la monitorización del rendimiento no necesitaba perf4j. Una cosa que Perf4j da gratis es el min/max/dev estándar; con otras libs tendrías que hacer las matemáticas tú mismo.

Lo que perf4j es agradable si no tiene ninguna otra lib que pueda proporcionar intercepción (aspectJ o AOP), pero como ya tenía la primavera, era más fácil implementar la medición del rendimiento. Puede exponer fácilmente las propiedades del frijol a través de JMX con Spring.

7

Estoy usando Perf4J en una aplicación cliente-servidor para sincronizar las llamadas RPC. Fue bastante simple de implementar: solo necesitaba incluir unas pocas líneas de código alrededor del servlet del despachador RPC para medir cada llamada al método RPC. Las mediciones de tiempo se escriben en un archivo de registro separado, los datos agregados se guardan en la memoria para su uso con el servlet gráfico. La configuración fue cuestión de minutos.

Este es un extracto del método preHandle():

request.setAttribute("stopWatch", new CommonsLogStopWatch()); 

Este código del método postHandle():

LoggingStopWatch stopWatch = (LoggingStopWatch)request.getAttribute("stopWatch"); 
stopWatch.stop(methodName); 

Estas son las secciones pertinentes de mi log4j.cfg:

<logger name="org.perf4j.TimingLogger" additivity="false"> 
    <level value="info"/> 
    <appender-ref ref="CoalescingStatistics"/> 
    <appender-ref ref="statsAppender"/> 
</logger> 

<appender name="CoalescingStatistics" 
      class="org.perf4j.log4j.AsyncCoalescingStatisticsAppender"> 
    <param name="TimeSlice" value="60000"/> 
    <appender-ref ref="graphPatientChart"/> 
</appender> 

<appender name="graphPatientChart" 
      class="org.perf4j.log4j.GraphingStatisticsAppender"> 
    <param name="GraphType" value="Mean"/> 
    <param name="TagNamesToGraph" value="getPatientChart,idleNotification"/> 
</appender> 

<appender name="statsAppender" class="org.apache.log4j.DailyRollingFileAppender"> 
    <param name="datePattern" value="'.'yyyy-MM-dd"/> 
    <param name="file" value="WEB-INF/log/meona-performance.log"/> 
    <param name="append" value="true"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%m%n"/> 
    </layout> 
</appender> 

Me gustaría que el servlet gráfico sea más interactivo: Sería bueno si pudiera elegir las etiquetas para ser incluido en el gráfico. ¿Te has encontrado con una aplicación de interfaz de usuario que se puede utilizar para analizar los registros de medición de tiempo?

+0

Matthias, gracias. No, no tuve la oportunidad de seguir usando perf4j todavía. – topchef

Cuestiones relacionadas