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 eficientes, seguros y no intrusivos que se ejecutan directamente en el espacio de kernel del sistema operativo (SO) Linux.

Debido a que pueden ejecutar programas en un entorno de pruebas en contextos privilegiados, como un kernel de SO, los eBPF pueden expandir las características del software existente en tiempo de ejecución sin modificar el código fuente del kernel, cargar módulos del kernel o interrumpir la ejecución general del programa. Las tecnologías eBPF representan una evolución del Berkeley Packet Filter (BPF) original, que proporcionó una manera 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 para realizar tareas más complejas dentro del kernel.

Al reconocer la necesidad de una tecnología más versátil, la comunidad Linux desarrolló eBPF, que se basó en las características de backend de BPF, pero amplió su programabilidad en el kernel. 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 cortafuegos y protocolos de depuración tanto en centros de datos en el sitio 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 que no están basadas en Linux puedan beneficiarse de las sofisticadas capacidades de rastreo, redes y monitoreo de eBPF.1 De hecho, eBPF Foundation— (una extensión de Linux Foundation, 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 eBPF, con la esperanza de ampliar eventualmente la utilidad de la programación eBPF.2

Solicite una demostración de Instana

Obtenga una demostración de IBM Instana Observability para ver cómo puede lograr observabilidad y monitoreo del lote completo en minutos.

Contenido relacionado

Suscríbase al boletín de IBM

Componentes de los programas eBPF

Los principales componentes de un programa eBPF son:

Código intermedio de eBPF

Los programas eBPF se escriben inicialmente en un subconjunto C restringido y luego se compilan en código intermedio (bytecode) de eBPF usando herramientas como LLVM, que funciona como arquitectura back-end del eBP para lenguajes de programación front-end como Clang. El código intermedio es esencialmente un conjunto restringido de instrucciones que se apegan a la arquitectura del conjunto de instrucciones eBPF y evitan errores de tiempo de ejecución.

Intérprete de eBPF/compilador JIT

La tecnología de kernel de Linux es capaz de traducir el código intermedio de eBPF en acciones ejecutables, pero los compiladores just-in-time (JIT) ofrecen un rendimiento superior. Los compiladores JIT pueden traducir código intermedio en 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 intermedio de eBPF en el kernel, lo adjuntan a los ganchos adecuados y gestionan cualquier mapa de eBPF asociado. Algunos ejemplos de cargadores de espacio de usuario son herramientas como BPF Compiler Collection (BCC) y bpftrace.   

Mapas de eBPF

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

Verificador de eBPF

El verificador, un componente crítico de los sistemas eBPF, verifica el código intermedio antes de cargarlo en el kernel 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 de eBPF

Los ganchos son puntos en el código del kernel donde se pueden adjuntar programas eBPF. Cuando el kernel llega a un gancho, ejecuta el programa eBPF adjunto.

Los diferentes tipos de ganchos, como puntos de seguimiento, kprobes y colas de recepción de paquetes de red, brindan a los programas eBPF un amplio acceso a los datos y les permiten realizar diversas operaciones. Los puntos de seguimiento, por ejemplo, permiten que los programas inspeccionen y recopilen datos sobre el kernel u otros procesos, mientras que los ganchos de control de tráfico se pueden utilizar 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 kernel, a veces los conjuntos de instrucciones básicas de eBPF no tienen los matices suficientes para realizar operaciones avanzadas. Las funciones auxiliares cierran esta brecha.

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

¿Cómo funciona eBPF?

Generalmente, los eBPF operan como virtual machines (VM) dentro del kernel de Linux, trabajando en una arquitectura de conjunto de instrucciones de bajo nivel y ejecutando código intermedio de eBPF. Sin embargo, el complejo proceso de ejecución de un programa eBPF tiende a seguir ciertos pasos importantes.

Primero, los desarrolladores escriben el programa eBPF y compilan el código intermedio. El propósito del programa establecerá el tipo de código apropiado. Por ejemplo, si un equipo desea monitorear el uso de CPU, escribirá un código que incluya funciones para registrar métricas de uso.

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

Con el código intermedio del programa y los mapas implementados, el eBPF ejecutará un proceso de verificación para garantizar que sea seguro ejecutar el programa en el kernel. Si se considera inseguro, la llamada al sistema para cargar el programa fallará y el programa del cargador recibirá un mensaje de error. Si el programa pasa la verificación, podrá ejecutarse.

Con un intérprete o un compilador JIT, el eBPF traducirá el código intermedio en un código de 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 kernel (por ejemplo, llamadas al sistema, eventos de red, inicio de procesos, inactividad de la CPU, etc.). Cuando ocurra un evento, el eBPF ejecutará el programa de código intermedio 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 con los mapas de eBPF. Por ejemplo, la aplicación puede comprobar periódicamente un mapa para recopilar datos del programa eBPF, o puede actualizar un mapa para cambiar el comportamiento del programa.

Descargar el programa es el último paso 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 de BPF para descargarlo del kernel, momento en el que el eBPF deja de ejecutarse y libera sus recursos asociados. El proceso de descarga también puede incluir la iteración sobre cualquier mapa de eBPF que el equipo ya no necesite para liberar elementos individuales útiles y, a continuación, eliminar el propio mapa (utilizando la llamada al sistema “delete”).

Casos de uso 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 kernel de Linux y que las empresas creen soluciones más innovadoras dentro del ecosistema Linux.

eBPF ha facilitado avances en: 

Redes

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 monitoreo de red. Las plataformas de código abierto, como Cilium, aprovechan eBPF para proporcionar redes seguras y escalables para Kubernetes (clústeres y cargas de trabajo), y otros microservicios en contenedores. Además, al aprovechar la lógica de reenvío de paquetes a nivel de kernel, los eBPF pueden optimizar los procesos de enrutamiento y permitir una respuesta general de red más rápida.

Observabilidad

Los eBPF permiten a los desarrolladores instrumentar el kernel 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, lo que permite el monitoreo y la observabilidad en tiempo real.

Seguridad

Los eBPF pueden supervisar las llamadas al sistema, el tráfico de red y el comportamiento del sistema para detectar y responder a posibles amenazas a la 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, mejorando la seguridad general del sistema.

Ajuste del rendimiento

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

Soluciones relacionadas
IBM Instana Observability

IBM Instana democratiza la observabilidad al proporcionar una solución que cualquier persona en DevOps, SRE, plataforma, ITOps y desarrollo puede usar para obtener los datos que desea con el contexto que necesita. Diseñada especialmente para la nube nativa pero independiente de la tecnología, la plataforma proporciona datos de alta fidelidad (1 segundo granularidad y rastreo de extremo a extremo) de manera automática y continua con el contexto de dependencias lógicas y físicas en dispositivos móviles, aplicaciones e infraestructura.

Explore Instana Solicite una demostración de Instana

IBM Turbonomic

La plataforma de optimización de costos de nube híbrida IBM Turbonomic le permite automatizar continuamente las acciones críticas en tiempo real que brindan de manera proactiva el uso más eficiente de los recursos de computación, almacenamiento y 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 y cualquiera pueden usar. Ofrece una rápida obtención de valor y al mismo tiempo verifica que su estrategia de observabilidad pueda mantenerse al día con 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 vivo
Notas de pie de página

Foundation propone promover la adopción de eBPF en múltiples OSes, (enlace externo a ibm.com)" DevOps.com, 21 de agosto de 2021

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