que - ¿Cómo perfilar un programa Erlang en términos de uso de memoria?
para que sirve lisp (4)
Me gustaría mejorar aún más la eficiencia de un programa Erlang existente. Primero me gustaría identificar cuellos de botella y luego decidir dónde optimizar más.
He probado fprof
, pero solo proporciona información sobre el tiempo de ejecución total y promedio. Me gustaría ver un registro similar al de fprof, pero en términos de uso promedio y total de memoria con respecto a las funciones y procesos.
Para empezar, bastaría con perfilar un solo módulo, que no genera procesos, solo se llamarán sus funciones. Esto ya ayudaría, ya que podría separar el programa en distintos módulos para realizar pruebas.
Los puntos sospechosos típicos son, donde se manejan listas más grandes.
Aquí, el uso de ++
se ha resuelto mediante lists:reverse([Head|Tail])
sintaxis lists:reverse([Head|Tail])
.
También estoy considerando usar tablas ETS en lugar de listas para casos con más de unos cientos de elementos.
¡Gracias de antemano!
@brainiac, estoy publicando una nueva url para el repositorio de estadísticas erlang en github: https://github.com/Amadiro/erlang-statistics (lo encontré por búsqueda ;-)).
Como una solución más lista para la producción, puedo recomendar el cliente Colllang de https://github.com/athoune/erlang-collectd si realmente necesita algún tipo de gráficos de consumo de memoria total.
Pero para obtener información más detallada sobre la memoria, puede usar process_info(Pid, [memory])
para obtener información de la memoria para un Pid específico y el comando de shell i()
para obtener una lista de todos los procesos con información de memoria y tiempo de ejecución. También existe tal utilidad como etop.
Pero no existe un generador de perfiles como fprof, sino para el uso de la memoria.
Consulte http://www.erlang.org/faq/how_do_i.html#id52731 para obtener más información.
El punto de partida perfecto es la sección de perfiles de la Guía de eficiencia de Erlang:
Haciendo un poco de publicidad por mi propio bien: Hace un tiempo escribí un pequeño erlang gen_server, que registra y registra las estadísticas del sistema, combinado con un pequeño script en perl que las analiza y genera gráficos bonitos.
Lo he encontrado bastante útil para ver la memoria, etc., bajo carga, ya que le permite controlar continuamente una vista detallada del uso de la memoria, mientras que por ejemplo, prueba cosas diferentes.
La parte erlang es bastante no intrusiva, un simple gen_server que puede comenzar desde cualquier lugar, simplemente puede ponerlo bajo su árbol de supervisión. Puede configurar la frecuencia de sondeo, etc., y escribirá las estadísticas en un archivo en un formato json simple.
La secuencia de comandos perl se ejecuta sobre él y agrega los registros para dibujar gráficos. Existen clases base y, si conoce un poco de Perl, puede escribir fácilmente una clase para registrar y graficar cualquier parámetro personalizado que desee.
El script se puede obtener en: https://github.com/Amadiro/erlang-statistics
Tabla de muestra (nodo Erlang que filtra átomos): Tabla de muestra http://monoc.mo.funpic.de/ram-usage-vs-time.png
Espero que esto te ayude :)