Performance improvements in the Datadog Agent metrics pipeline (새 탭에서 열림)

Datadog Agent는 동일한 CPU 리소스로 더 많은 메트릭을 빠르게 처리하기 위해 메트릭 고유 키(Context) 생성 로직을 최적화했습니다. Go 언어의 프로파일링 도구를 통해 태그 정렬 및 해싱 과정이 시스템의 주요 병목 지점임을 확인했으며, 이를 해결하기 위해 상황별 특수화 알고리즘과 64비트 해시 최적화 기법을 도입했습니다. 이러한 개선을 통해 에이전트의 데이터 처리 성능을 한 단계 높이고 리소스 효율성을 극대화하는 결과를 얻었습니다.

병목 지점 식별 및 분석

  • Go 언어(Golang)의 CPU 프로파일링과 플레임그래프(Flamegraph) 도구를 활용하여 메트릭 파이프라인 내 리소스 소모가 큰 지점을 추적했습니다.
  • 분석 결과, 메트릭을 수신하고 고유 키를 생성하는 addSampletrackContext 함수가 가장 많은 CPU를 점유하고 있음을 확인했습니다.
  • 특히 태그 중복을 제거하고 동일한 해시 값을 보장하기 위해 수행하는 태그 정렬 로직(util.SortUniqInPlace)이 전체 성능의 주요 장애물로 작용하고 있었습니다.

메트릭 컨텍스트 생성의 기술적 문제

  • 고유 식별을 위해 메트릭 이름, DogStatsD 태그, 컨테이너 태그를 모두 조합하여 해시 키를 생성해야 합니다.
  • 해시 충돌을 방지하면서도 빠른 생성 속도를 유지해야 하며, 동일한 메트릭에 대해 항상 일관된 키를 생성하기 위해 태그 리스트를 정렬하는 과정이 필수적이었습니다.
  • 태그 리스트 정렬은 데이터 양이 많아질수록 비용이 급격히 증가하는 특성이 있어, 매번 메트릭이 들어올 때마다 이를 수행하는 것은 비효율적이었습니다.

성능 최적화를 위한 다각도 접근

  • 코드 특수화(Specialization): 모든 경우에 일반적인 정렬 알고리즘을 사용하는 대신, 태그의 개수에 따라 가장 빠른 성능을 낼 수 있는 정렬 방식을 선택적으로 적용하도록 로직을 개선했습니다.
  • 해시 알고리즘 및 구조 개선: 벤치마크를 통해 속도와 고유성이 검증된 Murmur3 알고리즘을 도입했습니다.
  • Go 런타임 최적화 활용: 기존 128비트 해시를 충돌 방지에 충분한 64비트로 전환하여, Go 런타임의 최적화된 맵 접근 함수(mapassign_fast64, mapaccess2_fast64)가 동작하도록 유도함으로써 처리 속도를 가속화했습니다.

데이터 집약적인 시스템에서는 런타임 프로파일링을 통해 '핫 패스(Hot path)'를 정확히 찾아내는 것이 중요합니다. 특히 태그 정렬이나 해싱과 같은 빈번한 기본 연산에서 발생하는 미세한 오버헤드를 줄이는 것만으로도 대규모 환경에서의 전체 처리량(Throughput)을 크게 향상시킬 수 있습니다.