• vegeta 부하테스트의 github 경로 : https://github.com/tsenart/vegeta
  • vegeta는 일정한 요청 속도로 HTTP 서비스를 요청해야 하는 필요성을 기반으로 구축된 다용도 HTTP 부하 테스트
  • 부하 테스트를 사용하면 동시 사용자 요청을 시뮬레이션하여 실제 조건에서 애플리케이션의 동작을 테스트 가능
  • 여러 사용자가 동시에 액세스할 때 응용 프로그램의 동작을 결정하는 데 도움이 될 수 있음
  • vegeta는 Go 프로그래밍 언어로 작성된 오픈 소스 애플리케이션
  • vegeta는 명령줄 유틸리티와 라이브러리로 모두 사용할 가능
  • vageta 오픈 소스는 이름이 멋진 부하 테스트

vegeta 부하테스트의 장점과 단점

vegeta 부하테스트 장점

  • 명령형 cli와 go util 둘 다 지원
  • 초당 보낼 요청 개수를 정할 수 있음
  • 리포트와 그래프를 뽑아 볼 수 있음

vegeta 부하테스트 단점

  • 검색시 드래곤볼의 베지터가 나와서 검색이 불편함
  • 어떤 파라미터가 있는지 확인이 불편함 (Readme 문서만 있음)


vegeta 다운로드 및 설치

1. Linux 시스템에 Vegata를 설치하려면 최신 바이너리 버전을 다운로드

  • github에서 vegeta 오픈소스 다운

    $ wget https://github.com/tsenart/vegeta/releases/download/v12.8.4/vegeta_12.8.4_linux_amd64.tar.gz

2. 바이너리 파일의 압축 해제

  • github에서 다운 받은 vegeta 오픈소스 코드 압축 해제

    $ tar xvfz vegeta_12.8.4_linux_amd64.tar.gz

3. /usr/bin/ 디렉토리에 vegata 애플리케이션을 설치

  • 시스템 전체에서 사용할 수 있도록 바이너리 파일을 /usr/bin/ 디렉토리에 이동

    $ mv vegeta /usr/bin/vegeta

사용가능한 커맨드

  • vegeta 부하테스트는 엄청나게 많은 키워드를 가짐

  • vegeta 부하테스트에서 사용하는 옵션에 대해 간단한 설명

    Usage: vegeta [global flags] <command> [command flags]
    
    global flags:
    -cpus int
          Number of CPUs to use (defaults to the number of CPUs you have)
    -profile string
          Enable profiling of [cpu, heap]
    -version
          Print version and exit
    
    attack command:
    -body string
          Requests body file
    -cert string
          TLS client PEM encoded certificate file
    -chunked
          Send body with chunked transfer encoding
    -connections int
          Max open idle connections per target host (default 10000)
    -duration duration
          Duration of the test [0 = forever]
    -format string
          Targets format [http, json] (default "http")
    -h2c
          Send HTTP/2 requests without TLS encryption
    -header value
          Request header
    -http2
          Send HTTP/2 requests when supported by the server (default true)
    -insecure
          Ignore invalid server TLS certificates
    -keepalive
          Use persistent connections (default true)
    -key string
          TLS client PEM encoded private key file
    -laddr value
          Local IP address (default 0.0.0.0)
    -lazy
          Read targets lazily
    -max-body value
          Maximum number of bytes to capture from response bodies. [-1 = no limit] (default -1)
    -max-workers uint
          Maximum number of workers (default 18446744073709551615)
    -name string
          Attack name
    -output string
          Output file (default "stdout")
    -proxy-header value
          Proxy CONNECT header
    -rate value
          Number of requests per time unit [0 = infinity] (default 50/1s)
    -redirects int
          Number of redirects to follow. -1 will not follow but marks as success (default 10)
    -resolvers value
          List of addresses (ip:port) to use for DNS resolution. Disables use of local system DNS. (comma separated list)
    -root-certs value
          TLS root certificate files (comma separated list)
    -targets string
          Targets file (default "stdin")
    -timeout duration
          Requests timeout (default 30s)
    -unix-socket string
          Connect over a unix socket. This overrides the host address in target URLs
    -workers uint
          Initial number of workers (default 10)
    
    encode command:
    -output string
          Output file (default "stdout")
    -to string
          Output encoding [csv, gob, json] (default "json")
    
    plot command:
    -output string
          Output file (default "stdout")
    -threshold int
          Threshold of data points above which series are downsampled. (default 4000)
    -title string
          Title and header of the resulting HTML page (default "Vegeta Plot")
    
    report command:
    -buckets string
          Histogram buckets, e.g.: "[0,1ms,10ms]"
    -every duration
          Report interval
    -output string
          Output file (default "stdout")
    -type string
          Report type to generate [text, json, hist[buckets], hdrplot] (default "text")
    
    examples:
    echo "GET http://localhost/" | vegeta attack -duration=5s | tee results.bin | vegeta report
    vegeta report -type=json results.bin > metrics.json
    cat results.bin | vegeta plot > plot.html
    cat results.bin | vegeta report -type="hist[0,100ms,200ms,300ms]"



