scala profiling akka

scala - ¿Cómo perfilar las aplicaciones Akka?



profiling (3)

Estaba pensando en crear perfiles / métricas en el código ya que también uso mucho Akka / Scala para crear aplicaciones de producción, pero también estoy ansioso por escuchar formas alternativas de asegurarme de que la aplicación sea saludable.

  1. Métricas (como Dropwizard)

Muy buena herramienta para recopilar métricas en el código, con buena documentation y soporte integrado para Graphite , Ganglia , Logback , etc.

Cuenta con herramientas detalladas para recopilar estadísticas dentro de la aplicación como indicadores, histogramas de contador, tiempos: información para determinar cuál es el estado actual de su aplicación, cuántos actores se crearon, etc., si están vivos, cuál es el estado actual. mayoría de actores, etc.

De acuerdo, es un poco diferente del perfil, pero ayuda mucho a encontrar las raíces del problema, especialmente si está integrado con alguna herramienta de creación de caracteres.

  1. Perfiladores como (VisualVM, XRebel)

Ya que me divierto mucho al hacer el monitoreo, todavía responde una pregunta ligeramente diferente: ¿cuáles son las perspectivas actuales de mi aplicación en este momento? Pero hay otro asunto que puede perturbarnos: ¿cuál de mi código es lento (o descuidado)?

Por esa razón, tenemos VisualVM y otra respuesta a esta pregunta: cómo crear un perfil de actores Akka con VisualVM.

Además, sugiero probar el generador de perfiles XRebel que solo agrega un poco más de potencia de fuego para el proceso de averiguar qué código hace que la aplicación sea más lenta. También se paga, pero en mi proyecto se ahorró mucho tiempo con el código descuidado.

  1. Nueva reliquia

Lo sugeriría para algunos proyectos de áreas de juego, ya que puedes obtener algunas soluciones de monitoreo / perfiles de forma gratuita, pero en proyectos más serios, me gustaría ir a por las cosas que destacé anteriormente.

Así que espero que mi resumen haya sido útil.

Tengo una pequeña aplicación Akka que pasa muchos mensajes entre sus actores y cada actor hace algunos cálculos sobre los datos que recibe. Lo que quiero es perfilar esta aplicación para ver qué partes del código ocupan más tiempo y así sucesivamente.

Intenté VisualVM pero realmente no puedo entender lo que está pasando. He añadido una imagen de la salida del generador de perfiles.

Mis preguntas son

  • ¿Qué es, por ejemplo, esta primera línea y por qué lleva tanto tiempo? (scala.concurrent.forkjoin.ForkJoinPool.scan ())
  • ¿Pueden las aplicaciones Akka debido a su comportamiento asíncrono ser bien perfiladas?
  • ¿Puedo ver, por ejemplo, cuánto tiempo un actor específico (-tipo) trabaja para un mensaje específico (-tipo) que recibe?
  • ¿Existen otras mejores prácticas para crear perfiles de aplicaciones Akka?

Hace solo un par de días, TypeSafe announced que la consola de TypeSafe ahora es gratuita. No sé qué puede ser mejor para perfilar las aplicaciones Scala / Akka. Por la razón, puedes probar JProfiler para lenguajes JVM, lo he usado con proyectos Java, pero no es gratis y para Java.


  • Hay paquetes no perfilados de forma predeterminada y su tiempo se contabiliza en el perfil de scala.concurrent.forkjoin.ForkJoinPool.scan() . Si se permite muestrear todos los paquetes ocultos, se revelarán los verdaderos consumidores de tiempo de CPU. Por ejemplo, los siguientes perfiles ilustrativos de antes / después descubren que los hilos se ponen en suspensión la mayor parte del tiempo por sun.misc.Unsafe.park esperando a ser liberados.
  • Las aplicaciones Akka se pueden perfilar bastante bien con la instrumentación adecuada y el rastreo de llamadas. El prominente Dapper de Google , un artículo de infraestructura de rastreo de sistemas distribuidos a gran escala, contiene una explicación detallada de la técnica. Twitter creó Zipkin basado en eso. Es de código abierto y tiene una extensión para el rastreo distribuido de Akka . Siga su wiki para obtener una buena explicación de cómo configurar un sistema que le permita

    • rastrear las jerarquías de llamadas dentro de un sistema de actores;
    • las tuberías de procesamiento de solicitudes de depuración (puede iniciar sesión en trazas, anotarlas con pares clave-valor personalizados);
    • ver dependencias entre solicitudes derivadas y su contribución al tiempo de respuesta resultante;
    • Encuentra y analiza las solicitudes más lentas en tu sistema.

    También hay un chico nuevo en el bloque, Kamon . Es un conjunto de herramientas de reactividad para el monitoreo de aplicaciones que se ejecutan en la parte superior de la JVM, que es especialmente entusiasta para las aplicaciones creadas con la plataforma reactiva Typesafe. Eso definitivamente significa sí para Akka y la integración viene en la forma de los módulos kamon-akka-remote kamon-akka y kamon-akka-remote que traen instrumentación de bytecode para recopilar métricas y realizar la propagación automática del contexto de rastreo en su nombre. Explore la documentación a partir de la Descripción general de la integración de Akka para comprender lo que puede y cómo lograrlo.