Análisis de rendimiento de software

En ingeniería de software el análisis de rendimiento, comúnmente llamado profiling o perfilaje, son herramientas de software utilizadas para analizar y medir el rendimiento de una aplicación o programa. Su objetivo principal es identificar los puntos críticos de la aplicación que consumen la mayor cantidad de tiempo de ejecución o recursos del sistema.

Los perfiladores pueden ayudar a los desarrolladores a identificar cuellos de botella, áreas de código ineficientes o subóptimas y ofrecer información detallada sobre el tiempo de ejecución y el uso de recursos, como la cantidad de tiempo de CPU utilizado, la memoria asignada y los eventos de E/S. Esto permite a los desarrolladores optimizar el rendimiento de sus aplicaciones al realizar cambios específicos en el código o en la configuración del sistema.

Existen diferentes tipos de perfiladores, como los perfiladores de CPU, que miden el tiempo de ejecución de cada función o método dentro de una aplicación y muestran la cantidad de tiempo que se consume en cada una. También hay perfiladores de memoria, que rastrean el uso de la memoria y pueden ayudar a identificar fugas de memoria o áreas donde se está utilizando una cantidad excesiva de memoria.

Usualmente el Profiling es utilizado durante el desarrollo de software como método para la depuración y optimización de los algoritmos, esta práctica vista de esta manera es buena, pero es vista más como una actividad interna que suele carecer de objetividad y veracidad cuando no es evaluado por personal realmente especializado y en el entorno adecuado para ello.[1]

El profiling se puede llevar a cabo en el código fuente o sobre un binario ejecutable mediante una herramienta llamada profiler.

Los profilers pueden clasificarse según la forma de recopilación de datos que utilicen, pudiendo destacar: basados en eventos, estadísticos, con instrumentación de código y como simulación.[2]

Historia

Las herramientas de análisis de rendimiento ya existían en las plataformas IBM S/360 y IBM System/370 de principios de 1970. Generalmente se basaba en un temporizador de interrupciones que se registraban en el programa de palabra de estado (Program status word, PSW) (que era un contador de programa y un registro de estado a la vez en estas arquitecturas) en intervalos establecidos para detectar hot spots en la ejecución del código.[3] Este fue un ejemplo temprano de muestreo en estadística que es un tipo que se verá a continuación. A principios de 1974, el simulador de conjunto de instrucciones permitió realizar trazas completas y otras funciones de supervisión del rendimiento.

Los programas analizadores de rendimiento en Unix se remontan al menos a 1979, cuando los sistemas Unix incluía la herramienta básica prof que aparece cada función y la cantidad de tiempo de ejecución del programa utilizado. En 1982, gprof extendió el concepto a un análisis llamado grafo de llamadas.[4]

En 1994, Amitabh Srivastava y Alan Eustace de Digital Equipment Corporation publican un artículo describiendo ATOM.[5] ATOM es una plataforma para convertir un programa en su propio profiler. Es decir, en tiempo de compilación, inserta el código en el programa a ser analizado. Ese código introducido produce salidas de datos de análisis. Esta técnica (modificar un programa para analizarse a sí mismo se conoce como instrumentación).

En 2004, tanto el "paper" de gprof como el de ATOM aparecieron en la lista de los 50 "papers" más influyentes de Programming Language Design and Implementation de todos los tiempos.[6]

Los perfiladores, en el ámbito de la computación, tienen una larga historia de desarrollo y evolución que se remonta a las primeras etapas de la informática. A continuación, menciona los los hitos importantes en la historia de los perfiladores:

  1. Años 1960: En esta época temprana de la computación, los sistemas eran limitados en recursos y capacidad de procesamiento. Los primeros perfiles de rendimiento se basaban principalmente en la observación y la intuición del programador para identificar áreas de código ineficientes.
  2. Años 1970: Con el crecimiento de la capacidad de procesamiento y la complejidad de los sistemas informáticos, surgieron las primeras herramientas de perfilado automatizadas. Estas herramientas permitían a los programadores realizar mediciones y análisis más precisos del rendimiento de sus programas.
  3. Años 1980: Con la aparición de lenguajes de programación más avanzados y sistemas operativos más sofisticados, los perfiladores comenzaron a proporcionar información más detallada, como el tiempo de ejecución de cada función o método.
  4. Años 1990: Con el auge de la programación orientada a objetos y la explosión de la web, los perfiladores se adaptaron para manejar sistemas más complejos y aplicaciones distribuidas. Surgieron herramientas más sofisticadas que permitían el análisis del rendimiento en entornos multiplataforma.
  5. Años 2000: Con el crecimiento exponencial de las aplicaciones web y móviles, los perfiladores se volvieron aún más importantes. Se desarrollaron herramientas específicas para optimizar el rendimiento en entornos web y móviles, lo que permitió a los desarrolladores analizar el rendimiento de sus aplicaciones en diferentes dispositivos y navegadores.
  6. Actualidad: En la actualidad, los perfiladores continúan evolucionando para satisfacer las necesidades de las aplicaciones modernas y los sistemas informáticos cada vez más complejos. Se han desarrollado herramientas avanzadas que pueden analizar el rendimiento en tiempo real, identificar cuellos de botella y sugerir mejoras automáticas para optimizar el rendimiento.


