Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial Internet of Things >> Tecnología de Internet de las cosas

Perfilado de aplicaciones distribuidas con Perf

Yo, como muchos desarrolladores, he estado en situaciones en las que necesitaba tomar una aplicación existente y hacerla más rápida, básicamente eliminando el código lento y reemplazándolo con código rápido. Ahora sé que debo seguir una regla simple cuando se trata de optimizar el código:

Cualquiera que sea el código que creo que ralentiza la aplicación, es donde debería buscar por último.

La creación de perfiles es un oficio que te hace aceptar las limitaciones de tu intuición muy rápidamente. Desde el principio me di cuenta de que necesitaba mediciones frías y estrictas para decirme qué partes de mi código necesitaban optimizarse. Afortunadamente, hay una gran cantidad de herramientas de creación de perfiles disponibles que pueden medir casi cualquier cosa relacionada con el funcionamiento de su código.

Sin embargo, las herramientas no facilitan necesariamente la creación de perfiles. La interpretación de las mediciones puede ser complicada y las variables deben controlarse estrictamente al realizar experimentos. En particular, las aplicaciones distribuidas y de subprocesos múltiples son difíciles de perfilar.

Cualquiera que haya tenido que depurar una condición de carrera estará familiarizado con lo sensible al tiempo que es el comportamiento de las aplicaciones multiproceso. La creación de perfiles de aplicaciones de subprocesos múltiples presenta desafíos similares, ya que la sincronización se convierte en un factor importante en la medición.

Los perfiladores como callgrind ralentizan significativamente su programa y, por lo tanto, afectan el tiempo. Un ejemplo que muestra una limitación de tales perfiladores es la contención de mutex. Es posible que su aplicación se ejecute lentamente porque un mutex se usa mucho, lo que hace que su código pase mucho tiempo en funciones de bloqueo. Una herramienta como callgrind no revelaría esto, ya que cuenta con instrucciones , sin tiempo.

Hay otra clase de perfiladores que realizan "perfiles estadísticos". Estos perfiladores le permiten ejecutar su programa como lo haría normalmente, mientras toma instantáneas periódicas de dónde pasa el tiempo la aplicación. Estos perfiladores deben funcionar durante algún tiempo para producir resultados precisos, pero pueden hacerlo con un impacto mínimo en el tiempo. ¡Eso los convierte en una excelente opción para la creación de perfiles de aplicaciones multiproceso y / o distribuidas!

Quería compartir un flujo de trabajo de creación de perfiles utilizando la herramienta perf de Linux, que me pareció especialmente útil ya que me permite identificar rápidamente los "puntos calientes" de rendimiento. Usaré el ejemplo c / hello_dynamic de RTI Connext 5.3.0 como objetivo para medir el rendimiento.

Primero, asegúrese de que perf esté instalado en su máquina Linux. En Ubuntu, tuve que ejecutar este comando para instalar perf en mi máquina:

 sudo apt-get install linux-tools-common linux-tools-3.13.0-107-generic 

A continuación, debe descargar un proyecto de GitHub que pueda convertir la salida de perf a lo que se denomina "FlameGraph", que es una representación visual de los datos de creación de perfiles recopilados. Ejecute este comando desde una ubicación a la que sea conveniente acceder (como su directorio de inicio):

 clon de git https://github.com/brendangregg/FlameGraph 

Ahora navegue hasta el ejemplo hello_dynamic en la carpeta rti_workspace / examples / c. Cree el código con estos comandos (asegúrese de que NDDSHOME esté configurado para la instalación de RTI Connext):

 exportar DEBUG =1 
make -f makefile_Hello_x64Linux3gcc4.8.2

La plataforma en el nombre del archivo MAKE puede ser diferente de su plataforma. Observe cómo configuramos la variable de entorno DEBUG. Hacemos esto para que el binario tenga símbolos de depuración, lo que nos permitirá ver los nombres de las funciones en las pilas de llamadas que perf genera.

Ahora podemos ejecutar perf en nuestro código. Ejecute los siguientes comandos:

 objs / x64Linux3gcc4.8.2 / Hola sub &
sudo perf record -g objs / x64Linux3gcc4.8.2 / Hola pub

Después de un tiempo, presione control-C para salir del editor. Perf habrá producido un archivo llamado "perf.out". Ahora necesitamos traducir este archivo a algo que comprenda la herramienta FlameGraph, usando un script del repositorio FlameGraph:

 secuencia de comandos perf -f | ~ / FlameGraph / stackcollapse-perf.pl> out.perf-folded 

Desde aquí, podemos generar la imagen FlameGraph:

 ~ / FlameGraph / flamegraph.pl out.perf-folded> perf.svg 

Cuando abre el archivo perf.svg en un navegador web, debería verse así:


El eje horizontal representa el tiempo dedicado a una función en particular, mientras que las barras apiladas representan la pila de llamadas de su aplicación. Puede hacer clic en cada barra para acercar esa pila en particular.

Intente volver a ejecutar el editor, pero sin un suscriptor. Notará que la parte derecha del flamegraph desaparecerá, ya que DDS no envía ningún dato cuando no hay suscriptores.

La herramienta perf puede hacer mucho más de lo que describe este blog. Si conoce otras configuraciones o herramientas que le hayan facilitado la vida de la creación de perfiles, ¡háganoslo saber!

¡Feliz perfil!


Tecnología de Internet de las cosas

  1. ¿Se combinará el molibdeno con otros elementos?
  2. Creación de aplicaciones híbridas de blockchain / nube con Ethereum y Google
  3. Creación de aplicaciones móviles sin servidor con React Native y AWS
  4. Circuito de sensor de proximidad simple y trabajo con aplicaciones
  5. Tipos de sensores analógicos y digitales con aplicaciones
  6. 4 aplicaciones ZigBee que tal vez desee crear con otro protocolo
  7. Microchip:escale aplicaciones espaciales con MCU Core tolerantes a la radiación de COTS
  8. Elimine los cuellos de botella de TI con simplicidad:las plataformas de código bajo contienen la clave
  9. Ovo mejora su juego de energía distribuida con la red inteligente VCharge buy
  10. Enrutador CNC para madera:con impresionantes aplicaciones
  11. 5 aplicaciones del mundo real de la IA en medicina (con ejemplos)