Bpftime es un proyecto que se posiciona como un runtime y una VM que estan diseñados para ejecutar controladores eBPF en el espacio del 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 de llamadas al sistema.
Sobre bpftime
Una de las características destacadas de bpftime es su capacidad para reducir drásticamente la sobrecarga al eliminar cambios de contexto innecesarios. Comparado con el uso de las funciones uprobe y uretprobe proporcionadas por el kernel de Linux, bpftime puede lograr hasta diez veces más reducción en la sobrecarga con lo cual no solo se mejora el rendimiento, sino que también simplifica enormemente el proceso de depuración.
Se menciona que 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). Esta técnica implica la modificación del código de máquina de la aplicación en ejecución, donde las llamadas a llamadas al sistema, puntos de entrada y funciones locales se reemplazan por una transición a controladores de depuración.
Además, bpftime ofrece la ventaja de ser potencialmente utilizable en sistemas sin un kernel de Linux y no requiere privilegios elevados para cargar una aplicación eBPF en el kernel. Esto lo hace altamente accesible y versátil en una variedad de entornos y configuraciones de sistemas.
Bpftime ofrece una amplia gama de operaciones para manipular y controlar funciones, adjuntar controladores, filtrar llamadas al sistema y realizar diversas acciones, entre las cuales se incluyen:
- Reemplazo o modificación de funciones.
- Adjuntar controladores (ganchos) y filtros.
- Redireccionar, bloquear o reemplazar parámetros de llamadas al sistema.
- Interceptación de puntos de entrada y salida de funciones.
- Sustitución de un controlador en un desplazamiento arbitrario en el código.
Una característica notable de Bpftime es su capacidad para adjuntarse a cualquier proceso en ejecución en el sistema sin necesidad de reiniciarlo o reconstruirlo. La sustitución de Bpftime en procesos puede realizarse para ejecutar procesos a través de ptrace y cargarlos a través de LD_PRELOAD.
Con bpftime, los sistemas de seguimiento como BCC , bpftrace y Deepflow pueden ejecutarse 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.
Además, como parte de Bpftime, se está desarrollando un runtime que permite adjuntar programas eBPF a llamadas al sistema y probar puntos de seguimiento. La máquina virtual eBPF con JIT permite la ejecución aislada de programas eBPF en el nivel de proceso del usuario, con soporte para la compilación AOT. Un proceso en segundo plano facilita la interacción con el kernel y organiza la colaboración con el subsistema uprobe del kernel.
La máquina virtual eBPF se empaqueta como una biblioteca de complementos y proporciona una API similar a ubpf, lo que permite integrar la funcionalidad eBPF en otros proyectos de manera sencilla. Para adición resumida de datos de varios procesos, se admite la creación de mapas eBPF conjuntos ubicados en la memoria compartida.
En conjunto, Bpftime no solo ofrece un conjunto completo de herramientas para la manipulación y control de funciones en el runtime, sino que también facilita la integración de la funcionalidad eBPF en otros proyectos, proporcionando así una solución flexible y poderosa para diversas aplicaciones y escenarios de uso. Además, la compatibilidad con controladores eBPF estándar escritos para su uso en el kernel y el uso de herramientas estándar basadas en clang y libbpf para la compilación, garantizan una experiencia de desarrollo eficiente y consistente.
Para los interesados en el proyecto, debe saber que el código del proyecto está escrito en C/C++ y se distribuye bajo la licencia MIT, lo que garantiza su accesibilidad y transparencia para la comunidad.
Si quieres conocer más al respecto, puedes consultar los detalles en el siguiente enlace.