Datadog уменьшила размер Go-бинарников на 77% без потери функций. Как им это удалось?

Это вам не генерация ИИ-слопа

Обложка: Datadog уменьшила размер Go-бинарников на 77% без потери функций. Как им это удалось?

За пять лет размер артефактов Datadog Agent вырос с 428 МБ до 1,22 ГБ.

Новые фичи, интеграции, поддержка Kubernetes и облаков сделали продукт мощнее... и заметно тяжелее. Это стало проблемой для serverless, IoT и контейнеров.

Вместо того чтобы урезать функциональность, команда решила «переломить кривую роста». За полгода (v7.60.0 → v7.68.0) им удалось сократить размер Go-бинарников до 77%.

Аудит зависимостей: минус 36 МБ одной правкой

Первый шаг — полный разбор зависимостей. С помощью go list, goda и go-size-analyzer разработчики искали пакеты, которые подтягиваются в бинарник случайно.

В одном случае trace-agent тащил 526 пакетов Kubernetes из-за одной функции, которая фактически не использовала k8s-код. Перенос ее в отдельный пакет позволил компилятору выбросить все лишнее — минус 36 МБ.

И таких случаев нашли десятки.

Разблокировка «скрытой» оптимизации линкера

Вторая находка дала еще ~20% выигрыша. В Go есть оптимизация method dead code elimination, но она отключается, если используется reflect.MethodByName с динамическими именами (например, в text/template).

Команда нашла проблемные вызовы через -dumpdep и утилиту whydeadcode, пропатчила зависимости и даже форкнула text/template, чтобы отключить динамические вызовы методов. Результат — еще минус около 100 МБ.

Удаление plugin = минус 245 МБ

Самый неожиданный эффект дал пакет plugin. Его импорт заставлял линкер сохранять все методы типов, отключая оптимизацию.

Выяснилось, что зависимость приходила через containerd, хотя агент ее не использовал. После добавления build-тега и обновления зависимостей, основной Linux amd64-бинарник «похудел» на 245 МБ.

Итог

  • Security Agent: −77%
  • Process Agent: −74%
  • Trace Agent: −74%
  • Общий .deb: 1,22 ГБ → 688 МБ

И главное — все это без удаления функций. Только системная чистка зависимостей, грамотные build-теги и возвращение оптимизаций линкера.