Los perfiladores han experimentado un desarrollo continuo a lo largo de la historia de la computación, adaptándose a medida que los sistemas y las aplicaciones se volvieron más complejos. Han pasado de depender de la intuición del programador a utilizar herramientas automatizadas y sofisticadas para medir y optimizar el rendimiento de las aplicaciones.

Recopilación de los eventos del programa

Los profilers utilizan una amplia variedad de técnicas para recopilar datos, incluyendo: interrupciones por hardware, instrumentación de código, simulador de conjunto de instrucciones, hooking y contadores de rendimiento de hardware. El profiling es la técnica más usada dentro de la ingeniería de rendimiento.

Aparte delo anterior, existen de igual manera herramientas para este fin, las herramientas de perfilado son herramientas de software que se utilizan para analizar y medir el rendimiento de una aplicación o sistema informático. Estas herramientas permiten a los desarrolladores identificar cuellos de botella en el código y mejorar el rendimiento de una aplicación. Algunas herramientas populares de perfilado incluyen: 

  • Profiler de CPU: Herramienta que mide el tiempo que tarda una aplicación en realizar una determinada tarea y el uso de la CPU durante ese tiempo.
  • Profiler de memoria: Herramienta que mide el uso de la memoria de una aplicación y detecta fugas de memoria.
  • Profiler de E/S: Herramienta que mide el tiempo que tarda una aplicación en realizar operaciones de entrada y salida.
  • Profiler de red: Herramienta que mide el tiempo que tarda una aplicación en enviar y recibir datos a través de una red.
  • Profiler de rendimiento web: Herramienta que mide el tiempo de carga de una página web y detecta cuellos de botella en el código.

Tipos de perfilaje

Perfilaje basado en líneas de código.

El perfilado de funciones es limitado cuando el programa contiene funciones extensas que ocupan la mayor parte del tiempo de ejecución. En estos casos, los perfiladores basados en líneas de código, como OProfile, son más útiles. Estos perfiladores requieren que los binarios tengan símbolos de depuración y se ejecuta un Daemon para recopilar datos de todos los binarios activos. Podemos extraer información de un binario específico en cualquier momento, mostrando las líneas de código con el número de muestreos y su porcentaje relativo. Sin embargo, debemos tener precaución con estos datos, ya que requieren coherencia en las tablas de símbolos generadas por el compilador para que coincidan correctamente con las instrucciones de la máquina en la memoria. El perfilado basado en líneas de código nos ayuda a identificar los puntos críticos de un programa llaman demasiadas veces. Al corregir estos problemas de diseño, se pueden mejorar significativamente el rendimiento del programa. Es importante tener en cuenta que el perfilado basado en líneas puede ser una técnica detallada y que requiere mucho tiempo y recursos.

Perfilajes basados en líneas

El perfilado basado en líneas es una técnica de análisis de rendimiento de programas de computadora que consiste en medir el tiempo de ejecución de cada línea de código individualmente. Para hacer esto, se utilizan herramientas de perfilado que generan un informe detallado que muestra cuánto tiempo se tarda en ejecutar cada línea de código en el programa. Esta técnica es útil porque permite a los desarrolladores identificar las líneas de código específicas que están causando cuellos de botella o problemas de rendimiento en el programa. Al analizar el informe generado por el perfilado basado en líneas, los desarrolladores pueden ver claramente las líneas de código que están consumiendo la mayor cantidad de tiempo de CPU y, por lo tanto, son los principales contribuyentes a los problemas de rendimiento. Además, el perfilado basado en líneas puede ayudar a los desarrolladores a identificar problemas específicos de diseño de código, como bucles anidados innecesarios, operaciones costosas o funciones que se

Perfilajes basados en el sentido común

  • Trabajar menos, es decir, reorganizar el código para realizar menos trabajo siempre que sea posible.
  • Evitar operaciones costosas, como las funciones trigonométricas o la exponenciación, y buscar alternativas más baratas. También es importante reducir el conjunto de trabajo del código, es decir, la cantidad de memoria que usa, para aumentar la probabilidad de aciertos en la memoria caché.
  • Eliminación de subexpresiones comunes es una técnica que busca ahorrar tiempo pre calculando partes de expresiones complejas y asignándolas a variables temporales antes de que comience una construcción de código que usa esas partes varias veces. En el caso de bucles, esta optimización también se denomina bucle de movimiento de código invariable.
  • Evitar ramas es otra técnica para mejorar el rendimiento. Los bucles "estrechos", es decir, los bucles que tienen pocas operaciones son candidatos típicos para canalización de software, desarrollo de bucles y otras técnicas de optimización. Si por alguna razón la optimización del compilador falla o es ineficiente, el rendimiento se verá afectado. Esto puede suceder fácilmente si el cuerpo del bucle contiene ramas condicionales.

