목록 보기
Yappi로 Python에서도 성능을 챙겨보자
백엔드

Yappi로 Python에서도 성능을 챙겨보자

네이버 D2
네이버 D2
2025년 6월 26일

두줄요약

Yappi로 FastAPI 서버의 병목을 찾아 성능을 개선한 사례를 다뤘습니다. JSON 직렬화와 변환 경로를 줄여 CPU 사용률과 응답 시간을 크게 낮췄습니다.

문제 상황

  • Python 서버의 피드/랭킹용 피처 서빙에서 대량 단순 조회가 느려 CPU 사용률과 응답 시간이 기대에 못 미침
  • 초기에 인스턴스당 30% 이하 기준으로 환산했을 때 필요한 서버 수가 과도하게 커져 로직의 무거움이 드러남

원인 분석

  • API 응답 직렬화 과정의 serialize_responsejsonable_encoder 구간이 병목
  • asdict 기반 변환으로 인한 불필요한 deepcopy
  • protobuf → JSON → dict의 중간 변환 단계, asyncio.gather()로 인한 호출 그래프 단절

해결 방법

  • FastAPI 미들웨어에 Yappi를 붙여 요청 단위 프로파일링 수행
  • ORJsonResponse 적용으로 JSON 직렬화 비용 감소
  • MessageToDict로 JSON 단계를 건너뛰고 바로 dict로 변환
  • 프로파일링 세션에서는 gather 대신 순차 await로 흐름 확인

주의할 점

  • Yappi 오버헤드는 작아도 프로덕션 실트래픽에서는 비활성화 권장
  • async/await 구간에서는 cumtime 해석이 왜곡될 수 있음
  • asyncio.gather()는 호출 스택 추적을 끊을 수 있음

댓글 0

댓글을 작성하려면 로그인이 필요합니다.

댓글을 불러오는 중...