vegeta 부하테스트의 기본 컨맨드 설명

1. attack

  • 공격을 어떻게 할 것인지에 대한 명령
  • -duration 옵션
    • 대상에 요청을 발행하는 시간을 지정 → 얼마동안 공격을 할 것인가 대한 값
    • 내부 동시성 구조의 설정은 -duration 값을 변수로 가지고 있음
    • 테스트의 실제 실행 시간은 응답 지연으로 인해 지정된 것보다 더 길 수 있음
    • 무한 공격에 0 사용
    • 5초 동안 공격 예시
      -duration=5s

  • -rate 옵션

    • 대상에 대해 발행할 시간 단위당 요청 비율을 지정

    • 실제 요청 비율은 가비지 수집 등으로 인해 약간 다를 수 있지만 전반적으로 지정된 값에 매우 가깝게 유지됨

    • 기본적으로 1초에 몇개를 보낼 것인지 결정 → 설정하지 않은 경우 50/1s

    • 만약 0으로 하게 되면 무한으로 요청보내게 되는데 그럴 경우에는 추가적으로 max-workers의 수를 지정 필요

    • host 당 1초에 10번 요청

      -rate=10

  • -max-workers 옵션

    • max-workers는 vegeta를 실행할 때 같이 설정할 수 있는 옵션

    • worker는 만들어져서 공격을 하게 되는데 최대 몇개의 worker을 사용할 것인가에 해당하는 값을 지정

    • -max-workers는 공격에 사용되는 최대 작업자 수 지정

    • 공격에서 사용하는 동시성 수준을 제어하는 데 사용 가능

      -max-workers=10



2. report

  • 결과값에 대해서 어떤 형식으로 볼 것인지에 대해서 설정하는 command
  • 기본 설정인 text 출력 (-type=text)

    1. Requests → 테스트 중에 전송된 총 요청 수와 요청 비율을 출력

    2. Duration → 테스트의 총 기간, 애플리케이션에 대한 부하를 시뮬레이션하는 공격 기간 및 대기 시간을 출력

    3. Latencies → 공격에 포함된 모든 요청의 지연 시간과 인식된 최대 지연 시간의 평균 지연 시간(각각 50번째, 95번째, 99번째 백분위수)을 출력

    4. Bytes In → 요청 본문과 함께 전송 또는 수신된 바이트 수

    5. Bytes Out → 응답 본문과 함께 출력 또는 송신된 바이트 수

    6. Success → 애플리케이션으로 전송된 성공적인 요청의 백분위수를 출력

    7. Status Codes → 수신된 HTTP 응답 코드 및 해당 발생에 대한 카운터를 제공 (0 상태 코드는 요청 전송에 실패를 의미)

      $ echo "GET http://127.0.0.1:9997/" | vegeta attack -duration=5s | vegeta report
      Requests          [total, rate, throughput]                    250, 50.20, 50.20
      Duration           [total, attack, wait]                          4.98s, 4.98s, 369.149µs
      Latencies          [min, mean, 50, 90, 95, 99, max]     256.785µs, 468.522µs, 471.66µs, 537.929µs, 575.639µs, 942.898µs, 3.66ms
      Bytes In           [total, mean]                                   1000, 4.00
      Bytes Out         [total, mean]                                   0, 0.00
      Success            [ratio]                                             100.00%
      Status Codes    [code:count]                                    200:250

  • json 출력 (-type=json)
    $ echo "GET http://127.0.0.1:9997/" | vegeta attack -duration=5s | vegeta report -type=json > result.json
    $ cat result.json
    {
    "latencies": {
      "total": 121239389,
      "mean": 484957,
      "50th": 477588,
      "90th": 524619,
      "95th": 583750,
      "99th": 814515,
      "max": 6793623,
      "min": 262009
    },
    "bytes_in": {
      "total": 1000,
      "mean": 4
    },
    "bytes_out": {
      "total": 0,
      "mean": 0
    },
    "earliest": "2020-12-21T00:59:10.755216634+09:00",
    "latest": "2020-12-21T00:59:15.731910157+09:00",
    "end": "2020-12-21T00:59:15.732195838+09:00",
    "duration": 4976693523,
    "wait": 285681,
    "requests": 250,
    "rate": 50.23415624141097,
    "throughput": 50.231272776682474,
    "success": 1,
    "status_codes": {
      "200": 250
    },
    "errors": []
    }

  • histogram 출력 (-type=hist)

    $ echo "GET http://127.0.0.1:9997/" | vegeta attack -duration=5s | vegeta report -type='hist[0, 2ms, 4ms, 6ms, 8ms, 10ms]'
    Bucket            #       %          Histogram
    [0s,    2ms]    250  100.00%  ##################################################################
    [2ms,   4ms]    0    0.00%   
    [4ms,   6ms]    0    0.00%   
    [6ms,   8ms]    0    0.00%   
    [8ms,   10ms]  0    0.00%   
    [10ms,  +Inf]   0    0.00%

  • plot 이용한 시각화

    • 해당 데이터를 시각화하는 데이터로 만들어줌

    • 기본적으로 html 파일로 만들어주면 거기서 여러 데이터를 동시에 비교하면서 볼 수 있음

      $ vegeta attack -name=50qps -rate=50 -duration=5s -targets=targets.txt > results.50qps.bin
      $ cat results.50qps.bin | vegeta plot > plot.50qps.html



