Perf- Una herramienta de monitoreo y análisis de rendimiento para Linux


Cuando hablamos de rendimiento en computación, nos referimos a la relación entre nuestros recursos y las tareas que nos permiten completar en un período de tiempo determinado.

En un día de feroz competencia entre empresas, es importante que aprendamos a usar lo que tenemos de la mejor manera posible. La pérdida de recursos de hardware o software, o la falta de capacidad para saber cómo usarlos de manera más eficiente, termina siendo una pérdida que no podemos permitirnos si queremos estar en la cima de nuestro juego.

Al mismo tiempo, debemos tener cuidado de no llevar nuestros recursos a un límite donde el uso sostenido produzca un daño irreparable.

En este artículo, le presentaremos una herramienta de análisis de rendimiento relativamente nueva y proporcionaremos consejos que puede utilizar para monitorear sus sistemas Linux, incluidos el hardware y las aplicaciones. Esto le ayudará a asegurarse de que funcionen para que pueda producir los resultados deseados sin perder recursos ni su propia energía.

Introduciendo e instalando Perf en Linux

Entre otros, Linux proporciona una herramienta de monitoreo y análisis de rendimiento llamada convenientemente perf . Entonces, ¿qué distingue a perf de otras herramientas conocidas con las que ya está familiarizado?

La respuesta es que perf proporciona acceso a la Unidad de supervisión de rendimiento en la CPU y, por lo tanto, nos permite observar de cerca el comportamiento del hardware y sus eventos asociados.

Además, también puede supervisar eventos de software y crear informes a partir de los datos que se recopilan.

Puede instalar perf en distribuciones basadas en RPM con:

# yum update && yum install perf     [CentOS / RHEL / Fedora]
# dnf update && dnf install perf     [Fedora 23+ releases]

En Debian y derivados:

# sudo aptitude update && sudo aptitude install linux-tools-$(uname -r) linux-tools-generic

Si uname -r en el comando anterior devuelve cadenas adicionales además de la versión real ( 3.2.0-23-genérico en mi caso), puede que tenga que escribir linux-tools-3.2.0-23 en lugar de usar la salida de uname .

También es importante tener en cuenta que perf produce resultados incompletos cuando se ejecuta en un invitado encima de VirtualBox o VMWare, ya que no permiten el acceso a contadores de hardware como lo hacen otras tecnologías de virtualización (como KVM o XEN). .

Además, tenga en cuenta que algunos comandos perf pueden estar restringidos a la raíz de forma predeterminada, que se pueden desactivar (hasta que el sistema se reinicie) haciendo lo siguiente:

# echo 0 > /proc/sys/kernel/perf_event_paranoid

Si necesita deshabilitar el modo paranoico de forma permanente, actualice la siguiente configuración en el archivo /etc/sysctl.conf .

kernel.perf_event_paranoid = 0

Una vez que haya instalado perf , puede consultar su página de manual para obtener una lista de los subcomandos disponibles (puede pensar en los subcomandos como opciones especiales que abren una ventana específica en el sistema). Para obtener mejores y más completos resultados, use perf como root o mediante sudo .

La lista de resultados (sin opciones) devuelve todos los tipos de eventos simbólicos (lista larga). Si desea ver la lista de eventos disponibles en una categoría específica, use perf seguida del nombre de la categoría ([ hw | sw | cache | tracepoint | pmu | event_glob ]), como:

Muestra la lista de eventos predefinidos de software en Linux:

# perf list sw 

perf stat ejecuta un comando y recopila estadísticas de rendimiento de Linux durante la ejecución de dicho comando. ¿Qué sucede en nuestro sistema cuando ejecutamos dd ?

# perf stat dd if=/dev/zero of=test.iso bs=10M count=1

Las estadísticas que se muestran arriba indican, entre otras cosas:

  1. The execution of the dd command took 21.812281 milliseconds of CPU. If we divide this number by the “seconds time elapsed” value below (23.914596 milliseconds), it yields 0.912 (CPU utilized).
  2. While the command was executed, 15 context-switches (also known as process switches) indicate that the CPUs were switched 15 times from one process (or thread) to another.
  3. 2 CPU migrations is the expected result when in a 2-core CPU the workload is distributed evenly between the number of cores.
    During that time (21.812281 milliseconds), the total number of CPU cycles that were consumed was 62,025,623, which divided by 0.021812281 seconds gives 2.843 GHz.
  4. If we divide the number of cycles by the total instructions count we get 4.9 Cycles Per Instruction, which means each instruction took almost 5 CPU cycles to complete (on average). We can blame this (at least in part) on the number of branches and branch-misses (see below), which end up wasting or misusing CPU cycles.
  5. As the command was executed, a total of 3,552,630 branches were encountered. This is the CPU-level representation of decision points and loops in the code. The more branches, the lower the performance. To compensate for this, all modern CPUs attempt to predict the flow the code will take. 51,348 branch-misses indicate the prediction feature was wrong 1.45% of the time.

El mismo principio se aplica a la recopilación de estadísticas (o, en otras palabras, a la creación de perfiles) mientras se ejecuta una aplicación. Simplemente inicie la aplicación deseada y luego de un período de tiempo razonable (que depende de usted) ciérrela, y perf mostrará las estadísticas en la pantalla. Al analizar esas estadísticas puedes identificar problemas potenciales.

perf top es similar al comando top, ya que muestra un perfil del sistema casi en tiempo real (también conocido como análisis en vivo).

Con la opción -a , se mostrarán todos los tipos de eventos conocidos, mientras que la opción -e le permitirá elegir una categoría de evento específica (según lo devuelto por lista de resultados ):

Mostrará todos los ciclos del evento.

perf top -a 

Mostrará todos los eventos relacionados con cpu-clock.

perf top -e cpu-clock 

La primera columna en la salida anterior representa el porcentaje de muestras tomadas desde el inicio de la ejecución, agrupadas por función Símbolo y Objeto compartido. Hay más opciones disponibles en man perf-top .

El registro perf ejecuta un comando y guarda los datos estadísticos en un archivo llamado perf.data dentro del directorio de trabajo actual. Se ejecuta de manera similar a perf stat .

Escriba perf record seguido de un comando:

# perf record dd if=/dev/null of=test.iso bs=10M count=1

informe de rendimiento formatea los datos recopilados en perf.data arriba en un informe de rendimiento:

# sudo perf report

Todos los subcomandos anteriores tienen una página de manual dedicada que se puede invocar como:

# man perf-subcommand

donde subcomando es lista , stat , top , record o informe . Estos son los subcomandos más utilizados; otros se enumeran en la documentación (consulte la sección Resumen para el enlace).

Resumen

En esta guía, le presentamos perf , una herramienta de monitoreo y análisis de rendimiento para Linux. Le recomendamos que se familiarice con la documentación que se mantiene en https://perf.wiki.kernel.org.

Si encuentra aplicaciones que consumen un alto porcentaje de recursos, puede considerar modificar el código fuente o usar otras alternativas.

Si tiene preguntas sobre este artículo o sugerencias para mejorar, todos somos oídos. No dude en comunicarse con nosotros utilizando el formulario de comentarios a continuación.