Colección del compilador BPF (BCC)
BCC es un conjunto de herramientas para crear programas eficientes de manipulación y seguimiento del kernel e incluye varias herramientas y ejemplos útiles. Utiliza BPF (filtros de paquetes de Berkeley) extendido, conocido formalmente como eBPF, una nueva característica que se agregó por primera vez a Linux 3.15. Gran parte de lo que utiliza BCC requiere Linux 4.1 y superior.
eBPF fue descrito por Ingo Molnár como:
Una de las características más interesantes de este ciclo es la capacidad de adjuntar programas eBPF (código de bytes en espacio aislado, definido por el usuario y ejecutado por el kernel) a kprobes. Esto permite la instrumentación definida por el usuario en una imagen del kernel en vivo que nunca puede fallar, bloquearse o interferir negativamente con el kernel.
BCC hace que los programas BPF sean más fáciles de escribir, con instrumentación del kernel en C (e incluye un contenedor de C alrededor de LLVM) y interfaces en Python y lua. Es adecuado para muchas tareas, incluido el análisis de rendimiento y el control del tráfico de red.
Captura de pantalla
Este ejemplo rastrea una función del kernel de E/S de disco y completa un histograma de potencia de 2 en el kernel del tamaño de E/S. Para mayor eficiencia, solo el resumen del histograma se devuelve al nivel de usuario.
# ./bitehist.py
Tracing... Hit Ctrl-C to end.
^C
kbytes : count distribution
0 - > 1 : 3 | |
2 - > 3 : 0 | |
4 - > 7 : 211 | ********** |
8 - > 15 : 0 | |
16 - > 31 : 0 | |
32 - > 63 : 0 | |
64 - > 127 : 1 | |
128 - > 255 : 800 | ************************************** |
El resultado anterior muestra una distribución bimodal, donde el modo más grande de 800 E/S tenía un tamaño de entre 128 y 255 Kbytes.
Ver la fuente: bithist.py. Lo que rastrea, lo que almacena y cómo se presentan los datos se puede personalizar por completo. Esto muestra sólo algunas de las muchas capacidades posibles.
Instalación
Consulte INSTALL.md para conocer los pasos de instalación en su plataforma.
Preguntas frecuentes
Consulte FAQ.txt para conocer las preguntas más comunes sobre solución de problemas.
guía de referencia
Consulte docs/reference_guide.md para obtener la guía de referencia de las API bcc y bcc/BPF.
Contenido
Algunos de estos son archivos únicos que contienen C y Python, otros tienen un par de archivos .c y .py, y algunos son directorios de archivos.
Rastreo
Ejemplos
- ejemplos/tracing/bitehist.py: histograma de tamaño de E/S del bloque. Ejemplos.
- ejemplos/tracing/disksnoop.py: seguimiento de la latencia de E/S del dispositivo de bloque. Ejemplos.
- ejemplos/hello_world.py: Imprime "¡Hola, mundo!" para nuevos procesos.
- ejemplos/tracing/mysqld_query.py: rastrea las consultas del servidor MySQL utilizando sondas USDT. Ejemplos.
- ejemplos/tracing/nodejs_http_server.py: rastrea las solicitudes del servidor HTTP de Node.js mediante sondas USDT. Ejemplos.
- ejemplos/tracing/stacksnoop: rastrea una función del kernel e imprime todos los seguimientos de la pila del kernel. Ejemplos.
- herramientas/statsnoop: Seguimiento de llamadas al sistema stat(). Ejemplos.
- ejemplos/tracing/task_switch.py: cuente los cambios de tarea con PID desde y hacia.
- ejemplos/tracing/tcpv4connect.py: rastrea conexiones activas TCP IPv4. Ejemplos.
- ejemplos/tracing/trace_fields.py: ejemplo simple de impresión de campos a partir de eventos rastreados.
- ejemplos/tracing/undump.py: volcar paquetes de socket UNIX. Ejemplos
- ejemplos/tracing/urandomread.py: un ejemplo de punto de seguimiento del kernel, que rastrea aleatoriamente:urandom_read. Ejemplos.
- ejemplos/tracing/vfsreadlat.py ejemplos/tracing/vfsreadlat.c: distribución de latencia de lectura VFS. Ejemplos.
- ejemplos/tracing/kvm_hypercall.py: puntos de seguimiento del kernel estáticos condicionales para ejemplos de entrada, salida e hiperllamada de KVM.
Herramientas
- herramientas/argdist: muestra los valores de los parámetros de función como un histograma o un recuento de frecuencia. Ejemplos.
- tools/bashreadline: imprime los comandos bash ingresados en todo el sistema. Ejemplos.
- tools/bpflist: muestra procesos con programas y mapas BPF activos. Ejemplos.
- herramientas/capaz: Seguimiento de comprobaciones de capacidad de seguridad. Ejemplos.
- herramientas/compactsnoop: rastrea eventos de zona compacta con PID y latencia. Ejemplos.
- tools/criticalstat: rastrea e informa secciones críticas atómicas largas en el kernel. Ejemplos
- herramientas/punto muerto: Detecta posibles puntos muertos en un proceso en ejecución. Ejemplos.
- herramientas/drsnoop: rastrea eventos de recuperación directa con PID y latencia. Ejemplos.
- herramientas/funccount: cuenta las llamadas a funciones del kernel. Ejemplos.
- herramientas/inyectar: Inyección de errores dirigida con cadena de llamadas y predicados Ejemplos.
- herramientas/klockstat: rastrea eventos de bloqueo mutex del kernel y muestra estadísticas de bloqueos. Ejemplos.
- herramientas/opensnoop: seguimiento de llamadas al sistema open(). Ejemplos.
- herramientas/readahead: muestra el rendimiento de los ejemplos de caché de lectura anticipada.
- herramientas/reset-trace: restablece el estado de rastreo. Sólo herramienta de mantenimiento. Ejemplos.
- herramientas/stackcount: cuenta las llamadas a funciones del kernel y sus seguimientos de pila. Ejemplos.
- herramientas/syncsnoop: Trace sync() llamada al sistema. Ejemplos.
- herramientas/threadsnoop: lista la creación de nuevos hilos. Ejemplos.
- herramientas/tplist: muestra puntos de seguimiento del kernel o sondas USDT y sus formatos. Ejemplos.
- herramientas/trace: rastrea funciones arbitrarias, con filtros. Ejemplos.
- tools/ttysnoop: mira la salida en vivo desde un dispositivo tty o pts. Ejemplos.
- herramientas/ucalls: resumir llamadas a métodos o llamadas al sistema de Linux en lenguajes de alto nivel. Ejemplos.
- herramientas/uflow: imprime un gráfico de flujo de método en lenguajes de alto nivel. Ejemplos.
- tools/ugc: rastrea eventos de recolección de basura en lenguajes de alto nivel. Ejemplos.
- herramientas/uobjnew: resume los eventos de asignación de objetos por tipo de objeto y número de bytes asignados. Ejemplos.
- herramientas/ustat: recopile eventos como GC, creación de subprocesos, asignaciones de objetos, excepciones y más en lenguajes de alto nivel. Ejemplos.
- herramientas/uthreads: rastrea eventos de creación de subprocesos en Java y pthreads sin formato. Ejemplos.
Herramientas de memoria y proceso
- tools/execsnoop: rastrea nuevos procesos mediante llamadas al sistema exec(). Ejemplos.
- herramientas/exitsnoop: Seguimiento de la terminación del proceso (señales de salida y fatales). Ejemplos.
- herramientas/killsnoop: Rastrea señales emitidas por la llamada al sistema kill(). Ejemplos.
- herramientas/kvmexit: muestra el motivo de salida y sus estadísticas de cada salida de VM. Ejemplos.
- herramientas/memleak: muestra asignaciones de memoria pendientes para encontrar pérdidas de memoria. Ejemplos.
- tools/oomkill: rastrea al asesino de la falta de memoria (OOM). Ejemplos.
- herramientas/pidpersec: Cuente nuevos procesos (mediante bifurcación). Ejemplos.
- tools/rdmaucma: rastrear eventos de acceso al administrador de conexión del espacio de usuario de RDMA. Ejemplos.
- herramientas/shmsnoop: llamadas al sistema de memoria compartida de Trace System V. Ejemplos.
- tools/slabratetop: Tasa de asignación de memoria caché de Kernel SLAB/SLUB superior. Ejemplos.
Herramientas de rendimiento y tiempo
- tools/dbslower: rastrea consultas MySQL/PostgreSQL más lentas que un umbral. Ejemplos.
- herramientas/dbstat: resume la latencia de consultas MySQL/PostgreSQL como un histograma. Ejemplos.
- herramientas/funcinterval: Intervalo de tiempo entre la misma función que un histograma. Ejemplos.
- herramientas/funclatencia: Funciones de tiempo y muestran su distribución de latencia. Ejemplos.
- tools/funcslower: rastrea llamadas lentas a funciones del usuario o del kernel. Ejemplos.
- herramientas/hardirqs: mide el tiempo del evento de IRQ duro (interrupción dura). Ejemplos.
- tools/mysqld_qslower: rastrea las consultas del servidor MySQL más lentas que un umbral. Ejemplos.
- tools/ppchcalls: resume los recuentos y latencias de llamadas ppc h. Ejemplos.
- herramientas/softirqs: mide el tiempo del evento IRQ suave (interrupción suave). Ejemplos.
- herramientas/syscount: resume los recuentos y latencias de llamadas al sistema. Ejemplos.
Herramientas de CPU y programación
- tools/cpudist: resume el tiempo dentro y fuera de la CPU por tarea como un histograma. Ejemplos
- tools/cpuunclaimed: Muestra de colas de ejecución de CPU y calcula la CPU inactiva no reclamada. Ejemplos
- tools/llcstat: resume las referencias de caché de la CPU y los errores por proceso. Ejemplos.
- herramientas/offcputime: resume el tiempo fuera de la CPU mediante el seguimiento de la pila del kernel. Ejemplos.
- herramientas/offwaketime: resume el tiempo bloqueado por la pila fuera de la CPU del kernel y la pila de activación. Ejemplos.
- herramientas/perfil: perfile el uso de la CPU mediante el muestreo de seguimientos de la pila en un intervalo de tiempo. Ejemplos.
- herramientas/runqlat: Latencia de la cola de ejecución (programador) como un histograma. Ejemplos.
- tools/runqlen: ejecuta la longitud de la cola como un histograma. Ejemplos.
- tools/runqslower: rastrea retrasos prolongados en la programación de procesos. Ejemplos.
- herramientas/tiempo de activación: resume el tiempo de suspensión a activación mediante la pila del kernel de activación. Ejemplos.
- herramientas/wqlat: resume la latencia de espera del trabajo en la cola de trabajo. Ejemplos.
Herramientas de red y sockets
- tools/gethostlatency: muestra la latencia para las llamadas getaddrinfo/gethostbyname[2]. Ejemplos.
- herramientas/bindsnoop: Rastree las llamadas al sistema bind() de IPv4 e IPv6 (bind()). Ejemplos.
- tools/netqtop tools/netqtop.c: rastrea y muestra la distribución de paquetes en colas de NIC. Ejemplos.
- herramientas/sofdsnoop: Seguimiento de FD pasados a través de sockets Unix. Ejemplos.
- herramientas/solisten: escucha de seguimiento del socket TCP. Ejemplos.
- herramientas/sslsniff: Sniff OpenSSL datos escritos y leídos. Ejemplos.
- herramientas/tcpaccept: Rastrea conexiones pasivas TCP (aceptar()). Ejemplos.
- herramientas/tcpconnect: Rastrea conexiones TCP activas (connect()). Ejemplos.
- tools/tcpconnlat: Rastrea la latencia de la conexión activa TCP (connect()). Ejemplos.
- tools/tcpdrop: rastrea las caídas de paquetes TCP basadas en el kernel con detalles. Ejemplos.
- tools/tcplife: rastrea sesiones TCP y resume la vida útil. Ejemplos.
- herramientas/tcpretrans: rastrea retransmisiones TCP y TLP. Ejemplos.
- tools/tcprtt: rastrea el tiempo de ida y vuelta de TCP. Ejemplos.
- herramientas/tcpstates: rastrea los cambios de estado de la sesión TCP con duraciones. Ejemplos.
- herramientas/tcpsubnet: resume y agrega el envío TCP por subred. Ejemplos.
- tools/tcpsynbl: muestra el trabajo pendiente de TCP SYN. Ejemplos.
- tools/tcptop: resume el rendimiento de envío/recepción de TCP por host. Arriba para TCP. Ejemplos.
- herramientas/tcptracer: Rastrea las conexiones establecidas por TCP (conectar(), aceptar(), cerrar()). Ejemplos.
- herramientas/tcpcong: Rastrea la duración del estado del control de congestión del socket TCP. Ejemplos.
Herramientas de almacenamiento y sistemas de archivos
- herramientas/tamaño de bocado: muestra el histograma de tamaño de E/S por proceso. Ejemplos.
- herramientas/cachestat: Rastreo de la proporción de aciertos/errores de la caché de la página. Ejemplos.
- tools/cachetop: Rastree la proporción de aciertos/errores de la caché de páginas por procesos. Ejemplos.
- tools/dcsnoop: seguimiento de búsquedas de caché de entradas de directorio (dcache). Ejemplos.
- tools/dcstat: estadísticas de caché de entrada de directorio (dcache). Ejemplos.
- herramientas/biolatencia: resume la latencia de E/S del dispositivo de bloque como un histograma. Ejemplos.
- herramientas/biotop: Parte superior para discos: resume las E/S del dispositivo de bloque por proceso. Ejemplos.
- herramientas/biopatrón: Identificar patrones de acceso al disco aleatorios/secuenciales. Ejemplos.
- herramientas/biosnoop: E/S del dispositivo de bloque de seguimiento con PID y latencia. Ejemplos.
- herramientas/dirtop: Lectura y escritura de archivos por directorio. Arriba para directorios. Ejemplos.
- tools/filelife: rastrea la vida útil de archivos de corta duración. Ejemplos.
- herramientas/filegone: rastrea por qué el archivo desapareció (eliminado o renombrado). Ejemplos.
- herramientas/fileslower: rastrea lecturas y escrituras lentas de archivos sincrónicos. Ejemplos.
- herramientas/filetop: lecturas y escrituras de archivos por nombre de archivo y proceso. Arriba para archivos. Ejemplos.
- tools/mdflush: seguimiento de eventos de mdflush. Ejemplos.
- herramientas/mountsnoop: rastrea las llamadas al sistema de montaje y desmontaje en todo el sistema. Ejemplos.
- herramientas/virtiostat: muestra estadísticas de E/S del dispositivo VIRTIO. Ejemplos.
Herramientas de sistemas de archivos
- tools/btrfsdist: resume la distribución de latencia de la operación btrfs como un histograma. Ejemplos.
- tools/btrfsslower: rastrea operaciones lentas de btrfs. Ejemplos.
- herramientas/ext4dist: resume la distribución de latencia de la operación ext4 como un histograma. Ejemplos.
- tools/ext4slower: rastrea operaciones ext4 lentas. Ejemplos.
- tools/nfsslower: rastrea operaciones NFS lentas. Ejemplos.
- tools/nfsdist: resume la distribución de latencia de operación NFS como un histograma. Ejemplos.
- herramientas/vfscount: cuenta las llamadas VFS. Ejemplos.
- herramientas/vfsstat: Cuente algunas llamadas VFS, con salida de columna. Ejemplos.
- tools/xfsdist: resume la distribución de latencia de operación XFS como un histograma. Ejemplos.
- tools/xfsslower: rastrea operaciones XFS lentas. Ejemplos.
- tools/zfsdist: resume la distribución de latencia de operación de ZFS como un histograma. Ejemplos.
- tools/zfsslower: rastrea operaciones lentas de ZFS. Ejemplos.
Redes
Ejemplos:
- ejemplos/networking/distributed_bridge/: ejemplo de puente distribuido.
- ejemplos/networking/http_filter/: ejemplo de filtro HTTP simple.
- ejemplos/networking/simple_tc.py: ejemplo de control de tráfico simple.
- ejemplos/networking/simulation.py: ayudante de simulación.
- ejemplos/networking/neighbor_sharing/tc_neighbor_sharing.py ejemplos/networking/neighbor_sharing/tc_neighbor_sharing.c: clasificación por IP y limitación de velocidad.
- ejemplos/networking/tunnel_monitor/: Supervise eficientemente los flujos de tráfico.
- ejemplos/networking/vlan_learning/vlan_learning.py ejemplos/vlan_learning.c: tráfico Ethernet Demux en espacios de nombres veth+trabajadores.
Introspección BPF
Herramientas que ayudan a introspeccionar los programas BPF.
- introspection/bps.c: enumera todos los programas BPF cargados en el kernel. 'ps' para programas BPF. Ejemplos.
Motivación
BPF garantiza que los programas cargados en el kernel no pueden fallar y no pueden ejecutarse para siempre, pero aún así BPF tiene un propósito general suficiente para realizar muchos tipos arbitrarios de cálculo. Actualmente, es posible escribir un programa en C que se compilará en un programa BPF válido, pero es mucho más fácil escribir un programa en C que se compilará en un BPF no válido (C es así). El usuario no sabrá hasta que intente ejecutar el programa si era válido o no.
Con una interfaz específica de BPF, uno debería poder escribir en un lenguaje y recibir comentarios del compilador sobre la validez de un backend de BPF. Este conjunto de herramientas tiene como objetivo proporcionar una interfaz que solo pueda crear programas BPF válidos y al mismo tiempo aprovechar su total flexibilidad.
Además, las integraciones actuales con BPF tienen un flujo de trabajo complicado, que a veces implica compilar directamente en un árbol de fuentes del kernel de Linux. Esta cadena de herramientas tiene como objetivo minimizar el tiempo que un desarrollador dedica a compilar BPF y, en cambio, centrarse en las aplicaciones que se pueden escribir y los problemas que se pueden resolver con BPF.
Las características de este kit de herramientas incluyen:
- Flujo de trabajo BPF de un extremo a otro en una biblioteca compartida
- Un lenguaje C modificado para backends BPF
- Integración con el backend llvm-bpf para JIT
- (Des)carga dinámica de programas JITed
- Soporte para ganchos del kernel BPF: filtros de socket, clasificadores tc, acciones tc y kprobes
- Enlaces para Python
- Ejemplos de filtros de socket, clasificadores tc y kprobes
- Herramientas autónomas para rastrear un sistema en ejecución
En el futuro, es probable que se admitan más enlaces además de Python. ¡Siéntete libre de agregar soporte para el idioma de tu elección y enviar una solicitud de extracción!
Tutoriales
- docs/tutorial.md: uso de herramientas bcc para resolver problemas de rendimiento, resolución de problemas y de red.
- docs/tutorial_bcc_python_developer.md: Desarrollo de nuevos programas bcc utilizando la interfaz Python.
Redes
En Red Hat Summit 2015, BCC se presentó como parte de una sesión sobre BPF. Se simula un entorno vxlan de múltiples hosts y se utiliza un programa BPF para monitorear una de las interfaces físicas. El programa BPF mantiene estadísticas sobre las direcciones IP internas y externas que atraviesan la interfaz, y el componente del espacio de usuario convierte esas estadísticas en un gráfico que muestra la distribución del tráfico en múltiples granularidades. Vea el código aquí.
Contribuyendo
¿Ya estás emocionado de enviar algún código? Aquí hay algunos recursos para unirse a las discusiones en la comunidad IOVisor y ver en qué quiere trabajar.
- Lista de correo: https://lists.iovisor.org/mailman/listinfo/iovisor-dev
- IRC: #iovisor en irc.oftc.net
- Rastreador de problemas de BCC: problemas de Github
- Una guía para contribuir con guiones: CONTRIBUTING-SCRIPTS.md
Enlaces externos
¿Busca más información sobre BCC y cómo se utiliza? Puede encontrar enlaces a otro contenido de BCC en la web en LINKS.md.