Home TecnologíaReducción Tamaño Binarios Go: Optimización Agente Datadog

Reducción Tamaño Binarios Go: Optimización Agente Datadog

by Editor de Tecnologia

Después de que el Agente de Datadog creciera de 428 MiB a 1.22 GiB en un período de 5 años, los ingenieros de Datadog se propusieron reducir el tamaño de su binario. Descubrieron que la mayor parte de la hinchazón de los binarios de Go proviene de dependencias ocultas, optimizaciones de enlazador deshabilitadas y comportamientos sutiles en el compilador y el enlazador de Go.

Este crecimiento impactó tanto a nosotros como a nuestros usuarios: aumentaron los costos de red y el uso de recursos, la percepción del Agente empeoró y se hizo más difícil usar el Agente en plataformas con recursos limitados.

Para abordar esto, el ingeniero de software de Datadog, Pierre Gimalac, escribió que su enfoque consistió en auditar las importaciones, aislar el código opcional y eliminar los problemas de reflexión/plugins para reducir los binarios tanto como fuera posible.

De hecho, después de analizar el crecimiento del Agente, los ingenieros de Datadog descubrieron que estaba impulsado por nuevas funciones, integraciones adicionales y grandes dependencias de terceros (por ejemplo, los SDK de Kubernetes). En particular, el modelo de dependencias de Go incluye importaciones transitivas, lo que significa que incluso un pequeño cambio puede incluir cientos de paquetes.

Los ingenieros de Datadog idearon dos formas prácticas de eliminar dependencias innecesarias: usar etiquetas de compilación (//go:build feature_x) para excluir código opcional y mover el código a paquetes separados para que los paquetes no opcionales permanezcan lo más pequeños posible. Ambas técnicas requerían auditar sistemáticamente las importaciones para identificar qué archivos o paquetes se podrían excluir de una compilación determinada. Por ejemplo, simplemente mover una función a su propio paquete eliminó aproximadamente 570 paquetes y 36 MB de código generado de un binario que no lo usaba.

leer más  Jonathan Horst de MAC Address lanza canal de YouTube

Auditar las dependencias no es una tarea fácil, pero el ecosistema de Go proporciona tres herramientas útiles para ayudar: go list, que enumera todos los paquetes utilizados en una compilación; goda, que visualiza los gráficos de dependencia y las cadenas de importación para ayudar a comprender por qué se requiere una dependencia determinada; y go-size-analyzer, que muestra cuánto espacio contribuye cada dependencia a un binario.

Además de la optimización de dependencias, los ingenieros de Datadog obtuvieron una reducción de tamaño adicional del 20% minimizando el uso de la reflexión, que puede deshabilitar silenciosamente algunas optimizaciones del enlazador, incluida la eliminación de código muerto:

si usa un nombre de método no constante, el enlazador ya no puede saber en tiempo de compilación qué métodos se usarán en tiempo de ejecución. Por lo tanto, necesita mantener cada método exportado de cada tipo alcanzable, y todos los símbolos de los que dependen, lo que puede aumentar drásticamente el tamaño del binario final.

Para abordar este problema, eliminaron la reflexión dinámica siempre que fue posible, tanto en su base de código como en las dependencias. Este último paso requirió enviar varias solicitudes de extracción (PR) a proyectos como kubernetes/kubernetes, uber-go/dig, google/go-cmp y otros.

Otra característica que deshabilita la eliminación de código muerto son los plugins de Go, un mecanismo que permite a un programa de Go cargar dinámicamente código de Go en tiempo de ejecución. De hecho, simplemente importar el paquete plugin hace que el enlazador trate el binario como enlazado dinámicamente, “lo que deshabilita la eliminación de código muerto del método e incluso obliga al enlazador a mantener todos los métodos no exportados”. Este cambio produjo una reducción adicional de aproximadamente el 20% en algunas compilaciones.

leer más  Copilot .NET: Agentes C# y WinForms para Mejorar tu Código

Como nota final, Gimalac enfatiza que estas mejoras se lograron en un período de seis meses y, lo más importante, no requirieron eliminar ninguna función. Su relato incluye muchos más detalles de los que se pueden cubrir aquí, así que asegúrese de leerlo para conocer la historia completa.

You may also like

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.