Perfilaje de funciones

Una de las herramientas de perfilado más utilizada es gprof del paquete GNU binutils. Gprof usa la instrumentación de código y el muestreo para recoger un perfil funcional plano, así como un perfil de llamadas, también llamado gráfico de mariposa. Para poder perfilar, es necesario compilar nuestro código con ciertas instrucciones específicas (Para el compilador GCC existe -pg) y ejecutarlo una vez. Todo este proceso genera un archivo ilegible para nosotros con nombre ‘gmon.out’, este archivo será leído e interpretado por el propio gprof. El perfil plano obtenido contiene información acerca de los tiempos de ejecución de todas las funciones y la frecuencia con la que son llamadas.

Salida generada por un profiler

La salida que puede generar un profiler depende del mismo, generalmente son las siguientes:

  • Un resumen estadístico de los eventos observados (un perfil): Un resumen de la información del perfil se muestra a menudo anotado contra las declaraciones de código fuente donde se producen los eventos, por lo que el tamaño de los datos de medición es lineal para el tamaño del código del programa.
/* ------------ source------------------------- count */
0001             IF X = "A"                     0055
0002                THEN DO
0003                  ADD 1 to XCOUNT           0032
0004                ELSE
0005             IF X = "B"                     0055
  • Una secuencia de eventos grabados (un seguimiento): Para programas secuenciales, un perfil, es generalmente suficiente, pero los problemas de performance en programas paralelos (que esperan mensajes o temas de sincronismo) a menudo dependen de la relación temporal de los acontecimientos, por lo que requieren un seguimiento completo para obtener una comprensión de lo que está sucediendo.
  • Una interacción permanente con el hipervisor (vigilancia continua o periódica a través de la visualización en pantalla por ejemplo). Esto proporciona la oportunidad de cambiar un rastro o desactivarlo en cualquier momento que desee durante la ejecución, además de ver las métricas en curso sobre el programa (en ejecución). Además proporciona la oportunidad de suspender procesos asíncronos en los puntos críticos para examinar las interacciones con otros procesos paralelos en más detalle.

Tipos de profilers basados en su salida

  • Flat profilers: Calculan el tiempo promedio de las llamadas, y no se descomponen los tiempos de llamadas basado en el destinatario o el contexto de la misma.
  • Profiler de grafo de llamadas: Muestran los tiempos de llamada y las frecuencias de las funciones, así como las cadenas de llamadas en que participan basadas en el destinatario de la llamada. En algunas herramientas de contexto completo no se conserva.

Granularidad de los datos en los diferentes tipos de profilers

Los profilers, que también son propios programas, analizar programas específicos mediante la recopilación de información sobre su ejecución. Basado en su granularidad de datos, la forma en que los profilers recopilan información, se clasifican en profilers basados en eventos o estadísticos. Ya que los profilers interrumpen la ejecución del programa para recopilar información, tienen una resolución finita en las mediciones de tiempo, los cuales se deben tomar como un subconjunto del total de información.

Profilers de códigos

Siendo los perfiladores más populares, estos nos ayudan a poder realizar el análisis de toda la información recopilada sobre la ejecución y funcionamiento de un programa, como el tiempo de ejecución del programa o la cantidad de recursos utilizados para su funcionamiento; esto también aplica para partes específicas del programa (ej. las funciones del programa o sus variables utilizadas). Gracias a estos perfiladores, obtendremos un análisis detallado del rendimiento del código del programa, lo cual nos permitirá poder optimizarlo y tomar las medidas necesarias para mejorar su desempeño o de identificar errores de rendimiento en caso de necesitarlo.

Profilers en tiempo real

Existen herramientas de profiling que nos permiten analizar software en tiempo real, compilando los datos relevantes de rendimiento al mismo tiempo que el programa es ejectuado, dándonos un desglose de la información que permite identificar los posibles errores de este, facilitando la solución de problemas para el desarrollador.

Profilers en la nube

Gracias al avance de la tecnología en la actualidad, los profilers de la nube son una realidad y estos funcionan justo como un perfilador común, la diferencia es que estos están orientados específicamente al análisis de aplicaciones y software que se ejecute en la nube. Brindando ya no solo un análisis de programas, también un análisis orientado a la red y servidores que alojen estos programas.

Profilers basados en eventos

Los lenguajes de programación que se listan a continuación poseen un profiler basado en eventos:

Profilers estadísticos

Algunos profilers operan por muestreo. un profiler por muestreo prueba el "Program counter" del programa objetivo a intervalos regulares usando interrupciones del sistema operativo. Los profilers de muestreo son típicamente menos exactos numéricamente y específicos, pero permiten que el programa de destino funcione cerca de la velocidad máxima.

