Hola Habr! Les traigo a su atención una traducción de un artículo de Brendan Gregg en eBPF
Hubo al menos 24 presentaciones de eBPF en la conferencia Linux Plumbers. Rápidamente se convirtió no solo en una tecnología invaluable, sino también en una habilidad codiciada. Tal vez le gustaría establecer algunas metas para el nuevo año: ¡aprenda eBPF!
El término eBPF debería significar algo sustancial, como el Conjunto de instrucciones de kernel virtual (VKIS), pero su origen es un filtro de paquetes de Berkeley extendido. Es aplicable en muchas áreas, como el rendimiento de la red, firewalls, seguridad, rastreo y controladores de dispositivos. Para algunos de ellos, hay mucha información disponible gratuitamente en Internet, por ejemplo, rastreo, pero para otros todavía no. El término rastreo se refiere a herramientas de análisis de rendimiento y vigilancia que pueden generar información para cada evento. Es posible que ya haya utilizado un marcador: tcpdump y strace son trazadores especializados.
En esta publicación, voy a describir el proceso de estudiar el uso de eBPF para fines de rastreo, agrupados en secciones para usuarios principiantes, avanzados y avanzados. En resumen:
- Principiante: lanzamiento de herramientas bcc
- Experimentado: desarrollando herramientas bpftrace
- Avanzado: desarrollo de herramientas bcc , que contribuyen a bcc y bpftrace
Principiantes
1. ¿Qué son eBPF, bcc, bpftrace e iovisor?
eBPF hace lo mismo para Linux que JavaScript para HTML, más o menos. Entonces, en lugar de un sitio HTML estático, JavaScript le permite definir mini-programas que se ejecutan en eventos, como un clic del mouse, que se ejecutan en una máquina virtual segura en un navegador. Y con eBPF, en lugar de editar el núcleo, ahora puede escribir mini programas que se ejecutan en eventos como E / S de disco en una máquina virtual segura en el núcleo. De hecho, eBPF es más como una máquina virtual v8 que ejecuta JavaScript que el propio JavaScript. eBPF es parte del kernel de Linux.
La programación directa en eBPF es increíblemente difícil, al igual que en v8 bytecode. Pero nadie está codificando en v8: todos escriben en JavaScript, o a menudo en un marco sobre JavaScript (jQuery, Angular, React, etc.). Lo mismo con eBPF. La gente lo usará y escribirá código a través de marcos. Los principales para el rastreo son bcc y bpftrace . No viven en la base del código del núcleo; viven en el proyecto de la Fundación Linux en un github llamado iovisor .
2. ¿Es posible rastrear usando eBPF?
Esta utilidad basada en eBPF muestra sesiones TCP completamente establecidas con su ID de proceso (PID), nombre de comando (COMM), bytes enviados y recibidos (TX_KB, RX_KB) y duración en milisegundos (MS):
# tcplife PID COMM LADDR LPORT RADDR RPORT TX_KB RX_KB MS
22597 recordProg 127.0.0.1 46644 127.0.0.1 28527 0 0 0.23
3277 redis-serv 127.0.0.1 28527 127.0.0.1 46644 0 0 0.28
22598 rizo 100.66.3.172 61620 52.205.89.26 80 0 1 91.79
22604 rizo 100.66.3.172 44400 52.204.43.121 80 0 1 121.38
22624 recordProg 127.0.0.1 46648 127.0.0.1 28527 0 0 0.22
3277 redis-serv 127.0.0.1 28527 127.0.0.1 46648 0 0 0.27
22647 recordProg 127.0.0.1 46650 127.0.0.1 28527 0 0 0.21
3277 redis-serv 127.0.0.1 28527 127.0.0.1 46650 0 0 0.26
[...]
No, este eBPF lo hace posible: puedo reescribir tcplife para usar tecnologías de kernel más antiguas. Pero si lo hiciera, nunca podríamos ejecutar una herramienta de este tipo en producción debido a un rendimiento reducido, problemas de seguridad o ambos. eBPF ha hecho esta herramienta práctica : es eficiente y segura. Por ejemplo, no rastrea todos los paquetes, como se hizo con los enfoques anteriores, y eso podría conducir a una disminución excesiva en el rendimiento. En cambio, solo rastrea eventos de sesión TCP que ocurren con mucha menos frecuencia. Esto hace que la sobrecarga sea tan baja que podamos ejecutar esta herramienta en modo 24x7.
3. ¿Cómo uso esto?
Los principiantes deben comenzar a explorar bcc. Consulte las instrucciones de instalación de bcc para su sistema operativo. Para Ubuntu, se parece a esto:
# sudo apt-get update
# sudo apt-get install bpfcc-tools
# sudo / usr / share / bcc / tools / opensnoop PID COMM FD ERR RUTA
25548 gnome-shell 33 0 / proc / self / stat
10190 opensnoop -1 2 /usr/lib/python2.7/encodings/ascii.x86_64-linux-gnu.so
10190 opensnoop -1 2 /usr/lib/python2.7/encodings/ascii.so
10190 opensnoop -1 2 /usr/lib/python2.7/encodings/asciimodule.so
10190 opensnoop 18 0 /usr/lib/python2.7/encodings/ascii.py
10190 opensnoop 19 0 /usr/lib/python2.7/encodings/ascii.pyc
25548 gnome-shell 33 0 / proc / self / stat
29588 encuesta de dispositivo 4 0 / dev / bus / usb
^ C
Aquí terminé abriendo noop para probar la funcionalidad de las herramientas. Si has llegado hasta aquí, ¡definitivamente usaste eBPF!
Para empresas como Netflix y Facebook, bcc está instalado en todos los servidores de forma predeterminada. Tal vez quieras hacer lo mismo.
4. ¿Hay una guía para principiantes?
Sí, escribí una guía de bcc, que es un buen punto de partida para los novatos en el rastreo con eBPF:
Como principiante, no necesita escribir ningún código para eBPF. bcc ya contiene más de 70 herramientas que puede usar de inmediato. Esta guía lo guiará a través de los siguientes once pasos: execsnoop, opensnoop, ext4slower (o btrfs *, xfs *, zfs *), biolatency, biosnoop, cachestat, tcpconnect, tcpaccept, tcpretrans, runqlat y profile.
Después de haberlos probado, solo necesita saber que hay muchos otros medios:

