민스씨의 일취일장

nGrinder | 동시성 시나리오 만들기 본문

Projects/MetaPay

nGrinder | 동시성 시나리오 만들기

읻민스 2024. 8. 17. 17:43
반응형

이 글은 Github Isssu #12 1-4 nGrinder 동시성 이슈 시나리오 만들기를 다룹니다.

nGrinder 동시성 테스트 시나리오 만들기

동시성을 고려한 서비스

동시성을 고려한 서비스를 만들기 위해 동시성 테스트를 준비하고 있다. 동시성 문제가 유발할 수 있는 환경은 크게 두 가지 방법으로 만들어 낼 수 있다.

  1. nGrinder 컨트롤러 설정
  2. 테스트 Script 수정

nGrinder 컨트롤러 설정만으로 동시성 시나리오 구성

동시성이라하면 여러명이 동시에 작업을 요청해야 한다. 이를 위해서 여러 Agent를 구성할 수도 있다. 하지만 리소스를 많이 사용하지 못하는 환경에서 작은 규모에 테스트를 진행한다면 하나의 Agent로 동시성 시나리오를 만들 수 있다. 어떻게? 방법은 nGrinder 설정으로 가능하다. nGrinder 성능 테스트 설정 페이지에 가보면 이렇게 다양한 설정을 할 수 있다.

nGrinder Controller 모습이다.
nGrinder Controller

Vuser 증가

Vuser는 에이전트별 가상사용자 수를 말한다. 위의 이미지에서는 1명으로 되어있고, 최대 3000명까지 설정 가능하다고 표시돼 있다. 이 수치를 증가시키면 동시 접속자 수가 늘어난 것 처럼 시뮬레이션 된다.

Vuser = Number of Process * Number of Thread per Process

Vuser는 실은 프로세스 수와 프로세스당 실행되는 스레드 수의 곱과 같다. 따라서 가상 사용자를 변경하면 이에 맞게 프로세스수와 프로세스당 스레드수를 조정해 준다. 만약 프로세스당 스레드 수와 프로세스의 수를 직접 설정하고 싶으면 수정해주면 된다. 그럼 그에 맞에 또 알아서 Vuser 수가 설정된다.

테스트 지속 시간 늘리기

테스트 지속 시간 자체가 동시성을 일으키는 것은 아니지만, 시스템이 오래 작동될 수록 프로세스나 스레드가 리소스 경쟁하는 상황을 자주 만들 수 있기 때문에 고려해볼 수 있는 요소이다.

램프업 기간 설정

램프업은 시간에 따라 동적으로 프로세스나 스레드의 수를 늘려 주는 방식이다. 이 방식은 한 번에 테스트로 시스템이 임계점에 도달하는 모습을 관측할 수 있어 테스트 효율을 높혀줄 수 있다.

테스트 스크립트 설정으로 동이성 시나리오 구성

스레드 랜덤 지연

스크립트를 작성할 때 스레드가 랜덤하게 멈추도록 하면 더욱 무작위 트래픽 몰림 현상을 유도할 수 있다. (하지만 랜덤이기 때문에 우연히도 트래픽 몰림이 발생안할 수도 있다.)

Thread.sleep(Math.random() * 1000)

랜덤 사용자

테스트 시나리오를 작성할 때, userId를 고정값으로 설정하는 경우가 있다. 이럴 경우 한 사용자가 지속적으로 접근하는 것으로 인식 돼 진짜 발생할 수 있는 동시성의 이슈를 빗겨갈 수 있다. 매번 새로운 사람들의 요청을 받도록 하기 위해 userId를 랜덤하게 생성되도록 할 수 있다.

userId = "user${System.currentTimeMillis() % 1000}"

동시성 테스트 시나리오

일단 가능한 여러 시나리오를 구성해 보았다. 이 중 선별해서 사용하거나 전체 테스트 진행할 계획이다.

1. 기본 테스트

- 고정 Vuser : 10
- 테스트 시간 : 30초 ~ 2분 [선택]
- 일정한 부하 유지 (Rampup 없음)
- 스레드 랜덤 Sleep 없음
- 고정 userID 사용

2. Vuser 증가 테스트

- 시작 Vuser: 10
- 최대 Vuser: 100
- 증가 간격: 10초마다 10 Vuser 증가
- 고정 userId 사용
- 총 테스트 시간: 1번 테스트에서 결정한 시간으로 진행

3. Rump-Up 테스트

- 시작 Vuser : 0
- 최대 Vuser : 100
- Ramp Up 시간 : 1번 테스트에서 결정한 시간의 절반
- 유지 시간 : 1번 테스트에서 결정한 시간의 절반
- 총 테스트 시간 : 1번 테스트에서 결정한 시간
- 고정 userId 사용

4. Thread Random Sleep 테스트

- 고정 Vuser : 50
- Sleep 범위: 100ms ~ 1000ms
- 총 테스트 시간 : 1번 테스트 시간
- 고정 userId 사용

5. userId 동적 생성 테스트

- 고정 Vuser : 10
- userId 범위: 1~100
- 총 테스트 시간 : 1번 테스트 시간

6. 조합 테스트 (Vuser 증가 + 랜덤 Sleep)

- 시작 Vuser : 10
- 최대 Vuser : 100
- 증가 간격 : 10초마다 10Vuser 증가
- Sleep 범위 : 100ms ~ 500ms
- 총 테스스 시간 : 3분

7. 최종 종합 테스트

- 시작 Vuser: 0
- 최대 Vuser: 100
- Rampup 시간: 1분
- 유지 시간: 2분
- Sleep 범위: 100ms ~ 500ms
- userID 범위: 1 ~ 1000
- 총 테스트 시간: 4분

 

 

728x90
반응형