ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JMeter를 사용한 API호출 부하 테스트 에러 수정 -2
    spring 2024. 2. 8. 12:07
    반응형

     

    도입

    OpenApI 를 사용하는데 있어서 5건/초 , 1,000건/일 제한이 문제가 되었다. (개발단계 제한)

    Jmeter를 통해 부하테스트를 하는 도중 쓰레드 수를 늘리거나 루프 카운트를 늘릴 경우 오류가 생겼다.

    이를 위해 RateLimiter를 사용해 보았지만 이는 단일 쓰레드에 적용되는 방식이기 때문에 효과를 보지 못하였다.

    이를 위해 쓰레드 풀 적용과 CompletableFuture를 사용하였다.

     

    개념 

     

    우선 자바에서는 스레드를 운영체제의 자원으로 사용한다. 따라서 스레드가 계속해서 생성된다면 운영 체제의 자원이 빨리 소진되게 된다. 즉, 동시 접속자가 많아질 경우 스레드가 무한히 생성되며 서버가 다운될 수 있다는 것이다.

    바로 이러한 문제를 방지하기 위해서 사용 스레드의 개수를 관리하는 방법이 쓰레드 풀이다.

    미리 적절한 수의 스레드를 생성하고, 예비 스레드의 수와 대기 시간등을 정함으로써 스레드 생성과 소멸에 대한 비용을 줄일 수 있고 자원을 효율적으로 관리 할 수 있다.

    이렇게 쓰레드 풀을 사용하게 되면 메서드를 비동기적으로 실행할 수 있다.

    그렇기 때문에 CompletableFuture를 사용하게 되는데  이는, 자바에서 비동기적인 연산을 쉽게 다룰 수 있도록 도와주는 클래스이다.

     

    적용

     

    @Configuration
    @EnableAsync
    public class AsyncConfig {
    private int corePoolSize=8;
    private int maxPoolSize=8;
    private int queueCapacity=16;


    @Bean(name = "characterThreadPool")
    public Executor characterThreadPool() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(corePoolSize);
    executor.setMaxPoolSize(maxPoolSize);
    executor.setQueueCapacity(queueCapacity);
    executor.setThreadNamePrefix("CharacterThread-");
    executor.initialize();
    return executor;
    }

    }
    우선 설정 클래스에서 @EnableAsync 어노테이션을 달아준다.
    이후 기본 쓰레드 숫자와 최대 쓰레드 숫자를 설정해 준다.
    이때 적정 쓰레드 수를 설정하는데 참고할만한 공식이 있다.
    적정 스레드 개수 = cpu 수 *(1+대기 시간/ 서비스 시간)
    안정적인 응답시간으로 처리할 수 있는 1초당 요청수 = 스레드 풀 크기/ 평균 응답시간

     

    아직 많은 데이터를 테스트 해보진 못했으나 jmeter로 테스트 한 결과

    cpu수(8코어) * (1+48 / 50) = 대략 8개로 우선 적정 쓰레드 숫자는 8개로 정하였다.

    따라서 1초당 요청수는 8/0.50 로 16건 정도로 설정했다.

     

    @Async("characterThreadPool")
    이후 서비스 메서드에 @Async어노테이션을 추가하여 적용을 해주면 설정한 스레드풀이 적용된다.
    또한, private final RateLimiter rateLimiter = RateLimiter.create(5.0); 를 사용하여 각각의 스레드의 최대 호출 제한을 5건으로 제한 하였다.
    개선해야 할점
    Jmeter를 사용하여 추가 테스트를 시행하고 적정 쓰레드 수를 설정해야 한다.
    중복 API 호출건에 대하여 openAPI 호출자체가 필요 없도록 수정해야 한다.
    반응형

    댓글

Designed by Tistory.