Datadog, Go 바이너리 크기 77% 줄이는 데 성공!

by DD
3개월 전
조회수 16

Datadog는 Go 바이너리 크기 증가 문제를 해결하기 위해 의존성 분석(Dependency Auditing), 링커 최적화(Linker Optimization), 코드 리팩토링(Code Refactoring)을 진행함

불필요한 Kubernetes 의존성 제거(Kubernetes Dependency Removal)를 통해 36MB, Method Dead Code Elimination을 통해 20%의 바이너리 크기 감소를 달성함

go-size-analyzergoda와 같은 도구를 활용하여 의존성 시각화(Dependency Visualization)영향 분석(Impact Analysis)을 수행함

reflect 패키지 사용(reflect Package Usage)으로 인한 링커 최적화 비활성화 문제를 해결하고, 플러그인 패키지(Plugin Package) import로 인한 크기 증가 문제를 해결함

커뮤니티에서는 Datadog의 기술적 접근 방식에 대한 긍정적 평가(Positive Evaluation)와 함께, 추가적인 최적화 방법(Additional Optimization Methods)에 대한 논의가 이루어짐

의존성 분석을 통한 바이너리 크기 감소

Datadog는 go listgoda를 활용하여 바이너리에 포함된 패키지를 분석하고, 불필요한 의존성을 제거했다. 특히, Kubernetes 관련 의존성(Kubernetes Dependencies)이 trace-agent 바이너리에 포함되어 30MB 이상의 크기를 차지하는 것을 확인하고, 해당 기능을 별도의 패키지로 분리하여 36MB의 크기를 줄였다. 이러한 의존성 관리(Dependency Management)를 통해 바이너리 크기를 효과적으로 감소시켰다.

Method Dead Code Elimination 최적화

Datadog는 reflect 패키지(reflect Package) 사용으로 인해 링커 최적화가 비활성화되는 문제를 해결하기 위해, whydeadcode 툴을 사용하여 원인을 분석했다. Method Dead Code Elimination을 통해 20%의 바이너리 크기 감소를 달성했으며, text/template 및 html/template 패키지를 포크(Fork)하여 문제를 해결했다. 이러한 노력은 코드 최적화(Code Optimization)의 중요성을 보여준다.

플러그인 패키지 import로 인한 크기 증가 문제

amd64 아키텍처에서 plugin 패키지(plugin Package) import로 인해 링커가 모든 심볼을 유지하는 문제가 발생했다. Datadog는 goda를 사용하여 문제의 원인을 추적하고, containerd 패키지에 빌드 태그를 추가하여 이 문제를 해결했다. 이로 인해 Linux amd64 바이너리에서 245MB의 크기를 추가적으로 줄일 수 있었다. 이는 빌드 시스템 최적화(Build System Optimization)의 중요성을 보여준다.

go-size-analyzer 및 goda를 활용한 분석

Datadog는 go-size-analyzer를 사용하여 각 의존성의 크기를 시각화하고, goda를 통해 패키지 import 경로를 분석했다. 이러한 도구들을 통해 불필요한 의존성을 식별하고 제거하는 데 성공했다. 특히, go-size-analyzer는 각 의존성의 크기를 시각적으로 보여주어, 개발자가 최적화 대상(Optimization Target)을 쉽게 파악할 수 있도록 돕는다.

커뮤니티의 반응 및 추가적인 최적화 방법

커뮤니티에서는 Datadog의 기술적 접근 방식에 대해 긍정적인 평가를 내렸다. symgryph는 `-s -w`와 같은 링커 플래그를 사용하여 바이너리 크기를 줄일 수 있다고 언급했으며, mariusor는 UPX를 사용한 압축을 제안했다. 또한, mariusor는 제어 CLI를 메인 바이너리에 통합하여 이미지 크기를 줄이는 방법을 제시했다. 이러한 논의는 다양한 최적화 기법(Various Optimization Techniques)에 대한 관심을 보여준다.

Reducing the size of Go binaries by up to 77%