Strobelight - 오픈소스 기반의 프로파일링 서비스
(engineering.fb.com)- Strobelight은 Meta의 프로파일링 오케스트레이터로, 여러 오픈 소스 기술을 결합해 엔지니어들이 성능과 리소스 활용을 개선하도록 지원함
- 도입 후 약 15,000대의 서버에 해당하는 연간 용량 절감 효과 달성
Strobelight의 동작 방식
- Strobelight은 단일 프로파일러가 아니라 여러 프로파일러를 조정하는 오케스트레이터임
- 모든 Meta의 프로덕션 호스트에서 실행되며, 다음과 같은 성능 지표를 수집함
- CPU 사용량
- 메모리 할당
- 기타 성능 메트릭
- 엔지니어가 이를 통해 성능 병목 현상 및 리소스 낭비 문제를 파악하고 코드 최적화 가능
프로파일러의 역할 및 필요성
- 프로파일러는 샘플링 기반의 통계 분석 도구임
- 예: 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대 서버 절감 효과 발생
오픈소스
- Strobelight의 프로파일러 및 라이브러리 오픈 소스 : https://github.com/facebookincubator/strobelight
댓글과 토론
Hacker News 의견
- Grafana의 Pyroscope를 지속적인 프로파일링을 위해 추천함, Go에서 사용 중이며 잘 작동함
- 여러 언어를 지원하며 eBPF 기반임
- Meta/FB의 C++ 코드는 다른 오래된 대형 기술 기업의 코드보다 읽기 쉬움
- Strobelight는 특히 높은 qps 서비스에서 최적화할 가치가 있는 부분을 쉽게 볼 수 있게 해주는 생명선임
- Meta의 사용자 공간 바이너리에 프레임 포인터가 포함되어 있어 스택을 걷는 것이 가능해짐
- 그렇지 않으면 복잡하고 비효율적인 방법을 사용해야 했을 것임
- 비네이티브 언어를 위한 이벤트 프로파일러가 있다고 주장함 (예: 파이썬)
- 파이썬 상태를 읽는 방법이 명확하지 않음
- Strobelight의 GitHub 저장소는 아직 기본적인 수준임, 업데이트 시기를 궁금해함
- 이름이 고속 주기 운동을 검사하는 스트로브 사용을 참조하는 것 같음
- 오픈 소스 프로젝트가 이렇게 통합되었으면 좋겠음
- Facebook의 내부 UI가 괜찮아 보임
- 계산 비용 모델링은 어려움
- 유체 역학을 계산 요구 사항에 적용하면 재미있을 것임
- AWS/Azure/GCP의 주요 경쟁자들이 이런 도구의 부족으로 인해 어려움을 겪고 있다고 생각함
- Microsoft에서 네트워크 트래픽을 추적하는 도구를 만들었고 디버깅에 매우 유용했음
- Meta의 모든 것에 대해 의심을 가지고 접근함
- 성능 프로파일링임
- 제목과 도메인을 보고 사용자 프로파일링인 줄 알았음
- Strobelight를 Parca와 Polar Signals를 통해 모두에게 제공하려고 노력 중임
- 일부는 이미 존재하며 올해 더 많은 것이 나올 예정임