<aside> 💡

nGrinder 를 활용한 부하테스트, 캐싱을 활용한 성능개선

목적

용어

기능별 부하테스트

<aside> 💡

1. 60000건 의 공지사항 전체 데이터를 조회하는 작업

공통 부하테스트 조건

전체 조회 성능 수치 변화 결과 캐싱전 → 후

캐싱 전 캐싱 후 개선율
평균 TPS 11.1 59.2 4.3배
Peak TPS 15.0 86.0 4.73배
Mean Test Time 897.31 ms 167.86 ms 81.3% 감소
Executed Tests 583 건 3003 건 4.1배

결론

캐싱 시 TTL(Time To Live) 20초 설정, 60초 설정 시 성능 수치 결과

TTL 20초 TTL 60초
평균 TPS 59.2 52.0
Peak TPS 86.0 78.5
Mean Test Time 167.86 ms 190.55 ms
Executed Tests 3003 건 2634 건

TTL 을 길게 설정 시 성능이 감소한 원인

  1. 메모리 사용량 증가

    TTL 20초 - 스카우터 모니터링 로그

    TTL 20초 - 스카우터 모니터링 로그

    TTL 60초 - 스카우터 모니터링 로그

    TTL 60초 - 스카우터 모니터링 로그

  2. 동시성(Concurrency) 이슈

  3. GC(Garbage Collection) 부하

캐시 적용 전 부하테스트

스크린샷 2024-12-14 오후 7.35.41.png

캐시 적용 전 부하테스트 수행결과

스크린샷 2024-12-14 오후 7.53.10.png

캐시 적용 후 부하테스트

캐시 적용 후 부하테스트 수행결과

스크린샷 2024-12-14 오후 8.04.58.png

<aside> 💡

2. 공지사항 데이터를 페이징 조회하는 작업

공통 부하테스트 조건

@Transactional(readOnly = true)
@Cacheable(value = "noticeCache",
           key = "'noticeCache-'+ #pageable.pageNumber",
           condition = "#pageable.pageNumber <= 5")
public Page<Notice> findPageNotice(Pageable pageable) {
    Page<Notice> notices = noticeRepository.findAll(pageable);
    // put 메소드를 사용하여 key 설정
    cacheManager.getCache("noticeCache").put("noticeList" + pageable.getPageNumber(), notices);
    return notices;
}

페이징 조회 성능 수치 변화 결과 캐싱전 → 후

| --- | --- | --- | --- |

결론

캐시 적용 전 부하테스트

스크린샷 2024-12-15 오후 5.37.48.png

캐시 적용 전 부하테스트 수행결과

스크린샷 2024-12-15 오후 5.41.11.png

</aside>