사이드 프로젝트를 제작했지만, 사용자를 모으는 일은 쉽지 않습니다.
그래서 비슷한 유형의 서비스와 비교해 트래픽이 몰리는 상황을 예상하고 성능 테스트를 진행할 것입니다.
현재 프로젝트와 비슷한 유형의 서비스인 Velog
와 비교해서 성능 테스트를 할 예정입니다.
- MAU(Monthly Active User): 30일 동안 앱을 사용하는 순 유저 수
- DAU(Daily Active User): 하루 동안 앱을 사용하는 순 유저 수
MAU
: 8,400,000/monthDAU
: 8,400,000/month ÷ 30/day = 280,000/dayUser Per Hour
: 280,000/day ÷ 24/hour ≈ 11,666.667/hourUser Per Second
: 11,666.667/hour ÷ 3600/sec ≈ 3.24/sec개발자들이 많이 사용하고 있는 서비스임에도 불구하고 초당 요청 건수
가 3건 정도로 많은 트래픽이 발생하지 않는 것을 확인할 수 있습니다.
위에서 구한 값들은 평균 값으로 구한 것이기 때문에 정확하지 않습니다. 다양한 상황에 대비하여 서비스 성능 테스트를 해야합니다.
예를 들어, 구독자가 많은 작성자가 글을 작성했을 경우 많은 사람들이 게시글을 조회할 수 있는 상황이 있습니다.
위에서 측정한 초당 요청 건수
보다 넉넉하게 초당 200건의 요청을 견딜 수 있는 서비스를 만드는 것을 목표로 하겠습니다.
1 Core
, 메모리 1GB
100만건
, 회원 1만명
, 댓글 3만건
의 데이터 저장JMeter
를 이용하여 최신 게시글 목록을 조회하는 기능을 테스트하겠습니다.
Number of Threads(users)
: 스레드 수(유저 수)Ramp-up period (seconds)
: 지정된 유저가 모두 로딩될 시간Loop Count
: 반복 횟수Summery Report
TPS 그래프
테스트 결과 대부분의 요청 결과에서 에러가 발생했습니다.
에러 내용
Caused by: java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
해당 에러를 통해 Database Connection Pool
에서 Connection
을 가져오는데 실패한 것을 알 수 있습니다.
HikariCP
는 데이터베이스 연결을 가져오는 데 30초 동안 기다렸지만 연결이 설정되지 않아 타임 아웃 예외가 발생했습니다. 많은 데이터로 인해 데이터베이스 조회 작업이 오래 걸려 연결 풀에서 사용 가능한 연결을 가져오지 못한 것입니다.
Connection Pool 크기
를 조절하거나 조회 성능
을 개선하여 오류를 해결하는 방식이 있습니다.
HikariCP
설정을 통한 DB Connection Pool
조절은 연결이 끝난 Connection
을 재사용해 새로 객체를 생성하는 비용을 줄이고
DB에 빠른 접근
을 도와줍니다.
그렇다고 너무 많은 커넥션을 생성하면, 애플리케이션의 성능을 떨어뜨립니다.
Connection
의 주체는Thread
이기 때문에Thread
를 고려해야 합니다.
- Thread Pool 크기 < Connection Pool 크기
Connection Pool
의 크기가 더 크다면 남는 객체가 생기기 때문에 메모리 공간을 낭비하게 됩니다.- Thread Pool 크기, Connection Pool 크기 모두 증가
Thread
증가로 더 많은Context Switching
이 발생합니다.
적절한 Connection Pool 크기
1 connections
= ((core_count
) * 2) +effective_spindle_count
)
우선, DB Connection Pool
크기 조절은 모니터링 툴을 통해 자원 사용량을 파악해야 하고 고려할 점이 많아 최후의 수단으로 사용하고 조회 성능을 개선하는 Index
를 먼저 적용해 보겠습니다.
Number of Threads
, Ramp-up period
, Loop Count
설정 값은 위와 동일합니다.
Summary Report
TPS 그래프
이전과 달리 에러가 발생하지 않고 TPS(Transaction Per Second)
가 3.8/sec
-> 155.8/sec
로 상승했습니다. 성능이 41배 개선
된 것을 볼 수 있습니다.
Redis
를 왜 적용했는지와 적용 방법은 이 글에서 참고해 주시기 바랍니다.
Summary Report
TPS 그래프
Redis
를 이용하여 캐시를 적용했을 때, 인덱스를 적용한 것보다 TPS
가 155.8/sec
-> 170.6/sec
로 9.5배
빨라진 것을 확인할 수 있습니다.
Redis
에 key
가 저장되고 난 후, key
의 TTL(Time To Live)
동안 조회가 지속된다면 더욱 효과적인 처리량을 기대할 수 있습니다.