Profilers instrumentadores

Algunos profilers "instrumentan" el programa objetivo con instrucciones adicionales para recopilar la información necesaria.

Instrumentar el programa puede causar cambios en el rendimiento del programa, que pueden causar resultados inexactos y heisenbugs. Instrumentar siempre tendrá algún impacto en la ejecución del programa, por lo general siempre es más lento. Sin embargo, la instrumentación puede ser muy específica y ser controlada cuidadosamente para tener un impacto mínimo. El impacto sobre un programa en particular depende de la colocación de puntos de instrumentación y el mecanismo que se utiliza para capturar la traza. El soporte de hardware para capturar la traza significa que en algunos objetivos, la instrumentación puede tener sólo una instrucción de máquina. El impacto de la instrumentación a menudo se puede deducir (es decir, eliminada por sustracción) a partir de los resultados.

gprof es un ejemplo de un profiler que utiliza tanto la instrumentación y el muestreo. La instrumentación se utiliza para recopilar información de las llamadas y los valores de tiempo real se obtienen mediante muestreo estadístico.

Instrumentación

Esta técnica añade efectivamente instrucciones al programa de destino para recopilar la información requerida.

El efecto dependerá de qué información se está recopilando, del nivel de detalles de tiempo notificados y de si se utiliza la generación de perfiles de bloques básicos junto con la instrumentación.

La instrumentación es clave para determinar el nivel de control y la cantidad de resolución de tiempo disponible para los profilers. A continuación se enumeran todas las categorías:

  • Manual:
    Realizado por el programador, por ejemplo, añadiendo instrucciones para calcular explícitamente los tiempos de ejecución, simplemente cuente eventos o llamadas a API de 
    medición, como el estándar de medición de respuesta a aplicaciones.
  • Automática a nivel de código:
    Instrumentación agregada al código fuente por una herramienta automática según una directiva de instrumentación.
  • Asistida por el compilador
  • Translación binaria:
    La herramienta agrega instrumentación a un ejecutable compilado.
  • Instrumentación en tiempo de ejecución:
    Directamente antes de la ejecución se instrumenta el código. La ejecución del programa está totalmente supervisada y controlada por la herramienta.
  • Inyección en tiempo de ejecución:
    Más ligera que la instrumentación en tiempo de ejecución. El código se modifica en tiempo de ejecución para tener saltos a funciones auxiliares.

Interpretador de instrumentación

Las opciones del intérprete de depuración permiten habilitar la recopilación de métricas de rendimiento cuando el intérprete se encuentra con cada declaración de destino. Los bytecodes, tablas de control e intérpretes JIT son tres ejemplos que suelen tener un control completo sobre la ejecución del código de destino, lo que permite la oportunidad de recolectar datos muy completos.

Hipervisor/Simulador

  • Hipervisor: Los datos se recogen mediante la ejecución del programa (por lo general) no modificada bajo un hipervisor. Por ejemplo SIMMON.
  • Simulador y Hipervisor: Los datos son recogidos de forma interactiva y selectiva mediante la ejecución del programa sin modificar en el marco de un simulador de conjunto de instrucciones. Por ejemplo IBM OLIVER y SIMON

Herramientas de Perfilado

Son herramientas de software que se utilizan para analizar y medir el rendimiento de una aplicación o sistema informático. Estas herramientas permiten a los desarrolladores identificar cuellos de botella en el código y mejorar el rendimiento de una aplicación.

Algunas herramientas populares de perfilado incluyen:

  • Profiler de CPU: Herramienta que mide el tiempo que tarda una aplicación en realizar una determinada tarea y el uso de la CPU durante ese tiempo.
  • Profiler de memoria: Herramienta que mide el uso de la memoria de una aplicación y detecta fugas de memoria.
  • Profiler de E/S: Herramienta que mide el tiempo que tarda una aplicación en realizar operaciones de entrada y salida.
  • Profiler de red: Herramienta que mide el tiempo que tarda una aplicación en enviar y recibir datos a través de una red.
  • Profiler de rendimiento web: Herramienta que mide el tiempo de carga de una página web y detecta cuellos de botella en el código.


A continuación se listan algunas herramientas de perfilado, de acuerdo al lenguaje de programación que se utilice:

Java

  • Jprofiler

Es la herramienta más popular usada en aplicaciones estándar y empresariales ya que cuenta con una interfaz de usuario muy intuitiva, las características principales son el perfilamiento de hilos, encontrar fugas de memoria y resolver cuellos de botella. Es compatible con plataformas Windows, MacOs, Linux, FreeBSD, Solaris, AIX y HP-UX.

  • YourKit

