14

Estoy intentando resolver problemas de rendimiento con una aplicación web grande y compleja de tomcat java. El mayor problema en este momento es que, de vez en cuando, los picos de uso de la memoria y la aplicación deja de responder. He reparado todo lo que puedo solucionar con los perfiles de registro y el análisis bayesiano de los archivos de registro. Estoy considerando ejecutar un generador de perfiles en el servidor de tomcat de producción.Costo de rendimiento de creación de perfiles de una aplicación web en producción

una nota al lector con suaves Sensibilidades:

entiendo que algunos pueden encontrar la misma noción de perfilar una ofensiva aplicación de producción. Tenga la seguridad de que he agotado la mayoría de las otras opciones. La razón por la que estoy considerando esto es porque no tengo los recursos para duplicar por completo nuestra configuración de producción en mi servidor de prueba, y no he podido causar fallas de interés en mi servidor de prueba.

Preguntas:

estoy en busca de respuestas que funcionan bien para una aplicación Java Web que se ejecuta en Tomcat, o responder a esta pregunta de una manera independiente del lenguaje.

  • ¿Cuáles son los costos de rendimiento del perfilado?
  • ¿Alguna otra razón por la cual es una mala idea conectar y perfilar remotamente una aplicación web en producción (modos de falla extraños, problemas de seguridad, etc.)?
  • ¿Cuánto afecta el perfilado a la huella de memoria?
  • Específicamente, ¿hay herramientas de creación de perfiles de Java que tengan costos de rendimiento muy bajos?
  • ¿Alguna herramienta de creación de perfiles diseñada para perfilar aplicaciones web?
  • ¿Alguien tiene puntos de referencia sobre los costos de rendimiento de creación de perfiles con visualVM?
  • ¿A qué tamaño de aplicaciones y conjuntos de datos se puede escalar visualVM?
+0

¿Tendría Apache FOP en su Webapp? –

+0

No lo creo, ¿por qué eso causa problemas de memoria? –

+0

FOP renderiza documentos basados ​​en XML a PDF y otros formatos similares. La versión actual en '09 usó memoria proporcional al tamaño del documento durante el procesamiento, causando síntomas como los que describe. –

Respuesta

13

OProfile y su antecesor DPCI fueron desarrollados para perfilar sistemas de producción. La sobrecarga para estos es muy baja, y perfilan su sistema completo, incluido el kernel, por lo que puede encontrar problemas de rendimiento en la VM y en el kernel y las bibliotecas.

para responder a sus preguntas:

  1. de arriba: Estos son muestreados perfiladores, es decir, que generan temporizador o performance counter interrumpe en algún intervalo regular, y echar un vistazo a lo que el código es actualmente en ejecución.Lo usan para construir un histograma de dónde gasta su tiempo, y la sobrecarga es muy baja (1-8% es lo que they claim) para intervalos de muestreo razonables.

    Eche un vistazo a this graph de frecuencia de muestreo vs. gastos generales para OProfile. Puede ajustar la frecuencia de muestreo para una sobrecarga menor si los valores predeterminados no son de su agrado.

  2. Uso en producción: La única advertencia al uso de OProfile es que tendrá que instalarlo en su máquina de producción. Creo que hay compatibilidad con kernel en Red Hat desde RHEL3, y estoy bastante seguro de que otras distribuciones lo admiten.

  3. memoria: no estoy seguro de lo que el consumo de memoria exacta de Oprofile es, pero creo que se mantiene relativamente pequeñas memorias intermedias alrededor y echa todo a los archivos de registro de vez en cuando.

  4. Java: OProfile incluye agentes de creación de perfiles que admiten Java y que conocen el código que se ejecuta en JIT. Entonces podrá ver llamadas Java, no solo las llamadas C en el intérprete y el JIT.

  5. Aplicaciones Web: Oprofile es un generador de perfiles a nivel de sistema, así que no es consciente de cosas como sesiones, transacciones, etc., que una aplicación web tendría.

    Dicho esto, es un del sistema completo de perfiles, así que si su problema de rendimiento es causado por malas interacciones entre el sistema operativo y el JIT, o si es de alguna biblioteca de terceros, usted será capaz de ver eso, porque OProfile perfila el kernel y las bibliotecas. Esta es una ventaja para los sistemas de producción, ya que puede detectar problemas que se deben a configuraciones erróneas o detalles del entorno de producción que podrían no existir en su entorno de prueba.

  6. VisualVM: No está seguro acerca de esto, ya que no tengo experiencia con VisualVM

