Page tree
Skip to end of metadata
Go to start of metadata

Gatling

Gatling

시나리오 작성 방법

  • 레코딩 툴을 이용하여 성능 테스트 코드를 작성하는 방법
  • Scala를 이용하여 직접 성능 테스트 코드를 작성하는 방법

유의사항

  • 반드시 검증 로직을 넣어야 한다.
  • 바뀌는 값들은 변수 처리를 해 주어야만 한다.
  • 정적인 파일들은 되도록 제거하고 동적인 URL(WAS에 부하를 주는 URL)만을 요청하도록 스크립트를 수정 한다.

Quick Start

  1. recorder.sh 실행

  2. No static resources 클릭

  3. Proxy SwitchyOmega 설치
  4. gatling.sh 실행

기본 문법

class 구성
package computerdatabase // 1
import io.gatling.core.Predef._ // 2
import io.gatling.http.Predef._
import scala.concurrent.duration._
class BasicSimulation extends Simulation { // 3
  val httpConf = http // 4
    .baseURL("http://computer-database.gatling.io") // 5
    .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") // 6
    .doNotTrackHeader("1")
    .acceptLanguageHeader("en-US,en;q=0.5")
    .acceptEncodingHeader("gzip, deflate")
    .userAgentHeader("Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0")

  val scn = scenario("BasicSimulation") // 7
    .exec(http("request_1") // 8
    .get("/")) // 9
    .pause(5) // 10

  setUp( // 11
    scn.inject(atOnceUsers(1)) // 12
  ).protocols(httpConf) // 13
}
  1. package 지정 (optional)
  2. import
  3. class declaration 선언. 반드시 extends Simulation 해야함
  4. 일반적인 HTTP 요청용 선언문
  5. baseURL 은 상대 경로가 지정되어 있을 때 사용
  6. HTTP 헤더 지정
  7. scenario 선언
  8. request_1라는 이름을 갖는 HTTP요청. 이 이름은 결과 리포트에 나타남
  9. GET 방식의 URL 요청. POST 일 때에는 post()
  10. think time
  11. 시뮬레이션 지정용 setUp() 메소드
  12. 단일 사용자 지정. inject() 메소드 내에 필요한 옵션 지정
  13. 위에서 지정한 프로토콜 사용함을 지정

Loop & Condition

repeat

  • 특정 횟수동안 반복
  • repeat(times, counterName) { // counterName 은 생략 가능 
      myChain
    }

during

  • 명시한 시간 만큼 반복
  • during(duration, counterName, exitASAP) { // duration 후의 값들은 생략 가능 
      myChain
    }

부하 모델

Ramp-up Load

  • 점진적으로 부하를 증가 시키는 모델

적용 시점

  • 적정 부하량 확인
  • 과부하 시 시스템 failure point 식별
  • 병목 구간 식별

Cruising Load (Endurance Test)

  • 지속적으로 부하를 가하는 모델

적용 시점

  • Resource Leak 확인
  • 주기적인 job 수행으로 인한 특이사항 식별

Spike Load

  • 순간적으로 높은 부하를 가하는 모델

적용 시점

  • 이벤트성 업무
  • 신규 서비스
  • 입찰, 경매, 쿠폰 신청 등의 선착순 및 짧은 시간에 사용자가 급격히 집중되는 업무

Simulation setup

Injection
setUp(
  scn.inject(
    nothingFor(4 seconds), // 1
    atOnceUsers(10), // 2
    rampUsers(10) over(5 seconds), // 3
    constantUsersPerSec(20) during(15 seconds), // 4
    constantUsersPerSec(20) during(15 seconds) randomized, // 5
    rampUsersPerSec(10) to 20 during(10 minutes), // 6
    rampUsersPerSec(10) to 20 during(10 minutes) randomized, // 7
    splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedBy(10 seconds), // 8
    splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedBy atOnceUsers(30), // 9
    heavisideUsers(1000) over(20 seconds) // 10
  ).protocols(httpConf)
)
  1. nothingFor(duration): duration 만큼 그냥 대기
  2. atOnceUsers(nbUsers): 사용자 수만큼 한번에 수행
  3. rampUsers(nbUsers) over(duration): duration 동안 0~사용자 수 까지 증가
  4. constantUsersPerSec(rate) during(duration): 15초동안 초당 20명씩 추가
  5. constantUsersPerSec(rate) during(duration) randomized: 15초동안 랜덤한 간격으로 20명씩 추가
  6. rampUsersPerSec(rate1) to (rate2) during(duration): 초당 10명의 사용자에서 +20명까지 일정한 간격으로 10분동안 증가 (10, 21, 33, 46, ...)
  7. rampUsersPerSec(rate1) to(rate2) during(duration) randomized: 초당 10명의 사용자를 20명까지 랜덤한 간격으로 10분동안 증가
  8. splitUsers(nbUsers) into(injectionStep) separatedBy(duration): 10명의 사용자를 10초 간격으로 증가 시키고, 10초 단위로 수행. 1000 명에 도달할 때까지 반복
  9. splitUsers(nbUsers) into(injectionStep1) separatedBy(injectionStep2): 10초동안 10명의 사용자를 증가시키고, 30 명이 되면 한번에 수행시킴. 이 작업을 1000명에 도달할 때까지 반복
  10. heavisideUsers(nbUsers) over(duration): 주어진 숫자만큼의 사용자를 heaviside 단계를 거쳐 주어진 기간동안 증가시킴

Appendix

참고 자료

  • No labels