Protobuf: serialización de datos y desafíos con Perfetto

Fuentes: schilk

Este artículo explica cómo funciona Protobuf (Protocol Buffers), un sistema de Google para serializar datos estructurados, y los desafíos que surgen al trabajar con trazas de datos muy grandes generadas por herramientas como Perfetto y CircumSpect. Protobuf permite definir mensajes con un lenguaje sencillo (.proto files) y generar código para diferentes lenguajes de programación que pueden codificar y decodificar estos mensajes en un formato binario común ('wire' format). Esto facilita la comunicación entre diferentes sistemas y lenguajes.

La utilidad principal de Protobuf radica en su eficiencia. En lugar de usar formatos de texto como XML o JSON, Protobuf utiliza un formato binario compacto, lo que resulta en archivos más pequeños y una serialización/deserialización más rápida. Perfetto, una herramienta de rastreo de rendimiento, utiliza Protobuf para almacenar información sobre eventos y rastros. CircumSpect y Tonbandgerät también se basan en este formato.

El problema surge cuando se trabaja con trazas muy grandes, que pueden alcanzar gigabytes. Protobuf, por defecto, serializa un mensaje 'Trace' (que contiene múltiples 'TracePacket's) cargando todo el rastreo en memoria antes de escribirlo en un archivo. Esto puede ser prohibitivo para trazas gigantescas. De manera similar, al procesar estas trazas, a menudo se necesita leer y procesar los 'TracePacket's individualmente, lo cual no es directamente soportado por las bibliotecas estándar de Protobuf.

La complejidad técnica reside en cómo Protobuf codifica los datos. Utiliza 'varints' (enteros de longitud variable) para optimizar el tamaño de los archivos, codificando números pequeños con menos bytes. Cada campo en un mensaje Protobuf tiene un 'field number' y un 'encoding id' que determinan cómo se codifica. Los mensajes anidados (como un 'TracePacket' dentro de un 'Trace') se codifican utilizando el esquema 'LEN', que incluye la longitud del mensaje anidado antes de su contenido. Comprender estos detalles es crucial para implementar soluciones que permitan la escritura y lectura 'streaming' de mensajes Protobuf, evitando la necesidad de cargar todo el rastreo en memoria.

En resumen, aunque Protobuf es una herramienta poderosa para la serialización de datos, trabajar con trazas muy grandes requiere una comprensión profunda de su formato interno y la capacidad de implementar soluciones personalizadas para la codificación y decodificación streaming.