본문 바로가기
★ 프로젝트 + 트러블 슈팅 ★

★단일 서버 성능개선 트러블 슈팅★ (주 트래픽이 무엇인지를 파악하는 습관을 기르자)

by 리승우 2022. 12. 13.

[프로젝트 현 상황]

> E커머스 웹 구현중 (ex. 쿠팡, G마켓)

> 특정 시간대에 특정 상품의 재고한정 특가이벤트 기능 추가예정

 

https://github.com/OnNaNOn/OMG

 

GitHub - OnNaNOn/OMG

Contribute to OnNaNOn/OMG development by creating an account on GitHub.

github.com

 

[현재 상황]

EC2서버(1개) <-> Mysql (DB1개)

로 진행 중에 있음

 

[트러블 시나리오]

1. 평상 시, 1일 총 접속자 수 10만명

2. 특정 시간대, 특정 상품의 특가이벤트에서 대규모 트래픽이 발생함 (평시 대비 약 5배)

 

[트러블 시나리오에서 발생될 문제점]

1. 평상 시, 대규모 트래픽으로 인해 응답속도가 저하될 수 있음

2. 특가 이벤트에서 대규모 트래픽이 생김으로써 부하가 걸릴 수 있음. 또한 동시성 문제 발생가능성 높아짐

 

[어떻게 해결할까?]

우선 문제의 시작점을 정의해봐야겠다.

 

단일 서버에 걸리는 부하의 원인은 크게 2가지로 분류된다.

  • CPU 부하
  • I/O 부하

CPU 부하가 높은 경우는 서버에서 실행되고 있는 프로그램 자체의 연산량이 많은 경우나 프로그램에 오류등이 발생한 경우이다.

 

I/O 부하가 높은 경우는 서버에서 실행되고 있는 프로그램의 입출력이 많거나, DB나 하드디스크 등의 저장장치로의 접근이 많아 스왑이 발생하는 경우가 대부분이다.

 

 

위를 생각해보면,

CPU에서 문제가 발생했을 시는 서버에서 문제가 발생한 것이므로 scale-out과 같은 방법이 차선책이 될 것같으며

I/O에서 문제가 발생한 것은 DB커넥션을 오래 들고있는 것을 개선하는 것이 차선책이 될 것 같다.

(두개 모두 차선책이 더 있을 것이다)

 

 

그이를 판단하기 위해 우선순위를 아래에서 먼저 결정해야 할 것 같다.

1. 서버의 부하 및 전체 API요청에 대해 속도개선 처리를 먼저 할 것인가
2. DB의 부하 및 응답속도를 더 개선할 것인가

 

왜냐하면 단일 DB인 상황에서 쿼리의 응답속도가 느릴 경우,

API서버를 늘린다고 속도가 나아지지는 않을 것이기 때문이다.

 

근데 여기서 끝나지않고, 이를 결정하기 위한 선택을 더 해야할 것 같다.

 

이 프로젝트의 주 트래픽이 무엇일까?

그리고 그 주 트래픽은 DB 커넥션을 길어지게 하는 트래픽일까?

아래에 한번 API기능을 대략적으로 적어보았다.

 

1. 특정 시간대에 이뤄지는 특가상품을 조회 (read)

2. 1번의 특가상품 주문 (create / update)

3. 메인 페이지에서 일반 상품들을 조회 (read)

4. 3번의 일반 상품 상세 페이지 조회 (read)

5. 일반상품 주문 (create / update)

3. 상품에 대한 리뷰를 쓰고, 좋아요를 하는 것 (create / update)

 

현재 직접 서비스를 운영한 것은 아니지만, 1과 2번이 가장 큰 트래픽일 것 같다는 생각이 든다.

(선택 이유는 그동안의 MD업무를 하면서 겪은 경험적 지식..?)

물론, 다른 것들 또한 이에 못지않게 중요한 요소이다. 

 

현재 2번 사항에 대하여 아래와 같은 내용으로 테스트 해본 결과, 약 6초대가 나왔다.

테스트내용: 100개의 상품에 대한 1000개의 요청 (멀티스레드는 32개)을 Pessimistic Lock

느린 정도이지만, 아직 매우 심각한 수준은 아닌 것 같다고도 생각을 한다.

 

그러니,

1. 서버의 부하 및 전체 API요청에 대해 속도개선 처리를 먼저 할 것인가

를 우선순위 목적으로 잡아서, 전체적인 API요청에 대한 개선처리를 해주는 것이 좋을 것 같다고 생각을 한다.

scale-out을 한번 알아봐야겠다.

 

 

2. 1번의 특가상품 주문 (create / update)

1번에 대한 DB응답 속도개선은 우선 쿼리문 최적화를 먼저한 뒤, 그럼에도 부하 및 속도가 개선되지 않으면

DB분산(파티셔닝 / 샤딩) 을 도입해야할 것 같다.

 

1. 특정 시간대에 이뤄지는 특가상품을 조회 (read)

혹시나 read 퍼포먼스가 많다고 판단될 시에는, 메인 레플리케이션 혹은 캐싱을 도입해야할 것 같다.

댓글