JAVA/프로젝트

성능테스트 - 리팩토링

whyHbr 2024. 11. 21. 16:09
728x90
반응형

아키텍쳐 리팩토링

 

스케일 아웃 Scale out

  • AWS 로드 밸런서를 사용해 애플리케이션을 여러 서버로 분산해 트래픽을 균형있게 분배하고 고가용성을 제공하는데 도움이 된다. 

 

분산 시스템 아키텍쳐

  • 마이크로 서비스 아키텍쳐를 고려해 각 부분을 독립적으로 스케일 아웃한다. 확장성을 제공한다.

 

서버 리소스 최적화

  • 서버 리소스 (CPU, 메모리, 디스크) 를 최적화하고 운영체제 및 웹 서버를 튜닝한다.

애플리케이션 리팩토링

 

캐싱 활용

  • 자주 접근하는 데이터를 캐시한다.  동일한 데이터에 대한 요청이 있을 때 마다 더 빠르게 제공할 수 있다
    • 캐시란? 데이터를 임시 저장하는 기술. 

비동기 프로그래밍

  • spring 의 비동기 서비스 및 메세징을 활용해 요청과 응답을 병렬로 처리하고 병목현상을 줄인다.
    • 비동기 프로그래밍이란? 동시에 작업을 여러 개 실행하는 방식. 각 작업이 완료될 때 까지 기다리지 않고 다른 작업을 수행한다. 

알고리즘 및 비즈니스 로직 최적화

  • 비즈니스 로직에서 성능에 영향을 미치는 부분을 개선, 불필요한 반복 작업을 최소화한다. 

데이터 베이스 리팩토링

 

실행 계획을 통한 쿼리 최적화

  • DB 쿼리를 검토하고 복잡한 쿼리를 최적화한다. 인덱스, 조인, 서브쿼리 등을 개선해 DB 성능을 향상시킨다. db 실행 계획을 확인하고 병목 현상을 식별해 인덱스 또는 조인을 추가한다.

인덱스 최적화

  • 자주 검색되는 열에 적절한 인덱스를 생성한다. 복합 인덱스를 고려해 검색 속도를 높인다.

데이터베이스 분리

  •  db를 읽기 전용과 쓰기 전용으로 분리해 읽기 작업에 대한 부하를 줄인다.

데이터 정규화 및 반정규화

  • 정규화를 통해 중복을 최소화하고 역정규화를 통해 읽기 성능을 향상시킨다.
    • 정규화가 항상 정답인 것은 아니다. 정규화를 하면 조인이 불가피한데, 데이터가 많을 수록 조인 비용이 많이 든다. 데이터가 많은 곳에선 반정규화를, 데이터가 적은 곳에선 정규화를 한다고 알고있다.

 


DB 리팩토링 - 적용

ALTER TABLE `board_server`.`post` 
ADD INDEX `name` (`name` ASC);

 

 

post table , name에 인덱스를 추가한다. 

 

 

DB 리팩토링 후 스파이크 테스트 결과 ->

[2024-11-21 15:01:14,567] Han/INFO/locust.main: Shutting down (exit code 0)
Type     Name                                                                          # reqs      # fails |    Avg     Min     Max    Med |   req/s  failures/s
--------|----------------------------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
POST     /members/sign-in                                                                1000     0(0.00%) |    216      30    1127    130 |    8.71        0.00
POST     /search                                                                        68867     0(0.00%) |     19       1     885     12 |  599.94        0.00
--------|----------------------------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
         Aggregated                                                                     69867     0(0.00%) |     22       1    1127     13 |  608.65        0.00

Response time percentiles (approximated)
Type     Name                                                                                  50%    66%    75%    80%    90%    95%    98%    99%  99.9% 99.99%   100% # reqs
--------|--------------------------------------------------------------------------------|--------|------|------|------|------|------|------|------|------|------|------|------
POST     /members/sign-in                                                                      130    160    210    260    470   1100   1100   1100   1100   1100   1100   1000
POST     /search                                                                                12     16     20     22     32     56    110    130    740    850    890  68867
--------|--------------------------------------------------------------------------------|--------|------|------|------|------|------|------|------|------|------|------|------
         Aggregated                                                                             13     17     20     23     35     75    120    150    880   1100   1100  69867

 

 

Endurance test ->

[2024-11-21 15:27:24,163] Han/INFO/locust.main: Shutting down (exit code 0)
Type     Name                                                                         
 # reqs      # fails |    Avg     Min     Max    Med |   req/s  failures/s
         Aggregated                                                                      3883     0(0.00%) |      8       1     159      5 |   68.46        0.00

Response time percentiles (approximated)
Type     Name                                                                                  50%    66%    75%    80%    90%    95%    98%    99%  99.9% 99.99%   100% # reqs
--------|--------------------------------------------------------------------------------|--------|------|------|------|------|------|------|------|------|------|------|------
POST     /members/sign-in                                                                      120    130    140    150    150    150    160    160    160    160    160    100
POST     /search                                                                                 5      6      6      7      8     10     13     16     30     39     39   3783
--------|--------------------------------------------------------------------------------|--------|------|------|------|------|------|------|------|------|------|------|------
         Aggregated                                                                              5      6      6      7      9     12     83    130    150    160    160   3883

 


애플리케이션 리팩토링

  • 레디스 expire.defaultTime 을 60 -> 600초로 수정
  • 검색 API 서비스 로직 비동기 처리 방식 수정
  • 레디스 검색 key 세분화
expire.defaultTime=36288000
@Async
@Cacheable(value = "getPosts",
        key = "'getPosts' + #request.getName() + #request.getCategoryId()",
        unless = "#result == null")

 

 

728x90