컬리 가상 재고 관리 시스템(VSMS)을 정식 배포하기 전, 성능 테스트에서 나온 데드락과 DB 병목을 반복 실험으로 개선한 이야기다. 목표 1200 TPS를 잡고 첫 테스트에서 120 TPS와 데드락을 만난 뒤, 트랜잭션 정렬·DB 스펙 상향·커넥션 절약으로 1500 TPS 이상까지 끌어올렸다.
핵심 포인트- 예상 피크 300 TPS의 4배인 1200 TPS를 목표로 성능 테스트를 설계
- 첫 공식 테스트에서 DB 데드락으로 120 TPS라는 저조한 결과
- 트랜잭션이 아이템을 다른 순서로 잠가 생긴 순환 대기를 대상 정렬 3줄 변경으로 제거
- 최대 병목은 DB IO로, DB 스펙을 2코어에서 8코어로 올려 320에서 924 TPS로 개선
- 수량 변경 로그를 RDS에서 MongoDB로 옮겨 RDB 커넥션을 확보, 최종 1500 TPS 이상 유지
상세 정리- 시스템: VSMS는 기획·개발·DevOps가 약 8개월간 준비해 2020년 8월 30일 정식 배포했고, 상품코드·재고 수량 관리 admin API, 재고 조회·조정 customer API, 배치 잡으로 구성된다.
- 목표 설정: 2020년 6~7월 2주간 RPS 데이터에 물류센터 추가·성장 전망을 반영해 예상 피크 300 TPS의 4배인 1200 TPS를 성능 목표로 잡았다.
- 첫 테스트: 2020년 7월 2일 6개 에이전트와 가상 유저 300으로 돌린 첫 공식 테스트에서 DB 데드락이 발생해 120 TPS에 그쳤다.
- 데드락 원인: 트랜잭션들이 아이템을 서로 다른 순서로 잠가(Tx1은 A에서 B, Tx2는 B에서 A) 순환 대기가 생기며 상호 차단됐다.
- 데드락 해결: 트랜잭션 대상을 정렬해 순환 의존을 없애는 3줄짜리 코드 변경 PR로 데드락을 제거했다.
- 병목 진단: 가장 큰 병목은 데이터베이스 IO였다.
- DB 스펙 실험: 2코어·2GB DB에 인스턴스당 커넥션 20으로 320 TPS였는데, 8코어·60GB로 올리자 924 TPS까지 나왔다.
- 리팩토링 판단: 커밋을 단일 연산으로 합치는 등 리팩토링본과 비리팩토링본을 단일 API로 통제 비교한 결과 성능 차이는 근소해, 유지보수를 위해 7월 23일 리팩토링본을 머지했다.
- 커넥션 절약: 7월 22일부터 8월 4일까지 수량 변경 로그를 RDS에서 MongoDB로 옮겨, 중요한 작업이 쓸 RDB 커넥션을 확보했다.
- 최종 결과: 7시간 테스트로 3,685만 건을 처리해 1,462 TPS, 이어 4시간 45분 테스트로 2,476만 건에 1,445 TPS를 냈고, 합산 11시간 45분 약 6,161만 건 처리에 1500 TPS 이상을 유지해 목표를 넘겼다.
- 배포: VSMS는 8월 12일 백그라운드 배포 후 8월 30일 정식 오픈했다.
왜 읽나신규 서비스 배포 전 부하 테스트로 DB 데드락·IO·커넥션 병목을 잡아야 하는 백엔드·DBA에게 트랜잭션 정렬·스펙 상향·RDS에서 MongoDB 분리의 실측 사례.