Yappi로 Python에서도 성능을 챙겨보자
두줄요약
Yappi로 FastAPI 서버의 병목을 찾아 성능을 개선한 사례를 다뤘습니다. JSON 직렬화와 변환 경로를 줄여 CPU 사용률과 응답 시간을 크게 낮췄습니다.
문제 상황
- Python 서버의 피드/랭킹용 피처 서빙에서 대량 단순 조회가 느려 CPU 사용률과 응답 시간이 기대에 못 미침
- 초기에 인스턴스당 30% 이하 기준으로 환산했을 때 필요한 서버 수가 과도하게 커져 로직의 무거움이 드러남
원인 분석
- API 응답 직렬화 과정의
serialize_response와jsonable_encoder구간이 병목 asdict기반 변환으로 인한 불필요한deepcopy- protobuf → JSON → dict의 중간 변환 단계,
asyncio.gather()로 인한 호출 그래프 단절
해결 방법
- FastAPI 미들웨어에 Yappi를 붙여 요청 단위 프로파일링 수행
ORJsonResponse적용으로 JSON 직렬화 비용 감소MessageToDict로 JSON 단계를 건너뛰고 바로 dict로 변환- 프로파일링 세션에서는
gather대신 순차await로 흐름 확인
주의할 점
- Yappi 오버헤드는 작아도 프로덕션 실트래픽에서는 비활성화 권장
- async/await 구간에서는 cumtime 해석이 왜곡될 수 있음
asyncio.gather()는 호출 스택 추적을 끊을 수 있음