Vegeta로 부하 테스트 실행 → 테스트 진행하면서 정리 예정

1. 30초간 1000회의 요청을 10개의 worker가 실행하여 text 리포터로 출력

  • -rate=1000 → 시간 단위당 요청 비율을 지정(초당 요청 수 결정)

  • -duration=30s → 요청을 발행하는 시간 지정

  • -max-workers=10 → 공격에 사용되는 최대 작업자 수 지정

  • vegeta report → 기본 설정인 text 출력 (-type=text 생략)

    $ echo "GET http://www.hippo.shop/download/spring_music.mp4" | vegeta attack -rate=100 -duration=30s -max-workers=10 | vegeta report
    Requests        [total, rate, throughput]                   109, 3.63, 3.56
    Duration         [total, attack, wait]                          30.58s, 30.046s, 534.21ms
    Latencies        [min, mean, 50, 90, 95, 99, max]     514.095ms, 750.656ms, 666.337ms, 957.774ms, 1.503s, 1.883s, 1.948s
    Bytes In         [total, mean]                                   30293636430, 277923270.00
    Bytes Out       [total, mean]                                   0, 0.00
    Success          [ratio]                                            100.00%
    Status Codes  [code:count]                                   200:109
    Error Set:

2. 1초간 223개의 worker가 무한 요청하여 text 리포터로 출력 (100% 응답할 MAX)

  • -rate=0 → 무한으로 요청보내게 되는데 그럴 경우에는 추가적으로 max-workers의 수를 지정 필요

  • -duration=1s → 요청을 발행하는 시간 지정

  • -max-workers=223 → 공격에 사용되는 최대 작업자 수 지정(-rate=0일 때 필수)

  • vegeta report → 기본 설정인 text 출력 (-type=text 생략)

    $ echo "GET http://www.hippo.shop/download/spring_music.mp4" | vegeta attack -rate=0 -duration=1s -max-workers=223 | vegeta report
    Requests       [total, rate, throughput]                    224, 11.03, 7.62
    Duration        [total, attack, wait]                           29.389s, 20.314s, 9.075s
    Latencies       [min, mean, 50, 90, 95, 99, max]      6.297s, 26.281s, 26.555s, 29.03s, 29.326s, 29.379s, 29.383s
    Bytes In        [total, mean]                                    62254812480, 277923270.00
    Bytes Out      [total, mean]                                    0, 0.00
    Success         [ratio]                                             100.00%
    Status Codes [code:count]                                    200:224
    Error Set:

3. 1초간 224개의 worker가 무한 요청하여 text 리포터로 출력 (응답에 실패가 발생)

  • -rate=0 → 무한으로 요청보내게 되는데 그럴 경우에는 추가적으로 max-workers의 수를 지정 필요

  • -duration=1s → 요청을 발행하는 시간 지정

  • -max-workers=224 → 공격에 사용되는 최대 작업자 수 지정(-rate=0일 때 필수)

  • vegeta report → 기본 설정인 text 출력 (-type=text 생략)

    $ echo "GET http://www.hippo.shop/download/spring_music.mp4" | vegeta attack -rate=0 -duration=1s -max-workers=224 | vegeta report
    Requests        [total, rate, throughput]                  225, 12.44, 7.11
    Duration         [total, attack, wait]                        30.115s, 18.088s, 12.027s
    Latencies        [min, mean, 50, 90, 95, 99, max]   8.999s, 26.799s, 26.853s, 29.753s, 30.001s, 30.07s, 30.11s
    Bytes In         [total, mean]                                 59475579780, 264335910.13
    Bytes Out       [total, mean]                                 0, 0.00
    Success          [ratio]                                           95.11%
    Status Codes  [code:count]                                  0:11  200:214
    Error Set:

+ Recent posts