El proyecto bpftime desarrolla una implementación de eBPF en el espacio de usuario

Se presenta el proyecto bpftime, que desarrolla un runtime y una máquina virtual para ejecutar manejadores eBPF en el espacio de usuario. Bpftime permite que los programas de intervención de procesos y rastreo de eBPF se ejecuten completamente en el espacio del usuario, utilizando funciones como uprobe y la interceptación programática de llamadas al sistema. Cabe señalar que al eliminar los cambios de contexto innecesarios, bpftime puede lograr una reducción diez veces mayor en la sobrecarga en comparación con el uso de las funciones uprobe y uretprobe proporcionadas por el kernel de Linux. Además, bpftime simplifica enormemente la depuración, puede usarse potencialmente en sistemas sin un kernel de Linux y no requiere los privilegios elevados necesarios para cargar una aplicación eBPF en el kernel. El código del proyecto está escrito en C/C++ y se distribuye bajo la licencia MIT.

La interceptación de llamadas al sistema y la integración de comprobaciones de uprobe se implementan mediante la técnica de reescritura de código ejecutable (reescritura binaria), en la que las llamadas a llamadas al sistema, puntos de entrada y funciones locales se reemplazan por una transición a controladores de depuración mediante la modificación del código de máquina de la aplicación en ejecución, que es mucho más eficaz que organizar la interceptación utilizando uprobe a nivel del kernel de Linux.

Se admiten operaciones para reemplazar o cambiar funciones, adjuntar controladores (ganchos) y filtros, redirigir, bloquear o reemplazar parámetros de llamadas al sistema, interceptar puntos de entrada y salida de funciones, así como sustituir un controlador en un desplazamiento arbitrario en el código. Bpftime se puede adjuntar a cualquier proceso en ejecución en el sistema sin necesidad de reiniciarlo o reconstruirlo. La sustitución de bpftime en procesos se puede realizar para ejecutar procesos a través de ptrace y para cargarlos a través de LD_PRELOAD.

Como parte de bpftime, se está desarrollando un tiempo de ejecución que le permite adjuntar programas eBPF a llamadas al sistema y probar puntos de seguimiento; Máquina virtual eBPF con JIT para la ejecución aislada de programas eBPF en el nivel de proceso del usuario (también se admite la compilación AOT); un proceso en segundo plano para interactuar con el kernel y organizar la compatibilidad con el subsistema uprobe del kernel (bpftime admite el modo de cargar eBPF en el espacio del usuario desde el kernel para organizar la colaboración con los programas eBPF en el kernel, utilizado, por ejemplo, para procesar kprobe o configurar filtros de red).

La máquina virtual eBPF está diseñada como una biblioteca de complementos y proporciona una API similar a ubpf, que permite utilizarla para integrar la funcionalidad de eBPF en otros proyectos. Para la agregación resumida de datos de varios procesos, se admite la creación de mapas eBPF conjuntos ubicados en la memoria compartida. Junto con bpftime, se pueden usar controladores eBPF estándar escritos para su uso en el kernel, y se pueden usar herramientas estándar basadas en clang y libbpf para el ensamblaje.

Con bpftime, los sistemas de seguimiento como BCC, bpftrace y Deepflow se pueden ejecutar en el espacio del usuario. Por ejemplo, demostramos el uso del script sslsniff del marco BCC para analizar y guardar tráfico cifrado en nginx. En las pruebas realizadas, el rendimiento de nginx disminuye en un 58% cuando se ejecuta sslsniff en el lado del kernel y en un 12.3% cuando se mueve el controlador al espacio del usuario.

Arquitectura de seguimiento de procesos utilizando el eBPF original en el kernel:

El proyecto bpftime desarrolla una implementación de eBPF en el espacio de usuario

Arquitectura de seguimiento del espacio de usuario utilizando bpftime:

El proyecto bpftime desarrolla una implementación de eBPF en el espacio de usuario

Modo híbrido, en el que bpftime trabaja junto con eBPF en el kernel, por ejemplo, para instalar filtros de red o mover controladores individuales al espacio de usuario:

El proyecto bpftime desarrolla una implementación de eBPF en el espacio de usuario

Los planes futuros incluyen: la capacidad de sustituir excepciones (inyección de fallos); parcheo en caliente (Hot Patching) para cambiar la lógica de operación o corregir errores en ensamblajes binarios; crear un módulo para Nginx que le permita crear extensiones usando programas eBPF (por ejemplo, para selección dinámica de rutas, almacenamiento en caché, aplicación de políticas de seguridad y equilibrio de carga); ampliar las capacidades del subsistema FUSE (por ejemplo, crear extensiones del FS para almacenamiento en caché o control de acceso en forma de programas eBPF).

Fuente: opennet.ru

Añadir un comentario