# Perf (Linux)

perf (a veces llamado perf_events o perf tools, originalmente Performance Counters para Linux, PCL) es una herramienta de análisis de rendimiento en Linux, disponible desde la versión 2.6.31 del núcleo Linux. Se accede a la utilidad de control del espacio de usuario, llamada perf, desde la línea de comandos y proporciona varios subcomandos; es capaz de realizar un perfil estadístico de todo el sistema (tanto el código del kernel como el del país de usuario).
Admite contadores de rendimiento de hardware, puntos de rastreo, contadores de rendimiento de software (por ejemplo, hrtimer) y sondas dinámicas (por ejemplo, kprobes o uprobes). En 2012, dos ingenieros de IBM reconocieron a perf (junto con OProfile) como una de las dos herramientas de perfilado de contadores de rendimiento más utilizadas en Linux.

## Implementación

La interfaz entre la utilidad perf y el kernel consta de una llamada al sistema y se realiza a través de un descriptor de archivos y una región de memoria con formato mm. A diferencia de las versiones LTTng o anteriores de oprofile, no se necesitan demonios de servicio, ya que la mayoría de las funciones están integradas en el núcleo. La utilidad perf descarga los datos sin procesar del búfer de mmapped al disco cuando el búfer se llena. Según R. Vitillo (LBNL), el perfil realizado por perf implica una sobrecarga muy baja.
A 2010, las arquitecturas que brindan soporte para los contadores de hardware incluyen x86, PowerPC 64, UltraSPARC (III y IV), ARM (v5, v6, v7, Cortex-A8 y -A9 ), Alpha EV56 y SuperH. El uso de Last Branch Records, una implementación de seguimiento disponible en CPU Intel desde Pentium 4, está disponible como un parche. Desde la versión 3.14 de la línea principal del núcleo Linux, lanzada el 31 de marzo de 2014, perf también admite el límite de potencia promedio (RAPL) para las mediciones de consumo de energía, que está disponible como una característica de ciertas CPU de Intel.
Perf es soportado de forma nativa en muchas distribuciones populares de Linux, incluyendo Red Hat Enterprise Linux (desde su versión 6 lanzada en 2010) y Debian (desde su versión Squeeze lanzada en 2011).

## Subcomandos

perf se utiliza con varios subcomandos:
* stat: mide el recuento total de eventos para un solo programa o para un sistema durante algún tiempo
* top: la parte superior vista -como dinámica de las funciones más calientes
* record: medir y guardar datos de muestreo para un solo programa
* report: analizar archivo generado por registro perf; Puede generar plano, o perfil gráfico.
* annotate: anotar fuentes o ensamblaje
* sched: seguimiento/medición de las acciones y latencias del programador.
* list: lista de eventos disponibles

## Críticas

La documentación de perf no es muy detallada (a partir de 2014); por ejemplo, no documenta la mayoría de los eventos ni explica sus alias (a menudo se usan herramientas externas para obtener nombres y códigos de eventos). Las herramientas de rendimiento tampoco pueden perfilar basándose en el tiempo real.
El subsistema de núcleos de Linux desde 2.6.37 hasta 3.8.8 y el kernel RHEL6 2.6.32 contenía una vulnerabilidad de seguridad (CVE-2013-2094), que fue explotada para obtener privilegios de root por parte de un usuario local. El problema se debió a que se usó un tipo incorrecto (32 bits int en lugar de 64 bits) en la ruta del código de verificación event_id.