Aquí es a tutorial sobre el uso de Oprofile para encontrar los cuellos de botella de rendimiento.

3

He utilizado YourKit para aplicaciones de perfil en un entorno de producción de alta carga, y aunque sin duda hubo un impacto, fue fácilmente aceptable. Yourkit makes a big deal de poder hacer esto de una manera no invasiva, como desactivar selectivamente ciertas características de creación de perfiles que son más costosas (en realidad, es una escala móvil).

Mi aspecto favorito es que puede ejecutar la máquina virtual con el agente YourKit ejecutándose y no tiene ningún impacto en el rendimiento. Solo cuando conectas la GUI y comienzas a perfilar tiene un efecto.

1

No hay nada de malo en crear perfiles de aplicaciones de producción. Si trabaja en aplicaciones distribuidas, hay ocasiones en que se produce una excepción fuera de memoria en un escenario de probabilidad único que es muy difícil de reproducir en un entorno dev/stage/uat.

Puede probar el uso de perfiladores personalizados, pero si tiene prisa y conectar/configurar upa profiler en un cuadro de producción llevará tiempo, también puede usar el jvm para realizar un volcado de memoria (el volcado de memoria jvms también le brinda volcado de hilo)

  1. Usted puede activar la generación automática en la línea de mandatos de la JVM, mediante el uso de la siguiente opción: -XX: + HeapDumpOnOutOfMemoryError

  2. que Eclipse Memory Analyzer proyecto ha llamado una característica muy potente "Grupo por valor", que permite construir un objeto consultar y reagrupar las instancias por un valor de campo. Esto es útil en el caso donde tiene muchas instancias que contienen un conjunto más pequeño de valores posibles, y puede ver qué valores se usan más. Esto realmente me ha ayudado a entender algunos volcados de memoria complejos, así que te recomiendo que lo pruebes.

1

También puede considerar el uso de una de la moderna máquina virtual Java HotSpot - Java registrador de vuelo y Java Mission Control. Es un conjunto de herramientas que le permiten recopilar información de tiempo de ejecución de bajo nivel con la sobrecarga de la CPU de aproximadamente 5% (no puedo probar la última declaración de todos modos, esta es la declaración del ingeniero de Oracle que presentó la característica y demostración en vivo).

Puede utilizar esta herramienta siempre que su aplicación ejecute 1_7u40 JVM o superior. Para habilitar la recopilación de información de tiempo de ejecución, debe iniciar JVM con indicadores específicos:

De forma predeterminada, JFR está deshabilitado en la JVM. Para habilitar JFR, debe iniciar su aplicación Java con la opción -XX: + FlightRecorder. Como JFR es una característica comercial, disponible solo en los paquetes comerciales basados ​​en Java Platform, Standard Edition (Oracle Java SE Advanced y Oracle Java SE Suite), también debe habilitar las características comerciales utilizando las opciones -XX: + UnlockCommercialFeatures.

(Citado http://docs.oracle.com/javase/8/docs/technotes/guides/jfr/about.html#sthref7)

que añade esta respuesta, ya que es la opción viable para la producción de perfiles en la OMI.

También hay un Eclipse plugin que admite JFR y JMC y es capaz de mostrar información fácil de usar.

+0

La sobrecarga con la plantilla predeterminada es de aproximadamente 1%. –

+0

@KireHaglin Aún menos pensé :) –

+0

Tenga en cuenta que estas son características comerciales que requieren que usted pague oráculo si se utiliza en producción, en comparación con el JDK tradicional que era de uso gratuito. –

0

Las herramientas han mejorado enormemente a lo largo de los años. En estos días, la mayoría de las personas que tienen necesidades como estas usan una herramienta que se engancha en la API de instrumentación de Java en lugar de la API de creación de perfiles. Seguramente hay más ejemplos, pero me vienen a la mente NewRelic y AppDynamics. Las soluciones basadas en instrumentación generalmente se ejecutan como un agente en la JVM y recopilan datos constantemente. Informan los datos a un nivel más alto (transacción comercial, transacción web, transacción de base de datos) que el anterior enfoque de generación de perfiles y le permiten profundizar (hasta el método o la línea) si es necesario. Incluso puede configurar monitoreo y alertas, para que pueda rastrear/alertar sobre métricas como los tiempos de carga de la página y el rendimiento contra los SLA. Con estas excelentes herramientas, realmente no debería tener ninguna razón para ejecutar un generador de perfiles en producción por más tiempo. El costo de ejecutarlos es insignificante.

Cuestiones relacionadas