Inicio Topics EBPF ¿Qué es eBPF?
Explore IBM Instana Observability
Diseño abstracto que representa la actividad del sistema operativo
¿Qué es eBPF?

Extended Berkeley Packet Filter (eBPF) es una tecnología de programación que permite a los desarrolladores escribir programas eficaces, seguros y no intrusivos que se ejecutan directamente en el espacio del núcleo del sistema operativo (SO) Linux.

Debido a que pueden ejecutar programas aislados en contextos privilegiados, como el núcleo de un sistema operativo, los eBPF pueden expandir las características del software existente en tiempo de ejecución sin modificar el código fuente del núcleo, cargar módulos del núcleo o interrumpir la ejecución general del programa. Las tecnologías eBPF representan una evolución del Berkeley Packet Filter (BPF) original, que proporcionaba una forma sencilla de seleccionar y analizar paquetes de red en un programa de espacio de usuario. Pero más allá del filtrado de paquetes, los programas BPF carecían de la flexibilidad necesaria para manejar tareas más complejas dentro del núcleo.

Al reconocer la necesidad de una tecnología más versátil, la comunidad Linux desarrolló eBPF, que se basaba en las funciones de backend de BPF pero ampliaba su programabilidad en el núcleo. La funcionalidad avanzada de los programas eBPF permite a los desarrolladores implementar procesos mejorados de filtrado de paquetes, realizar análisis de rendimiento de alta gama e instalar firewalls y protocolos de depuración tanto en centros de datos in situ como en entornos nativos de la nube.

Los avances en la tecnología eBPF han obligado a los desarrolladores de software a expandir sus aplicaciones a todos los sistemas operativos, de modo que las plataformas no basadas en Linux puedan aprovechar las sofisticadas capacidades de rastreo, redes y monitoreo de eBPF.1 De hecho, la Fundación eBPF, una extensión de la Fundación Linux cuyos miembros incluyen a Google, Meta, Netflix, Microsoft, Intel e Isovalent, entre otros, ha invertido mucho en la expansión de la compatibilidad del sistema operativo para los programas de eBPF, con la esperanza de ampliar eventualmente la utilidad de la programación de eBPF.2

Solicite una demostración de Instana

Obtenga una demostración de IBM Instana Observability para ver cómo puede lograr una observabilidad y supervisión de pila completa en minutos.

Contenido relacionado

Suscríbase al boletín de IBM

Componentes de los programas eBPF

Los componentes principales de un programa eBPF son:

Código de bytes eBPF

Los programas eBPF se escriben inicialmente en un subconjunto restringido de C y luego se compilan en código de bytes eBPF utilizando herramientas como LLVM, que sirve como arquitectura back-end de eBPF para lenguajes de programación front-end como Clang. El código de bytecode es básicamente un conjunto restringido de instrucciones que se adhieren a la arquitectura de conjunto de instrucciones eBPF y evitan errores en tiempo de ejecución.

Intérprete de eBPF/compilador JIT

La tecnología del núcleo de Linux es capaz de traducir el código byte eBPF en acciones ejecutables, pero los compiladores just-in-time (JIT) ofrecen un rendimiento superior. Los compiladores JIT pueden traducir el código de bytecode a código de máquina nativo para plataformas de hardware específicas sobre la marcha. 

Cargador de espacio de usuario

Los cargadores de espacio de usuario son programas en el espacio de usuario que cargan el código de bytecode eBPF en el núcleo, adjuntándolo a los enlaces apropiados y administrando cualquier mapa eBPF asociado. Algunos ejemplos de cargadores de espacio de usuario son herramientas como BPF Compiler Collection (BCC) y bpftrace.   

Mapas eBPF

Los mapas eBPF son estructuras de datos con pares clave-valor y acceso de lectura-escritura que proporcionan espacio de almacenamiento compartido y facilitan la interacción entre los programas del núcleo eBPF y las aplicaciones del espacio de usuario. Creados y gestionados mediante llamadas al sistema, los mapas eBPF también se pueden utilizar para mantener el estado entre las diferentes iteraciones de los programas eBPF.

Verificador eBPF