Esta herramienta se utiliza para analizar el rendimiento de aplicaciones java en desarrollo y producción, cuenta con funciones básicas para visualizar hilos, recolecciones de basura, uso de memoria y fugas de memoria, con soporte para perfiles locales y remotos. También es útil para la creación de perfiles de CPU, que permiten la creación de perfiles enfocados en ciertas áreas de nuestro código, análisis de E/S y de multithreading. Es compatible con plataformas Windows, MacOs, lINUX, etc.

  • Java VisualVM

A diferencia de las anteriores, esta herramienta es gratuita y esta incluida en el Java Developer Kit: (JDK), Java VisualVM proporciona un conjunto de herramientas de análisis de rendimiento que incluyen monitoreo de memoria, análisis de CPU, análisis de hilos y un profiler de java.

  • NetBeans Profiler

Se incluye con el Netbeans IDE de código abierto de Oracle y es una buena opción cuando queremos que todo éste incluido en un solo programa (IDE+Profiler), es mayormente conocido por su debugger, pero el IDE incluye un perfilador ligero que permite monitorear el CPU y tiempo de ejecución.

  • IntelliJ Profiler

Esta herramienta es útil para la creación de perfiles de asignación de CPU y memoria, nos permite comenzar con unos pocos clics sin ningún tipo de configuración, además de que nos permite evaluar visualmente el rendimiento de diferentes enfoques y obtener información sobre las operaciones en tiempo de ejecución de manera rápida y eficiente.

C

  • Gproof

Es una herramienta de análisis de rendimiento que produce un perfil de ejecución de programas en C, Pascal o FORTRAN77, Gprof calcula la cantidad de tiempo empleado en cada rutina.  Después, estos tiempos se propagan a lo largo de los vértices del grafo de llamadas.

  • Intel VTune Profiler

Es una herramienta de análisis de rendimiento para plataformas x86 y x64 que proporciona una amplia variedad de información sobre el rendimiento del sistema, es de libre uso y con perfilamiento de memoria, CPU y análisis de almacenamiento en procesadores Intel.

  • oTools

Desde Mac nos permite traducir a lenguaje ensamblador el código de C.

  • Perf

Es una herramienta de perfilado de rendimiento de sistema en Linux que se utiliza para analizar la utilización de la CPU y la memoria, y para medir el rendimiento de aplicaciones.

  • Valgrind

Es una herramienta de depuración y perfilado de memoria que ayuda a detectar problemas de memoria, como fugas de memoria y errores de acceso.

Python

  • cProfile Viene incluido en la biblioteca estándar de python, éste rastrea el llamado de las funciones dentro del programa y genera una lista con las funciones que más tiempo tardan. Tiene tres puntos fuertes que son:
  1. Que se incluye con la biblioteca estándar.
  2. Que perfila una serie de estadísticas diferentes sobre el comportamiento de las llamadas, esto permite determinar si una función es lenta por sí misma o si llama a otras funciones que son lentas.
  3. Que puede restringir cProfile libremente, es decir, mostrar toda la ejecución de un programa o activar la creación de perfiles solo cuando se ejecuta la función seleccionada.
  • FunctionTrace

Simular a la herramienta anterior genera reportes de las funciones llamadas y la memoria usada por el programa en ejecución guardándolo en un JSON con posibilidad de usar el Firefox Profiler.

  • Line Profiler

Es una herramienta de perfilado que nos permite medir el tiempo de ejecución de cada línea de código en las funciones, además esta herramienta nos permite detectar los cuellos de botella de rendimiento y optimizar el código para mejorar el rendimiento.

  • PyInstrument

Similar a cProfile pero este nos brinda un informe de aquella parte del código que toma más tiempo, las principales diferencias son 2:

  1. Que muestrea la pila de llamadas del programa cada milisegundo, con lo que podemos detectar lo que está consumiendo la mayor parte del tiempo de ejecución.
  2. Que nos da informes más concisos, pues nos muestra las funciones principales del programa que consumen más tiempo.
  • Pyflame

Es una herramienta de perfilado que nos permite medir el tiempo de ejecución de cada función en el código de python. Es una herramienta de bajo impacto que no afecta significativamente el rendimiento de la aplicación.


Podemos observar que existen múltiples herramientas de perfilado y la elección del perfilador adecuado depende de las herramientas utilizadas, el nivel de análisis requerido y las características específicas del profiler, es por lo cual, es necesario considerar los requisitos de nuestro proyecto y la información específica que busquemos obtener, para después elegir él perfilador que más se adapte a nuestras necesidades. Por otro lado, otra de las consideraciones principales al elegir un profiler es que se deben considerar las tecnologías de perfilado, de las cuales se hablarán a continuación.

Tecnologías de Perfilado

Hay diversas tecnologías de perfilado ampliamente utilizadas para analizar el rendimiento de una aplicación o sistema en ejecución, permitiendo a los desarrolladores identificar cuellos de botella y otros problemas de rendimiento. Algunas de las tecnologías de perfilado que se utilizan comúnmente son:

  • Sampling Profiler

