본문으로 이동
문서

신규 서비스 배포 전에 실험과 개선을 반복한 이야기

박제희, 이규원, 이종립 · 컬리 · 컬리 기술 블로그

원본 보기

소개

성능 테스트로 데드락을 찾아 없애고 TPS를 끌어올리자!

AI 핵심 요약

마켓 컬리는 가상 재고 관리 시스템(VSMS)의 높은 조회·변경 부하를 감당하기 위해 운영 트래픽을 바탕으로 성능 목표를 세우고 부하 테스트를 진행했지만, 초기에는 DB 데드락과 I/O 병목으로 목표에 미치지 못했습니다. 여러 상품을 차감하는 트랜잭션의 잠금 순서를 정렬해 데드락을 없앴고, 커밋을 모아 처리하는 실험으로 DB I/O를 줄인 뒤 성능과 유지보수성을 비교하며 코드를 리팩토링했습니다. 또한 수량 변경 로그를 MongoDB로 분리해 RDB 커넥션 점유를 낮췄으며, 반복 테스트에서 목표를 넘는 1,500 TPS 이상을 달성했습니다. 단순한 변경도 측정으로 검증하고, 성능과 가독성의 균형을 통제된 실험으로 판단하는 것이 핵심 교훈입니다.

  • 여러 상품을 잠그는 트랜잭션은 상품 ID 등 일관된 기준으로 정렬해 잠금 순서를 통일하면 순환 대기를 막을 수 있다.
  • 성능 테스트는 운영 트래픽을 참고해 목표 부하를 정하고, 실제 운영보다 높은 여유 부하까지 검증하는 방식으로 설계한다.
  • DB I/O와 커밋 횟수가 병목인지 확인한 뒤, 요청을 묶어 처리하는 실험으로 효과를 먼저 검증하고 리팩토링을 진행한다.
  • 성능 비교에서는 하드웨어와 요청 조건을 통제하고 반복 측정해야 작은 차이를 과대해석하지 않을 수 있다.
  • 로그 저장소를 메인 RDB에서 분리하면 커넥션 점유를 줄여 핵심 트랜잭션의 처리 여력을 확보할 수 있다.