bpftrace es una herrameinta avanzada de rastreo dinámico construida sobre la infraestructura eBPF. Permite una visión detallada del comportamiento tanto a nivel de núcleo como en el espacio de usuario mediante un lenguaje de scripting de alto nivel.
Requisitos del sistema
- Núcleo de Linux: Versión 4.9 como mínimo; se requiere la serie 5.x para funcionalidad completa.
- Distribuciones populares: Soporte completo a partir de Ubuntu 18.04 y CentOS 8, aunque este último con limitaciones en versiones anteriores.
- Sistemas nacionales (China): Disponibilidad en OpenEuler 22.03 (núcleo 5.10) y soporte parcial en Kylin V10.
Monitoreo de llamadas al sistema
Conteo de invocaciones
Para obtener un histograma de la frecuencia de cada llamada al sistema:
bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[str(args->id)] = count(); }'
Rastreo de funciones del núcleo
Se puede interceptar cualquier función interna del núcleo. Por ejemplo, para ver los picos de asignación de memoria:
bpftrace -e 'kprobe:__alloc_pages_nodemask { @[kstack] = count(); }'
Análisis de rendimiento
Perfiles de uso de CPU
Generar datos para un gráfico de llamas (flame graph) que muestre los puntos calientes de la CPU:
bpftrace -e 'profile:hz:99 { @[ustack] = count(); }' > perf_stack.log
Latencia en operaciones de E/S
Medir la distribución de tiempos de respuesta de solicitudes de bloques de disco:
bpftrace -e 'tracepoint:block:block_rq_issue { @start = nsecs; }
tracepoint:block:block_rq_complete /@start/ {
@latencia_us = hist((nsecs - @start) / 1000);
clear(@start);
}'
Seguridad y auditoría
Alerta por acceso a archivos sensibles
Disparar una alerta en tiempo real cuando se intenta leer el archivo de contraseñas del sistema:
bpftrace -e 'tracepoint:syscalls:sys_enter_openat {
if (str(args->filename) == "/etc/shadow") {
printf("ALERTA: Proceso %s (PID %d) intentó acceder a shadow.\n", comm, pid);
}
}'
Seguimiento de ejecución de comandos
Registrar los comandos ejecutados por el sistema, útil para detectar actividades inusuales:
bpftrace -e 'tracepoint:syscalls:sys_enter_execve {
printf("PID: %d | Comando: %s\n", pid, str(args->argv[0]));
}'
Observación en entornos de contenedores
El poder de bpftrace se extiende al interior de los contenedores. Para identificar las operaciones de archivo que ocurran dentro de un cgroup específico:
bpftrace -e 'tracepoint:syscalls:sys_enter_openat /cgroup == "kubepods"/ {
printf("cgroup: %s | Proceso: %s | Fichero: %s\n",
cgroup, comm, str(args->filename));
}'