Un perfilador de muestreo es una herramienta que registra la ejecución de una aplicación en intervalos de tiempo predefinidos, tomando muestras de la pila de llamadas. Esto permite obtener una idea de qué partes del código están consumiendo más tiempo de CPU, lo que ayuda a identificar posibles problemas de rendimiento.

  • Tracing Profiler

Un perfilador de trazado realiza un seguimiento exhaustivo de todas las llamadas de función y eventos en el código, lo que brinda una visión completa de la ejecución. Aunque puede ser más lento que un perfilador de muestreo, ofrece una mayor precisión para identificar cuellos de botella y otros problemas.

  • Instrumentation Profiler

Un perfilador de instrumentación agrega código adicional a la aplicación para registrar datos de rendimiento durante la ejecución. Esto proporciona un nivel de información muy detallado, pero puede afectar significativamente el rendimiento de la aplicación.

  • Hardware Profiler

Un perfilador de hardware utiliza dispositivos especializados, como procesadores de rendimiento o analizadores lógicos, para medir el rendimiento de una aplicación. Aunque puede ofrecer una gran cantidad de información detallada, su configuración y costo son más complejos que otras opciones de perfilado.

  • Dynamic Tracing

Esta técnica utiliza herramientas como SystemTap o DTrace para monitorear y analizar en tiempo real el comportamiento del sistema. Proporciona información detallada sobre el rendimiento tanto de la aplicación como del sistema subyacente.

  • Memory Profiling

Esta técnica se utiliza para monitorear el rendimiento en el uso de memorias, aquí podremos realizar análisis relacionado con el uso de la memoria, la detección de fugas, la liberación de memoria y el análisis de su estructura. El profiling de memoria es útil para solucionar problemas que puedan afectar el rendimiento y que sean relacionados con optimización y desgaste de memoria.

  • Input/Output Profiling

El perfilado de entrada y salida se enfoca en analizar el rendimiento de operaciones como la lectura y escritura de archivos, de interacciones de bases de datos o de operaciones en la red, además de ayudarnos a encontrar e identificar llamadas costosas a operaciones de red o encontrar ineficiencias en la manipulación de archivos.

  • Net Performance Profiling

Con este método podremos analizar el rendimiento de aquellas aplicaciones o sistemas que estén en constante comunicación con una red, se encuentran relacionadas con los perfiladores de la nube ya que nos permitirán analizar parámetros como la velocidad de transferencia o la latencia de la red, además de identificar problemas de red como el tráfico de esta.

Sistemas distribuidos

Esta relación se basa directamente con el rastreo distribuido. Pero ¿Qué es el rastreo distribuido? El rastreo distribuido es un método que se utiliza para perfilar o supervisar el resultado de una solicitud que se ejecuta en un sistema distribuido.

Para obtener una visión precisa de un sistema distribuido, estas distintas métricas de nodos deben agruparse en una vista holística, esto significa que los sistemas y sus propiedades sean analizados en su conjunto y no solo a través de las partes que los componen.

Lo más común, es que las solicitudes que son enviadas a los sistemas distribuidos no se meten con todo el conjunto de los nodos del sistema, sino que solo van hacia un conjunto o ruta en concreto a través de los nodos. Para esto, el rastreo distribuido indica las rutas a las que se accede y permite que los equipos las analicervisen.

El rastreo distribuido se instala en cada nodo del sistema para permitir que los equipos pidan información acerca de los nodos como su estado y rendimiento con base en la solicitud enviada.

Este método de rastreo analiza las solicitudes de la aplicación a medida que fluyen desde los dispositivos del frontend hasta los servicios del backend y las bases de datos. Los desarrolladores pueden utilizar el rastreo distribuido para solucionar las solicitudes que presentan una alta latencia o errores.

¿Cómo funciona el rastreo distribuido?

Utilizar el rastreo distribuido es muy útil, pues con todo esto podemos obtener diversos beneficios para los programadores al momento de realizar los análisis correspondientes, entre los beneficios se puede destacar: Reducir el MTTD (Tiempo medio de detección) y el MTTR (Tiempo medio de reparación),comprender las relaciones de los servicios, Medir acciones específicas de los usuarios. Además, identifica los cuellos de botella y los errores del backend que están perjudicando la experiencia del usuario.

Sin embargo, no todo son ventajas con el rastreo distribuido, también con esto llegan algunas dificultades de su implementación: • Instrumentación manual MTTR: Algunas plataformas de rastreo distribuido requieren que se instrumente o modifique manualmente el código para iniciar el rastreo de las solicitudes. • Muestreo basado en el cabezal: Las plataformas de rastreo tradicionales tienden a muestrear aleatoriamente el rastreo justo cuando comienza cada solicitud. • Cobertura solo backend: A menos que utilice una plataforma de rastreo distribuido de end to end, se genera un ID de rastreo para una solicitud sólo cuando llega al primer servicio de backend. No tendrá visibilidad de la sesión de usuario correspondiente en el frontend.