El verificador, un componente crítico de los sistemas eBPF, verifica el código de bytes antes de cargarlo en el núcleo para asegurarse de que el programa no contenga ninguna operación dañina, como bucles infinitos, instrucciones ilegales o acceso a memoria fuera de los límites. También garantiza que todas las rutas de datos del programa finalicen correctamente.

Ganchos eBPF

Los ganchos son puntos en el código del núcleo donde se pueden adjuntar programas eBPF. Cuando el núcleo alcanza un gancho, ejecuta el programa eBPF adjunto.

Los diferentes tipos de ganchos, como los puntos de seguimiento, los kprobes y las colas de recepción de paquetes de red, proporcionan a los programas eBPF un amplio acceso a los datos y les permiten realizar diversas operaciones. Los puntos de seguimiento, por ejemplo, permiten a los programas inspeccionar y recopilar datos sobre el núcleo u otros procesos, mientras que los ganchos de control de tráfico se pueden usar para inspeccionar y modificar paquetes de red.

Funciones auxiliares

Debido a que los eBPF no pueden generar funciones arbitrarias y deben mantener la compatibilidad con todas las versiones posibles del núcleo, a veces los conjuntos de instrucciones básicas de eBPF no están lo suficientemente matizados como para realizar operaciones avanzadas. Las funciones auxiliares cierran esta brecha.

Las funciones auxiliares (conjuntos de funciones del núcleo predefinidas y basadas en APIa las que eBPF puede llamar desde el sistema) permiten a los programas de eBPF realizar operaciones más complejas (como obtener la fecha y hora actuales o generar números aleatorios) que el conjunto de instrucciones no admite directamente.  

¿Cómo funciona eBPF?

Generalmente, los eBPF funcionan como máquinas virtuales (VM) dentro del núcleo de Linux, trabajando en una arquitectura de conjunto de instrucciones de bajo nivel y ejecutando el código de bytes eBPF. Sin embargo, el complejo proceso de ejecución de un programa eBPF tiende a seguir ciertos pasos principales.

Los desarrolladores escriben primero el programa eBPF y compilan el bytecode. El propósito del programa dictará el tipo de código apropiado. Por ejemplo, si un equipo desea supervisar el uso de la CPU, escribirá código que incluya la funcionalidad para capturar métricas de uso.

Una vez que el compilador eBPF convierte el código C de alto nivel en código de byte de nivel inferior, un cargador de espacio de usuario generará una llamada de sistema BPF para cargar el programa en el núcleo. El cargador también es responsable de abordar los errores y configurar los mapas eBPF que el programa necesita.

Con el código de bytes y los mapas del programa, el eBPF ejecutará un proceso de verificación para garantizar que el programa se ejecute de forma segura en el núcleo. Si se considera inseguro, la llamada del sistema para cargar el programa fallará y el programa del cargador recibirá un mensaje de error. Si el programa pasa la verificación, se le permite ejecutarse.

Mediante un intérprete o un compilador JIT, el eBPF traducirá el código de bytes a código máquina procesable. Sin embargo, eBPF es una tecnología basada en eventos, por lo que solo se ejecutará en respuesta a puntos de enganche o eventos específicos dentro del núcleo (por ejemplo, llamadas al sistema, eventos de red, inicio de procesos, inactividad de la CPU, etc.). Cuando ocurre un evento, el eBPF ejecutará el programa de código de bytes correspondiente, lo que permitirá a los desarrolladores inspeccionar y manipular varios componentes del sistema.

Una vez que se ejecuta el programa eBPF, los desarrolladores pueden interactuar con él desde el espacio de usuario utilizando mapas eBPF. Por ejemplo, la aplicación puede comprobar periódicamente un mapa para capturar datos del programa eBPF o actualizar un mapa para cambiar el comportamiento del programa.

La descarga del programa es el paso final de la mayoría de los procesos de ejecución de eBPF. Cuando el eBPF ha hecho su trabajo, el cargador puede volver a utilizar la llamada al sistema BPF para descargarlo del núcleo, momento en el que el eBPF deja de ejecutarse y libera sus recursos asociados. El proceso de descarga también puede incluir iterar sobre cualquier mapa eBPF que el equipo ya no necesite liberar elementos individuales útiles y, a continuación, eliminar el mapa en sí (usando la syscall "eliminar").

