[성능테스트] JMeter를 이용한 성능테스트

JeongMin·2024년 6월 24일
0
post-thumbnail

서비스 이용자 분석

사이드 프로젝트를 제작했지만, 사용자를 모으는 일은 쉽지 않습니다.
그래서 비슷한 유형의 서비스와 비교해 트래픽이 몰리는 상황을 예상하고 성능 테스트를 진행할 것입니다.


비슷한 유형의 서비스

현재 프로젝트와 비슷한 유형의 서비스인 Velog 와 비교해서 성능 테스트를 할 예정입니다.

  • MAU(Monthly Active User): 30일 동안 앱을 사용하는 순 유저 수
  • DAU(Daily Active User): 하루 동안 앱을 사용하는 순 유저 수

분당, 초당 요청 횟수

  • MAU : 8,400,000/month
  • DAU : 8,400,000/month ÷ 30/day = 280,000/day
  • User Per Hour : 280,000/day ÷ 24/hour ≈ 11,666.667/hour
  • User Per Second : 11,666.667/hour ÷ 3600/sec ≈ 3.24/sec

개발자들이 많이 사용하고 있는 서비스임에도 불구하고 초당 요청 건수가 3건 정도로 많은 트래픽이 발생하지 않는 것을 확인할 수 있습니다.

위에서 구한 값들은 평균 값으로 구한 것이기 때문에 정확하지 않습니다. 다양한 상황에 대비하여 서비스 성능 테스트를 해야합니다.
예를 들어, 구독자가 많은 작성자가 글을 작성했을 경우 많은 사람들이 게시글을 조회할 수 있는 상황이 있습니다.


서비스 성능 테스트

위에서 측정한 초당 요청 건수보다 넉넉하게 초당 200건의 요청을 견딜 수 있는 서비스를 만드는 것을 목표로 하겠습니다.

서버 스펙(AWS EC2 프리티어)

  • vCPU(가상 CPU) 1 Core, 메모리 1GB
  • RDS에는 게시글 100만건, 회원 1만명, 댓글 3만건의 데이터 저장

JMeter

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초 동안 기다렸지만 연결이 설정되지 않아 타임 아웃 예외가 발생했습니다. 많은 데이터로 인해 데이터베이스 조회 작업이 오래 걸려 연결 풀에서 사용 가능한 연결을 가져오지 못한 것입니다.

HikariCP 설정? Index 적용?

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를 먼저 적용해 보겠습니다.


Index 적용

Index 적용 과정

Number of Threads, Ramp-up period, Loop Count 설정 값은 위와 동일합니다.

테스트 결과

Summary Report

TPS 그래프

이전과 달리 에러가 발생하지 않고 TPS(Transaction Per Second)3.8/sec -> 155.8/sec로 상승했습니다. 성능이 41배 개선된 것을 볼 수 있습니다.


Redis 캐시 적용

Redis를 왜 적용했는지와 적용 방법은 이 글에서 참고해 주시기 바랍니다.

Summary Report

TPS 그래프

Redis를 이용하여 캐시를 적용했을 때, 인덱스를 적용한 것보다 TPS155.8/sec -> 170.6/sec9.5배 빨라진 것을 확인할 수 있습니다.

Rediskey가 저장되고 난 후, keyTTL(Time To Live)동안 조회가 지속된다면 더욱 효과적인 처리량을 기대할 수 있습니다.

profile
📚개발 기록

0개의 댓글