También están completamente documentados con herramientas de página de manual y archivos de muestra. Los archivos de muestra (* _example.txt en bcc / tools) contienen capturas de pantalla con explicaciones: por ejemplo, biolatency_example.txt . Escribí muchos de ellos (tanto páginas de manual como herramientas) que se parecen a 50 publicaciones de blog adicionales, las encontrará en el repositorio de bcc.
Lo que falta son ejemplos de producción real. Escribí esta documentación cuando eBPF era tan nuevo que solo estaba disponible en nuestros entornos de prueba, por lo que la mayoría de los ejemplos son artificiales. Con el tiempo, agregaremos ejemplos del mundo real. Aquí es donde los principiantes pueden ayudar: si está resolviendo un problema, considere escribir un artículo y compartir capturas de pantalla o agregarlas como archivos de ejemplo.
Para experimentados
En este punto, ya debería ejecutar bcc y probar estas herramientas, así como estar interesado en modificarlas y escribir sus propias herramientas. La mejor manera es actualizar a bpftrace, que contiene un lenguaje de alto nivel que es mucho más fácil de aprender. La desventaja es que no es tan flexible como bcc, por lo que es posible que tenga restricciones y desee volver a bcc.
Consulte las instrucciones de instalación de bpftrace . Este es un proyecto más nuevo, por lo que al momento de escribir esto, los paquetes aún no se han compilado para todos los sistemas. En el futuro, debería ser apt-get install bpftrace o algo similar.
1. tutorial de bpftrace
Desarrollé un tutorial que enseña cómo usar bpftrace a través de una serie de una sola línea:
Hay 12 lecciones que le enseñarán cómo usar bpftrace paso a paso. Aquí hay un ejemplo:
# bpftrace -e 'tracepoint: syscalls: sys_enter_open {printf ("% d% s \ n", pid, str (args-> filename)); } ' Colocación de 1 sonda ...
181 / proc / cpuinfo
181 / proc / stat
1461 / proc / net / dev
1461 / proc / net / if_inet6
^ C
Utiliza la llamada de sistema abierto como un punto de rastreo para rastrear el PID y abrir rutas de archivos.
2. Guía de referencia de bpftrace
Para obtener más información sobre bpftrace, escribí una guía que contiene ejemplos de sintaxis, pruebas y comandos integrados:
Esto es por razones de brevedad: trato de colocar el título, el currículum y la captura de pantalla en una página. Creo que esto es demasiado largo, si está buscando algo y necesita desplazarse por la página varias veces.
3. bpftrace en ejemplos
Hay más de 20 herramientas en el repositorio de bpftrace que puede ver con ejemplos:
Por ejemplo:
# cat tools / biolatency.bt [...]
COMIENZA
{
printf ("E / S del dispositivo de bloque de rastreo ... Presione Ctrl-C para finalizar. \ n");
}
kprobe: blk_account_io_start
{
@start [arg0] = nsecs;
}
kprobe: blk_account_io_completion
/ @ start [arg0] /
{
@usecs = hist ((nsecs - @start [arg0]) / 1000);
eliminar (@start [arg0]);
}
Al igual que bcc, estas utilidades tienen páginas de manual y archivos de muestra. Por ejemplo, biolatency_example.txt .
Para avanzado
1. Estudiamos el desarrollo de bcc
Creé dos guías para ayudar:
También hay muchos ejemplos en bcc / tools / *. Py. Las herramientas Bcc constan de dos partes: código BPF para un núcleo escrito en C y una herramienta de nivel de espacio de usuario escrita en Python (o lua, o C ++). El desarrollo de las herramientas bcc es bastante avanzado y puede incluir algunos componentes pequeños del núcleo o elementos internos de la aplicación.
2. Participación en el desarrollo.
La ayuda es bienvenida con:
Para bpftrace, creé la guía de desarrollo interno bpftrace . Esto es difícil cuando programa en IR llvm, pero si está listo para aceptar el desafío ...
También está el núcleo de eBPF (también conocido como BPF): si observa los problemas de bcc y bpftrace, verá varias solicitudes de mejoras allí. Por ejemplo, la etiqueta del kernel en bpftrace . Consulte también la lista de correo netdev para conocer los últimos desarrollos del kernel BPF que se agregan a net-next antes de fusionarse con la línea principal de Linux.
Además de escribir código, también puede participar en pruebas, creación de paquetes, blogs y debates.
Conclusión
eBPF hace muchas cosas diferentes. En esta publicación, analicé el dominio de eBPF para el seguimiento y el análisis de rendimiento. En resumen:
- Principiante: lanzamiento de herramientas bcc
- Experimentado: desarrollando herramientas bpftrace
- Avanzado: desarrollo de herramientas bcc , que contribuyen a bcc y bpftrace
También tengo una página separada sobre eBPF Tracing Tools , que cubre todo esto con más detalle. Buena suerte