- Strobelight은 Meta의 프로파일링 오케스트레이터로, 여러 오픈 소스 기술을 결합해 엔지니어들이 성능과 리소스 활용을 개선하도록 지원함
- 도입 후 약 15,000대의 서버에 해당하는 연간 용량 절감 효과 달성
Strobelight의 동작 방식
- Strobelight은 단일 프로파일러가 아니라 여러 프로파일러를 조정하는 오케스트레이터임
- 모든 Meta의 프로덕션 호스트에서 실행되며, 다음과 같은 성능 지표를 수집함
- 엔지니어가 이를 통해 성능 병목 현상 및 리소스 낭비 문제를 파악하고 코드 최적화 가능
프로파일러의 역할 및 필요성
- 프로파일러는 샘플링 기반의 통계 분석 도구임
- 예: CPU 사이클 이벤트에서 함수 호출 스택과 CPU에서 함수가 실행되는 시간을 분석 가능
- 코드 실행 상태를 상세히 파악하여 성능 개선에 기여함
Strobelight의 다양한 프로파일러
- Strobelight에는 총 42개의 프로파일러 포함됨
-
jemalloc 기반 메모리 프로파일러
- 함수 호출 수 프로파일러
- Python, Java, Erlang 등 언어별 이벤트 기반 프로파일러
- AI/GPU 프로파일러
- 오프-CPU 시간 추적 프로파일러
- 서비스 요청 지연 시간 추적 프로파일러
- 프로파일링 도구는 명령줄 도구나 웹 UI에서 실행 가능
- 연속 프로파일링 및 특정 조건 발생 시 트리거 기반 프로파일링 설정 가능
Ad-hoc 프로파일러 지원
- 엔지니어가 새 프로파일러를 추가하려면 여러 코드 수정 및 배포 필요
-
bpftrace 스크립트를 작성해 빠르게 프로파일러 추가 가능
- 엔지니어가 특정 함수의 성능 문제를 신속히 추적 및 분석 가능
프로파일러 간 충돌 방지
- Strobelight은 프로파일러 간 자원 충돌 방지 시스템 내장
- CPU 사이클 추적 중 다른 PMU 카운터 사용 금지 등 규칙 적용
- 동시 실행 및 대기열 관리 시스템 통해 리소스 충돌 최소화
자동 프로파일링 및 동적 샘플링
- Strobelight는 모든 Meta 서비스에서 자동으로 프로파일링 실행
- 각 서비스별 작업 부하에 따라 샘플링 빈도 및 기간 자동 조정
- 샘플링 확률 및 수집 빈도 자동 보정하여 일관된 데이터 제공
성능 최적화 및 용량 절감 사례
LBR 프로파일러
- Intel의 하드웨어 기능인 Last Branch Record (LBR) 샘플링 지원
-
FDO (Feedback Directed Optimization) 에서 사용되어 바이너리 성능 향상
- Meta의 상위 200개 서비스에서 CPU 사이클 사용량 최대 20% 절감 효과
이벤트 프로파일러
- Linux의 perf 도구와 유사한 기능 수행
- 성능 이벤트 (CPU 사이클, L3 캐시 미스 등) 샘플링 및 시각화
- 코드 경로에서 발생하는 문제를 사전에 감지 및 수정 가능
Stack Schemas 및 Strobemeta
Stack Schemas
- 함수 호출 스택에 태그 추가해 가시성 향상
- 필터링 및 시각화에서 불필요한 함수 제거 가능
Strobemeta
- 런타임에서 동적 메타데이터를 호출 스택에 추가
- 서비스 엔드포인트, 지연 시간 등과 관련된 세부 정보 제공
심볼화 처리 (Symbolization)
- 바이너리의 가상 주소를 함수 이름 및 소스 코드 정보로 변환
- DWARF, ELF, gsym, blazesym 등 오픈 소스 기술 기반
- 심볼화 작업은 프로파일링 후 진행해 성능 저하 방지
Strobelight 데이터 시각화 도구
Scuba
- SQL 기반 쿼리 및 시각화 도구
- 프로파일링 데이터에 대해 시계열, 분포, 플레임 그래프 등 제공
Tracery
- 시간 기반의 복합 프로파일링 데이터 시각화 도구
- 서비스 요청 스팬, CPU 사이클, 오프-CPU 데이터 통합 시각화 가능
"Biggest Ampersand" 사례
- 엔지니어가 Strobelight 데이터를 통해 std::vector 복사 문제 발견
-
auto 키워드 뒤에 & 추가 → 불필요한 복사 방지
- 결과적으로 연간 약 15,000대 서버 절감 효과 발생
오픈소스