Comando Linux bpftrace

Linux 命令大全Manual completo de comandos de Linux


bpftrace es una herramienta de rastreo avanzada basada en eBPF (Filtro de Paquetes Berkeley Extendido) que permite a los desarrolladores observar y analizar dinámicamente el estado de ejecución del sistema Linux sin modificar el código del kernel.

eBPF es una tecnología revolucionaria en el kernel de Linux que proporciona un entorno de máquina virtual seguro para ejecutar código definido por el usuario en el kernel. bpftrace se construye sobre eBPF y ofrece una capa de abstracción más simple y de mayor nivel.


Ventajas principales de bpftrace

Observación del sistema en tiempo real

  • Sin necesidad de reiniciar el sistema o las aplicaciones
  • Sobrecarga de rendimiento extremadamente baja
  • Puede observar programas del kernel y del espacio de usuario

Capacidades de sondeo flexibles

  • Admite múltiples tipos de puntos de sondeo: entrada/salida de funciones, temporizadores, eventos de hardware, etc.
  • Puede rastrear llamadas al sistema, eventos de red, E/S de disco, etc.

Lenguaje de scripting simple

  • Sintaxis similar a AWK, con una curva de aprendizaje suave
  • Funciones y variables integradas abundantes
  • Admite filtrado de condiciones y estadísticas de agregación

Instalación y configuración de bpftrace

Método de instalación

Ejemplo

# Ubuntu/Debian
sudo apt install bpftrace

# CentOS/RHEL
sudo yum install bpftrace

# Compilar desde el código fuente
git clone https://github.com/iovisor/bpftrace.git
mkdir bpftrace/build && cd bpftrace/build
cmake ..
make
sudo make install

Verificar la instalación

sudo bpftrace -e 'BEGIN { printf("Hello, bpftrace!n"); }'

Sintaxis básica de bpftrace

Un programa bpftrace se compone de puntos de sondeo (probe) y acciones asociadas (action). La estructura básica es la siguiente:

probe /filter/ {
    action
}

Tipos de puntos de sondeo

Tipo de punto de sondeo Descripción Ejemplo
kprobe Entrada de función del kernel kprobe:vfs_read
kretprobe Retorno de función del kernel kretprobe:vfs_read
uprobe Entrada de función de espacio de usuario uprobe:/bin/bash:readline
tracepoint Punto de rastreo estático del kernel tracepoint:syscalls:sys_enter_open
interval Disparo por temporizador interval:s:5
software Evento de software software:faults:major

Variables integradas comunes

  • pid: ID del proceso actual
  • tid: ID del hilo actual
  • comm: Nombre del proceso actual
  • nsecs: Marca de tiempo en nanosegundos
  • arg0-argN: Parámetros de la función
  • retval: Valor de retorno de la función

Ejemplos prácticos de bpftrace

1. Rastrear llamadas al sistema

Ejemplo

# Contar el número de llamadas al sistema open
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_open { @[comm] = count(); }'

2. Analizar el tiempo de ejecución de funciones

Ejemplo

# Medir el tiempo de ejecución de vfs_read
sudo bpftrace -e '
kprobe:vfs_read { @start[tid] = nsecs; }
kretprobe:vfs_read /@start[tid]/ {
    @times = hist(nsecs - @start[tid]);
    delete(@start[tid]);
}'

3. Monitorear el acceso a archivos de procesos

Ejemplo

# Rastrear los archivos abiertos por un proceso específico
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat /pid == 1234/ { printf("%s -> %sn", comm, str(args->filename)); }'

4. Contar conexiones TCP

Ejemplo

# Contar conexiones TCP por proceso
sudo bpftrace -e 'kprobe:tcp_connect { @[comm] = count(); }'

Características avanzadas de bpftrace

1. Función de mapa (Map)

bpftrace proporciona varios tipos de mapas integrados para la agregación de datos:

Ejemplo

# Histograma de estadísticas
@hist = hist(nsecs);

# Calcular el promedio
@avg = avg(nsecs);

# Contar valores únicos
@unique = count();

2. Filtrado de condiciones

Ejemplo

# Rastrear solo las llamadas read de un proceso específico
tracepoint:syscalls:sys_enter_read /pid == 1234/ {
    printf("PID %d reading %d bytesn", pid, args->count);
}

3. Combinación de múltiples sondas

Ejemplo

# Rastrear todo el proceso desde la creación del socket hasta la conexión
kprobe:sock_alloc {
    @socket[tid] = 1;
}

kprobe:tcp_connect /@socket[tid]/ {
    printf("socket %d connecting to %s:%dn", args->sock->__sk_common.skc_dport,
           ntop(args->sock->__sk_common.skc_daddr),
           args->sock->__sk_common.skc_dport);
    delete(@socket[tid]);
}

Mejores prácticas de bpftrace

  1. Limitar el alcance del rastreo: Usar PID o nombre de comando para filtrar, reduciendo la sobrecarga del sistema
  2. Evitar impresión excesiva: Demasiados printf pueden afectar el rendimiento
  3. Usar agregaciones: Utilice tanto como sea posible funciones de agregación como count(), sum(), etc.
  4. Limpiar recursos: Los scripts de larga duración deben limpiar los datos del mapa periódicamente
  5. Consideraciones de seguridad: bpftrace requiere permisos de root; ejecute scripts desconocidos con precaución

Comparación de bpftrace con otras herramientas

Herramienta Ventajas Desventajas
bpftrace Flexible, alto rendimiento y fácil de usar Requiere permisos de root
strace Simple, sin necesidad de compilar Alta sobrecarga de rendimiento
perf Completo en funciones, baja sobrecarga Curva de aprendizaje pronunciada
SystemTap Potente Requiere compilación y configuración compleja

Recursos de aprendizaje recomendados

  1. Documentación oficial de bpftrace
  2. Tutorial de una línea de bpftrace (one-liners)
  3. Repositorio de ejemplos de bpftrace

bpftrace es una herramienta poderosa para el análisis de rendimiento del sistema y la resolución de problemas. Al practicar estos ejemplos y dominar sus conceptos clave, podrás comprender y optimizar más profundamente el comportamiento operativo del sistema Linux.


Linux 命令大全Manual completo de comandos de Linux

Otras extensiones