Más adelánte se darán mayores detalles de estos aspectos.

En la arquitectura de microservicios, una aplicación se descompone en servicios modulares, cada uno de los cuales manejan una función central de la aplicación y suele ser gestionado por un equipo dedicado.

Los microservicios se utilizan para construir muchas aplicaciones modernas porque facilitan la prueba y el despliegue de actualizaciones rápidas y evitan un único punto de fallo. Sin embargo, puede ser difícil solucionar los problemas de los microservicios porque a menudo se ejecutan en un backend complejo y distribuido, y las solicitudes pueden implicar secuencias de múltiples llamadas a servicios por lo que al utilizar el rastreo distribuido de end to end, los desarrolladores pueden visualizar el recorrido completo de una solicitud, desde el frontend hasta el backend, y localizar cualquier fallo de rendimiento o cuello de botella que se haya producido por el camino.

Las plataformas de rastreo distribuido de end to end comienzan a recopilar datos en el momento en que se inicia una solicitud, como cuando un usuario envía un formulario en un sitio web. Esto desencadena la creación de un ID de rastreo único y un tramo inicial, llamado tramo padre, en la plataforma de rastreo.

Un rastreo representa toda la ruta de ejecución de la solicitud, y cada tramo en el rastreo representa una sola unidad de trabajo durante ese viaje, como una llamada a la API o una consulta a la base de datos. Cada vez que la solicitud entra en un servicio, se crea un tramo hijo de nivel superior. Si la solicitud realiza múltiples comandos o consultas dentro del mismo servicio, el tramo hijo de nivel superior puede actuar como padre de otros tramos hijos anidados debajo de él.

La plataforma de rastreo distribuido codifica cada tramo hijo con el ID de rastreo original y un ID de tramo único, datos de duración y error, y metadatos relevantes, como el ID del cliente o la ubicación.

Finalmente, todos los tramos se visualizan en un graph flame, con el tramo padre en la parte superior y los tramos hijos anidados debajo en orden de aparición.

Dado que cada tramo está cronometrado, los ingenieros pueden ver cuánto tiempo pasó la solicitud en cada servicio o base de datos, y priorizar sus esfuerzos de solución de problemas en consecuencia. Los desarrolladores también pueden utilizar el graph flame para determinar qué llamadas presentan errores.

Beneficios y desafíos del rastreo distribuido.