Casos prácticos y beneficios de eBPF

Las tecnologías eBPF ya se han convertido en una piedra angular de los sistemas Linux modernos, lo que permite un control detallado sobre el núcleo de Linux y permite a las empresas crear soluciones más innovadoras dentro del ecosistema Linux.

eBPF ha facilitado avances en: 

Conexión de red

eBPF permite a los desarrolladores instalar funciones de procesamiento de paquetes más rápidas y personalizadas, procesos de equilibrio de carga, scripts de creación de perfiles de aplicaciones y prácticas de monitorización de red. Las plataformas de código abierto, como Cilium, aprovechan eBPF para proporcionar redes seguras y escalables para clústeres y cargas de trabajo Kubernetes, y otros microservicios en contenedores. Además, al aprovechar la lógica de reenvío de paquetes a nivel de núcleo, los eBPF pueden agilizar los procesos de enrutamiento y permitir una respuesta global más rápida de la red.

Observabilidad

Los eBPF permiten a los desarrolladores instrumentar el núcleo y las aplicaciones de espacio de usuario para recopilar datos y métricas de rendimiento detallados sin afectar significativamente el rendimiento del sistema. Estas capacidades ayudan a las organizaciones a mantenerse a la vanguardia, permitiendo la monitorización y la observabilidad en tiempo real.

Seguridad

Los eBPF pueden monitorizar las llamadas del sistema, el tráfico de red y el comportamiento del sistema para detectar y responder a posibles amenazas de seguridad en tiempo real. Las soluciones de TI como Falco, por ejemplo, utilizan eBPF para implementar auditorías de seguridad en tiempo de ejecución y respuesta a incidentes, lo que mejora la seguridad general del sistema.

Ajuste del rendimiento

Al realizar un seguimiento de las llamadas del sistema, supervisar la utilización de la CPU y hacer un seguimiento de la utilización de los recursos (como E/S de disco), eBPF ayuda a los desarrolladores a analizar con mayor facilidad los cuellos de botella en el rendimiento del sistema e identificar oportunidades de optimización.

Soluciones relacionadas
IBM Instana Observability

IBM Instana democratiza la observabilidad proporcionando una solución que cualquier persona de DevOps, SRE, plataforma, ITOps y desarrollo puede utilizar para obtener los datos que desean con el contexto que necesitan. Diseñada específicamente para aplicaciones nativas de la nube pero independientes de la tecnología, la plataforma proporciona datos de alta fidelidad de forma automática y continua (granularidad de 1 segundo y trazas de extremo a extremo) con el contexto de las dependencias lógicas y físicas entre dispositivos móviles, web, aplicaciones e infraestructura.

Explore Instana Solicite una demostración de Instana

IBM Turbonomic

La plataforma de optimización de costes de cloud híbrido IBM Turbonomic le permite automatizar continuamente acciones críticas en tiempo real que ofrecen de forma proactiva el uso más eficiente de los recursos informáticos, de almacenamiento y de red a sus aplicaciones en cada capa de la pila. 

Explore Turbonomic Pruebe Turbonomic gratis
Dé el siguiente paso

IBM Instana proporciona observabilidad en tiempo real que todos pueden utilizar. Proporciona un tiempo de obtención de valor rápido a la vez que verifica que su estrategia de observabilidad pueda seguir el ritmo de la complejidad dinámica de los entornos actuales y futuros. Desde dispositivos móviles hasta mainframe, Instana es compatible con más de 250 tecnologías y sigue creciendo. 

Explore IBM Instana Reserve una demostración en directo
Notas a pie de página

La Fundación propone una adopción avanzada de eBPF en múltiples sistemas operativos, (enlace externo a ibm.com)" DevOps.com, 21 de agosto de 2021

Los últimos avances de eBPF son acosadores de cambios importantes en TI (enlace externo a ibm.com), DevOps.com, 13 de septiembre de 2023