Perf- Una herramienta de análisis y supervisión del rendimiento para Linux


Cuando hablamos de rendimiento en informática, 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 competencia feroz entre empresas, es importante que aprendamos a utilizar lo que tenemos al máximo de su capacidad. El desperdicio 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 simplemente 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 en el que el uso sostenido produzca daños irreparables.

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

Introducción e instalación de Perf en Linux

Entre otros, Linux proporciona una herramienta de análisis y supervisión del 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 del 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 monitorear 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-generic en mi caso), es posible que tenga que escribir linux-tools-3.2.0-23 en su 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 sobre XEN).

Además, tenga en cuenta que algunos comandos perf pueden estar restringidos a root de forma predeterminada, lo que puede deshabilitarse (hasta que se reinicie el sistema) 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 subcomandos disponibles (puede pensar en los subcomandos como opciones especiales que abren una ventana específica en el sistema). Para obtener resultados mejores y más completos, use perf como root o mediante sudo.

perf list (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 list 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. La ejecución del comando dd tomó 21.812281 milisegundos de CPU. Si dividimos este número por el valor de "segundos transcurridos" a continuación (23,914596 milisegundos), se obtiene 0,912 (CPU utilizada).
  2. Mientras se ejecutaba el comando, 15 cambios de contexto (también conocidos como cambios de proceso) indican que las CPU se cambiaron 15 veces de un proceso (o subproceso) a otro.
  3. 2 migraciones de CPU es el resultado esperado cuando en una CPU de 2 núcleos la carga de trabajo se distribuye uniformemente entre el número de núcleos.
    Durante ese tiempo (21,812281 milisegundos), el número total de ciclos de CPU que se consumieron fue 62,025,623, que dividido por 0,021812281 segundos da 2,843 GHz.
  4. Si dividimos el número de ciclos por el recuento total de instrucciones, obtenemos 4.9 ciclos por instrucción, lo que significa que cada instrucción tomó casi 5 ciclos de CPU para completarse (en promedio). Podemos culpar de esto (al menos en parte) a la cantidad de ramas y fallos de rama (ver más abajo), que terminan desperdiciando o haciendo un mal uso de los ciclos de la CPU.
  5. Cuando se ejecutó el comando, se encontraron un total de 3,552,630 ramas. Esta es la representación a nivel de CPU de los puntos de decisión y los bucles en el código. Cuantas más ramas, menor rendimiento. Para compensar esto, todas las CPU modernas intentan predecir el flujo que tomará el código. 51,348 errores de rama indican que la función de predicción fue incorrecta el 1,45% de las veces.

El mismo principio se aplica a la recopilación de estadísticas (o en otras palabras, la creación de perfiles) mientras se ejecuta una aplicación. Simplemente inicie la aplicación deseada y después 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, puede 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 , mostrará todos los tipos de eventos conocidos, mientras que la opción -e le permitirá elegir una categoría de evento específica (como lo devuelve la lista de perfiles) :

Mostrará el evento de todos los ciclos.

perf top -a 

Mostrará todos los eventos relacionados con el reloj de la CPU.

perf top -e cpu-clock 

La primera columna del resultado anterior representa el porcentaje de muestras tomadas desde el comienzo de la ejecución, agrupadas por función Símbolo y Objeto compartido. Más opciones están disponibles en man perf-top.

perf record ejecuta un comando y guarda los datos estadísticos en un archivo llamado perf.data dentro del directorio de trabajo actual. Funciona 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

El informe de rendimiento formatea los datos recopilados en los datos de rendimiento anteriores 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 list, stat, top, record o report. Estos son los subcomandos que se utilizan con más frecuencia; 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 análisis y monitoreo del rendimiento para Linux. Le recomendamos encarecidamente que se familiarice con su 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 utilizar otras alternativas.

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