Los ingenieros de frontend, backend y de fiabilidad del sitio utilizan el rastreo distribuido para lograr los siguientes beneficios:

  • Reducir el MTTD (tiempo medio de detección) y el MTTR (tiempo medio de reparación, resolución, respuesta o recuperación: Si un cliente informa de que una función de una aplicación es lenta o no funciona, el equipo de soporte puede revisar el rastreo distribuido para determinar si se trata de un problema de backend.
  • Los ingenieros pueden entonces analizar el rastreo generado por el servicio afectado para solucionar rápidamente el problema. Si utiliza una herramienta de rastreo distribuido end to end, también podrá investigar los problemas de rendimiento del frontend desde la misma plataforma.
  • Comprender las relaciones de los servicios: Al ver el rastreo distribuido, los desarrolladores pueden entender las relaciones causa-efecto entre los servicios y optimizar su rendimiento. Por ejemplo, la visualización de un tramo generado por una llamada a la base de datos puede revelar que la adición de una nueva entrada en la base de datos provoca latencia en un servicio ascendente.
  • Medir acciones específicas de los usuarios: El rastreo distribuido ayuda a medir el tiempo que se tarda en completar acciones clave del usuario, como la compra de un artículo. El rastreo puede ayudar a identificar los cuellos de botella y los errores del backend que están perjudicando la experiencia del usuario.
  • Mejorar la colaboración y la productividad: En las arquitecturas de microservicios, diferentes equipos pueden ser propietarios de los servicios que intervienen en la realización de una solicitud. El rastreo distribuido deja claro dónde se ha producido un error y qué equipo es responsable de solucionarlo.
  • Mantener los Acuerdos de Nivel de Servicio (SLA): La mayoría de las organizaciones tienen acuerdos de nivel de servicio, que son contratos con los clientes u otros equipos internos para cumplir los objetivos de rendimiento. Las herramientas de rastreo distribuido agregan datos de rendimiento de servicios específicos, de modo que los equipos pueden evaluar fácilmente si están cumpliendo los SLA.

A pesar de estas ventajas, existen algunos retos asociados a la implementación del rastreo distribuido:

  • Instrumentación manual: Algunas plataformas de rastreo distribuido requieren que se instrumente o modifique manualmente el código para iniciar el rastreo de las solicitudes. La instrumentación manual consume un valioso tiempo de ingeniería y puede introducir errores en su aplicación, pero la necesidad de realizarla suele estar determinada por el lenguaje o el marco de trabajo que se desea instrumentar. La estandarización de las partes de su código a instrumentar también puede hacer que se pierdan los rastreos.
  • Muestreo basado en el cabezal: Las plataformas de rastreo tradicionales tienden a muestrear aleatoriamente el rastreo justo cuando comienza cada solicitud. Este enfoque hace que se pierdan rastros o que sean incompletos, con el muestreo basado en cabezas, las empresas no siempre pueden capturar los rastreos que son más relevantes para ellas, como las transacciones de alto valor o las solicitudes de los clientes empresariales.

Por el contrario, algunas plataformas modernas pueden ingerir todos sus rastros y basarse en decisiones basadas en la cola, lo que le permite capturar rastros completos que están etiquetados con atributos relevantes para el negocio, como el ID del cliente o la región.

  • Cobertura sólo de backend: A menos que utilice una plataforma de rastreo distribuido de end to end, se genera un ID de rastreo para una solicitud sólo cuando llega al primer servicio de backend. No tendrá visibilidad de la sesión de usuario correspondiente en el frontend.

Esto hace que sea más difícil determinar la causa raíz de una solicitud problemática y si un equipo del frontend o del backend debe solucionar el problema.

Un sistema de alto rendimiento puede generar millones de trazos por minuto, lo que dificulta la identificación y supervisión de los trazos más relevantes para sus aplicaciones. Afortunadamente, existen herramientas que te ayudan a sacar a la luz los datos de rendimiento más útiles.

Resume

Actualmente para poder realizar perfilados de programas existe una gran variedad herramientas y tecnologías que se han desarrollado a lo largo de los años por medio de las diversas metodologías que llegan a existir; sin embargo, a pesar de cumplir con su propósito estas presentan ventajas y desventajas que se deben considerar al momento de realizar el perfilado de nuestros programas. Por otra parte, el perfilado es de gran importancia para la programación incluyendo los sistemas distribuidos, ya que para estos resulta muy importante poder conocer que, a pesar de que los tiempos de comunicación entre dispositivos sea largo, siempre resulten más rápidos al momento de ejecutar acciones, ya que esto es parte fundamental del concepto de un sistema distribuido y sin un perfilado correcto podría cometerse el error de programar un conjunto de algortimos que tengan problemas al momento de compartir recursos y no elimine los cuellos de botella al momento de la ejecución del programa, o incluso que los programas que componen al sistema no logre n una descentralización de los recursos para el almacenamiento y procesamiento de información o datos es decir, que no cumpla con ser un sistema distribuido.

Véase también

Referencias

  1. Profiling. Estratecgias.
  2. Funcionalidad implementada por profilers.
  3. Computerworld 19 de septiembre de 1977
  4. gprof: a Call Graph Execution Profiler // Proceedings of the SIGPLAN '82 Symposium on Compiler Construction, SIGPLAN Notices, Vol. 17, No 6, pp. 120-126; doi:10.1145/800230.806987
  5. Amitabh Srivastava and Alan Eustace, "Atom: A system for building customized program analysis tools", 1994 (download) // Proceeding PLDI '94 Proceedings of the ACM SIGPLAN 1994 conference on Programming language design and implementation. Pages 196 - 205, doi:10.1145/773473.178260
  6. 20 Years of PLDI (1979–1999): A Selection, Kathryn S. McKinley, Editor

[1] Yegulalp. S. (23 mayo, 2022).9 fine libraries for profiling python code. Recuperado el 25 de marzo de 2023 de https://www.infoworld.com/article/3600993/9 -fine - libraries -for - profiling -python -code.html [2] Baeldung. (17 marzo, 2023). A guide to java profilers. Recuperado el 23 de marzo de 2023 de https://www.baeldung.com/java -profilers [3] ChatGPT. (s.f.). ChatGPT. Recuperado de https://chat.openai.com/chat (enlace roto disponible en Internet Archive; véase el historial, la primera versión y la última). [4] A. (2021b, diciembre 26). ¿Qué es el rastreo distribuido? Definición de SearchITOperations (Actualizado 2023). Krypton Solid. https://kryptonsolid.com/que -es -el -rastreo -distribuido -definicion -de - searchitoperations/ [5] Rastreo distribuido, OpenTracing y Elastic APM. (2019, 3 junio). Elastic Blog. https://www.elastic.co/es/blog/distributed -tracing -opentracing -and - elastic -apm [6] Why is Distributed Tracing in Microservices needed? (2022b, marzo 18). SigNoz. https://signoz.io/blog/distributed -tracing -in -microservices/ [7] Hager, G., & Wellein, G. (2010). Introduction to High Performance Computing for Scientists and Engineers. CRC Press.

Enlaces externos

Este artículo ha sido escrito por Wikipedia. El texto está disponible bajo la licencia Creative Commons - Atribución - CompartirIgual. Pueden aplicarse cláusulas adicionales a los archivos multimedia.