해당 글은 최범균님의 초식-서버 성능 올리기를 글로 정리한 내용입니다.
서버 성능 기본 지표 2개
1. 응답 시간 (Response Time)
- 클라이언트가 무엇인가 서버에 요청을 하고 그 요청에 대한 응답을 받을 때까지 걸린 시간을 의미
- 응답 시간은 아래의 두가지로 분류 가능
- 처리 시간(Processing Time) : 실제 서버가 요청을 처리하는데 걸린 시간
- 대기 시간(Latency Time) : 클라이언트와 서버간에 데이터를 주고 받는데 걸리는 시간
2. 처리량 (Throughput)
- 흔히 TPS(Transaction Per Second) 라는 수치로 많이 표현함
TPS (Transaction Per Second)
- 서버가 초당 처리할 수 있는 요청의 개수를 나타냄
- TPS 가 높을 수록 초당 처리할 수 있는 요청의 수가 많은 것이다.
그렇다면 TPS 를 높이려면 ??
1. 서버 수 늘리기
- 서버 1대가 10 TPS 의 성능을 가진다고 할 때 해당 서버가 2대라면 20 TPS, 3대면 30 TPS 의 성능을 가짐 (10 TPS * 서버 N 대)
2. Thread Pool 또는 DB Connection Pool 의 크기 늘리기
-
Thread Pool 의 Thread 개수가 5개이고 요청 처리 시간이 1초 걸린다고 할 때, 해당 서버는 5 TPS 의 성능을 가짐
-
Thread Pool 의 Thread 개수가 10개이고 요청 처리 시간이 1초라면, 이때 해당 서버는 10 TPS 의 성능을 가짐
3. 서버의 요청 처리 시간(Processing Time) 줄이기
-
위의 1, 2번처럼 서버의 수를 늘리거나 Thread Pool 또는 DB Connection Pool 의 크기를 늘린다고 해서 성능이 항상 그 수(크기)와 비례하여 증가하는 것은 아니다!
-
어느 시점이 되면 DB 가 견뎌낼 수 있는 부하의 임계치를 넘어가게 되는데, 이로 인해 DB 가 Query 를 처리하는데 걸리는 시간이 증가하게 되며, 이에 따라 서버가 요청을 처리하는데 걸리는 시간이 함께 증가하게 된다. 그리고 이는 곧 TPS 의 감소를 의미하게 된다.
-
즉, 결국 서버의 처리량을 늘리기 위해 서버의 수/Thread Pool/DB Connection Pool 의 크기를 늘렸지만 TPS 가 떨어지는 일이 발생하게 된다.
-
따라서 우리는 TPS 를 높이기 위해 기본적으로 서버의 처리 시간을 먼저 줄여야 한다.
- 하나의 요청 처리 시간이 1초이며, 쓰레드 풀의 쓰레드 개수가 10개일 때 해당 서버가 10TPS 의 성능을 가진다고 가정해보자
- 이때 만약 우리가 처리 시간을 0.5 초로 줄일 수 있다면 해당 서버의 TPS 는 20 TPS 로 증가하게 된다!
4. 대기 시간(Latency Time) 줄이기
- 응답 시간은 요청 처리 시간과 대기 시간으로 구성된다고 하였다.
- 따라서 대기 시간도 줄일 수 있다면 줄여야할 필요가 있다.
요청 처리 시간(Processing Time)을 줄이려면 ??
1. 처리 시간 줄이기 : DB
- Query 튜닝
- Cache 이용
- 장비빨(
금융 치료, Money Swag)
- Hardware upgrade (Scale Up)
- DB Replication -> 부하 분산
- Primary (DB 쓰기)
- Replica (DB 읽기)
2. 처리 시간 줄이기 : 외부 API 호출
- 외부 서비스 API 호출 응답 시간 증가는 곧 우리 서버의 처리 시간 증가를 의미
- 개선 방법
- Cache 사용
- 외부 서비스 API 호출 제거
- Messaging 을 이용한 방법(Kafka, RabbitMQ 등)
3. 처리 시간 줄이기 : 데이터 집계 및 계산
- 미리 계산하여 Caching or DB 에 저장
- Example
요청 대기 시간(Latency Time) 을 줄이려면??
1. 대기 시간 줄이기 : 대역폭
- 대역폭이 작다면 클라이언트 개수가 증가할 때 주고 받는 속도가 급격히 느려진다.
- 고속도로에 차가 증가하면 속도가 느려지는 것과 유사
- 세가지 방식 고려
- 응답 크기 줄이기
- 응답 압축
- 이미지 파일 크기 줄이기, 이미지 해상도 낮추기
- 트래픽 분리하기
- 이미지와 같은 정적 파일을 CDN(Content Delivery Network) 을 통해 제공
- CDN 은 이미지 등과 같은 정적 파일 전송에 특화된 서비스이기에 CDN 들은 대역폭 자체가 크다
- 대역폭 늘리기
- 비용 측면에서 CDN(Content Delivery Network) 가 유리하다
정리
- 처리량(Throughput)을 높이려면??
- 서버의 요청 처리 시간(Processing Time) 줄이기
- 장비 추가(Scale Out)
- Thread Pool / DB Connection Pool 크기 조절
- 처리 시간을 줄이려면??
- DB Query 튜닝, 장비빨(Scale Out/Scale Up)
- Cache
- 데이터 미리 집계
- 대기 시간을 줄이려면??
- 응답 크기 줄이기
- 정적 파일 트래픽 분리(CDN)
- 대역폭 늘리기