- 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)
Requests → 테스트 중에 전송된 총 요청 수와 요청 비율을 출력
Duration → 테스트의 총 기간, 애플리케이션에 대한 부하를 시뮬레이션하는 공격 기간 및 대기 시간을 출력
Latencies → 공격에 포함된 모든 요청의 지연 시간과 인식된 최대 지연 시간의 평균 지연 시간(각각 50번째, 95번째, 99번째 백분위수)을 출력
Bytes In → 요청 본문과 함께 전송 또는 수신된 바이트 수
Bytes Out → 응답 본문과 함께 출력 또는 송신된 바이트 수
Success → 애플리케이션으로 전송된 성공적인 요청의 백분위수를 출력
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:
'성능 테스트' 카테고리의 다른 글
HAR 파일 Import와 Export (with Chrome 브라우저) (0) | 2024.03.21 |
---|---|
아파치벤치(ApacheBench, ab) 활용 (0) | 2023.09.15 |
Siege 부하 테스트 (경량 벤치마크 테스트) (0) | 2023.09.15 |
sysbench 명령어 (서버 성능 테스트) (0) | 2022.06.27 |