[뉴스] 데이터독, prefix trie로 자바 APM 에이전트 시작 시간 줄인 과정 공개
데이터독(Datadog)이 8월 11일 엔지니어링 블로그에 자바 APM 에이전트의 시작 시간을 줄이기 위해 클래스 매칭 구조를 prefix trie로 다시 설계한 과정을 공개했습니다. 자바 에이전트는 JVM이 클래스를 로드할 때마다 계측 대상인지 판별해야 하는데, 수십만 개에 이르는 클래스명을 빠르게 걸러내는 일이 시작 시간의 관건이었다는 내용입니다.
에이전트는 애플리케이션이 뜨기 전인 premain 단계에서 돌아가는데, 특히 Java 8은 premain이 끝난 뒤에야 JIT 컴파일러가 시작되어 이 구간의 코드는 최적화 없이 해석 실행됩니다. 그래서 데이터독은 매칭 규칙을 코드가 아니라 데이터로 바꾸는 접근을 택했습니다. ClassNameTrie라는 자료구조를 만들고 트라이 전체를 문자열 상수로 인코딩해서, JVM이 클래스 로딩 때 함께 올리고 바이트코드 명령 하나(ldc)로 접근하게 했습니다. 노드의 분기 문자를 정렬해 두고 이진 탐색으로 따라가는 구조입니다.
수치도 구체적으로 공개했습니다. 실제 Spring Boot 애플리케이션 기준으로 클래스명으로 불필요한 클래스를 걸러내는 것만으로 계측 시작 시간이 20% 줄었고, 기존 코드 기반 매처를 ClassNameTrie로 바꿔 1%, 클래스명을 계측 대상에 바로 매핑하는 known types 인덱스를 더해 3%를 추가로 줄여, 클래스명 필터링이 없을 때와 비교해 총 24% 이상 절감했다고 합니다. 벤치마크에서는 Java 8에서 기존 코드 방식보다 5배 가까이 빨랐습니다.
APM 에이전트를 붙일 때 시작 시간 오버헤드는 실무에서 자주 걸리는 부분이라, 벤더가 내부 최적화 과정을 수치와 함께 공개한 것 자체가 참고할 만합니다. 이 구조는 데이터독의 Live Debugger와 CI Visibility에도 쓰이고 있고, 관련 코드는 dd-instrument-java라는 오픈소스 라이브러리로 공개되어 있어 자바 계측 도구를 만들거나 에이전트 내부가 궁금한 분들이 직접 볼 수 있습니다.
🔗 https://www.datadoghq.com/blog/engineering/improving-apm-java-startup-with-a-prefix-trie/
로그인 후 답글을 남길 수 있습니다.