[Grafana] grafana k6로 테스트 환경 구성(grafana, influxdb, k6)
ㅁ 관련글
ㅇ [Node.js] PM2를 사용한 Node.js 관리하기(PM2 사용법 정리)
ㅇ [Docker] Docker와 pm2를 함께 사용하는 것이 불리한 이유
ㅇ [Docker] Express 서버를 Docker에서 PM2로 기동하는 방법
ㅇ [Grafana] grafana k6로 테스트 환경 구성(grafana, influxdb, k6)
ㅁ 들어가며
ㅇ Grafana k6를 사용하여 부하 테스트를 수행하는 방법을 로컬과 Docker를 이용하는 방법을 정리하였다.
ㅇ 로컬에서 k6를 설치하여 부하를 주는 방법과 Docker-compose로 k6, influxDB, grafana를 생성하여 테스트 환경을 세팅하는 과정을 정리하였다.
ㅁ k6 로컬 설치 방법
brew install k6 # macOS
choco install k6 # Windows
ㅇ 로컬에서 테스트하는 경우 설치 방법이다.
ㅁ 테스트 스크립트 작성
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
vus: 10,
duration: '30s',
};
export default function () {
http.get('http://test.k6.io');
sleep(1);
}
ㅇ script.js 작성
ㅇ 10명의 클라이언트 들이 30초 동안 부하를 발생시킨다.
ㅁ 테스트 실행
k6 run script.js
ㅁ Docker를 이용한 테스트 방법
$ docker run --rm -i grafana/k6 run --vus 1000 --duration 20s - < script.js
/\ Grafana /‾‾/
/\ / \ |\ __ / /
/ \/ \ | |/ / / ‾‾\
/ \ | ( | (‾) |
/ __________ \ |_|\_\ \_____/
execution: local
script: -
output: -
scenarios: (100.00%) 1 scenario, 1000 max VUs, 50s max duration (incl. graceful stop):
* default: 1000 looping VUs for 20s (gracefulStop: 30s)
running (01.0s), 1000/1000 VUs, 0 complete and 0 interrupted iterations
default [ 5% ] 1000 VUs 01.0s/20s
~~~~~
running (20.0s), 1000/1000 VUs, 18238 complete and 0 interrupted iterations
default [ 100% ] 1000 VUs 20.0s/20s
data_received..................: 4.6 MB 226 kB/s
data_sent......................: 1.6 MB 79 kB/s
http_req_blocked...............: avg=42.01ms min=583ns med=1.83µs max=3.12s p(90)=5.04µs p(95)=22.02ms
http_req_connecting............: avg=41.99ms min=0s med=0s max=3.12s p(90)=0s p(95)=21.99ms
http_req_duration..............: avg=10.57ms min=401.58µs med=5.23ms max=94.3ms p(90)=24.53ms p(95)=30.82ms
{ expected_response:true }...: avg=10.57ms min=401.58µs med=5.23ms max=94.3ms p(90)=24.53ms p(95)=30.82ms
http_req_failed................: 0.00% 0 out of 19238
http_req_receiving.............: avg=20.12µs min=4.08µs med=11.7µs max=3.57ms p(90)=34.5µs p(95)=52.26µs
http_req_sending...............: avg=83.72µs min=1.41µs med=4.08µs max=43.11ms p(90)=29.92µs p(95)=97.71µs
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
http_req_waiting...............: avg=10.47ms min=383.87µs med=5.19ms max=63.29ms p(90)=24.44ms p(95)=30.76ms
http_reqs......................: 19238 944.835741/s
iteration_duration.............: avg=1.05s min=1s med=1s max=4.14s p(90)=1.02s p(95)=1.06s
iterations.....................: 19238 944.835741/s
vus............................: 1000 min=1000 max=1000
vus_max........................: 1000 min=1000 max=1000
running (20.4s), 0000/1000 VUs, 19238 complete and 0 interrupted iterations
default ✓ [ 100% ] 1000 VUs 20s
ㅇ client 1000명이 20초동안 부하 발생시킨다.
ㅇ 10초 단위로 1000명의 클라이언트가 수행된다.
ㅇ 수행 후 결과를 확인할 수 있다.
ㅇ 지금까지 로컬환경에서 간단히 테스트 하는 방법이었다.
docker-compose를 이용한 k6+ influxDB + grafana 구성 방법을 정리해 보자.
ㅁ docker compose 설치
# git clone
$ git clone https://github.com/grafana/k6 && cd k6
# update submodule
$ git submodule update --init
# influxdb grafana만 실행
$ docker compose up -d influxdb grafana
ㅇ git clone
ㅇ docker compose up
version: '3.4'
networks:
k6:
grafana:
services:
influxdb:
image: influxdb:1.8
networks:
- k6
- grafana
ports:
- "8086:8086"
environment:
- INFLUXDB_DB=k6
grafana:
image: grafana/grafana:9.3.8
networks:
- grafana
ports:
- "3000:3000"
environment:
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_BASIC_ENABLED=false
volumes:
- ./grafana:/etc/grafana/provisioning/
k6:
image: grafana/k6:latest
networks:
- k6
ports:
- "6565:6565"
environment:
- K6_OUT=influxdb=http://influxdb:8086/k6
volumes:
- ./examples:/scripts
ㅇ 참고로 docker-compose.yml이다.
ㅇ grafana는 Admin권한으로 아무나 쓸 수 있다.
ㅁ Grafana 로그인
ㅇ localhost:3000으로 접근하여 admin/admin으로 로그인한다.
ㅇ admin의 비번을 변경하면 메인 화면으로 이동한다.
ㅁ Grafana Dashboard 생성
ㅇ Browse를 클릭하여 이동
ㅇ New를 클릭하여 Import 선택
ㅇ 2587을 입력, Load 클릭
ㅇ InfluxDB를 데이터 소스로 추가
ㅇ influxdb를 선택하고 import를 클릭한다.
ㅇ influxdb는 이미 Datasource로 세팅되어 있다.
ㅇ 데시보드가 완성되었다.
ㅁ 부하 테스트 스크립트 준비
ㅇ git소스 중 examples에 다양한 테스트 스크립트 예제들이 있다.
ㅇ 참고로 k6 test script 에서 자세한 정보 확인 가능하다.
ㅁ 테스트 대상 기동
$ docker run -d -p 3100:3000 --name pm2test express-docker-pm2
ㅇ [Docker] Express 서버를 Docker에서 PM2로 기동하는 방법에서 생성하였던 express 샘플을 기동시켰다.
ㅇ Port는 3100->3000으로 설정
ㅇ 기동 확인
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
vus: 10,
duration: '30s',
};
export default function () {
http.get('http://localhost:3100');
sleep(1);
}
ㅇ test.js를 생성하였다.
ㅁ 테스트 실행 및 결과 확인
$ k6 run --out influxdb=http://localhost:8086 test.js
/\ Grafana /‾‾/
/\ / \ |\ __ / /
/ \/ \ | |/ / / ‾‾\
/ \ | ( | (‾) |
/ __________ \ |_|\_\ \_____/
execution: local
script: test.js
output: InfluxDBv1 (http://localhost:8086)
scenarios: (100.00%) 1 scenario, 10 max VUs, 1m0s max duration (incl. graceful stop):
* default: 10 looping VUs for 30s (gracefulStop: 30s)
data_received..................: 72 kB 2.4 kB/s
data_sent......................: 24 kB 798 B/s
http_req_blocked...............: avg=28.38µs min=1µs med=4µs max=711µs p(90)=10µs p(95)=32.39µs
http_req_connecting............: avg=12.79µs min=0s med=0s max=416µs p(90)=0s p(95)=0s
http_req_duration..............: avg=1.63ms min=801µs med=1.35ms max=11.29ms p(90)=2.02ms p(95)=2.46ms
{ expected_response:true }...: avg=1.63ms min=801µs med=1.35ms max=11.29ms p(90)=2.02ms p(95)=2.46ms
http_req_failed................: 0.00% 0 out of 300
http_req_receiving.............: avg=31.42µs min=8µs med=20.5µs max=280µs p(90)=60.3µs p(95)=84.09µs
http_req_sending...............: avg=21.5µs min=3µs med=11µs max=575µs p(90)=37.2µs p(95)=62µs
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
http_req_waiting...............: avg=1.58ms min=751µs med=1.3ms max=11.2ms p(90)=1.94ms p(95)=2.41ms
http_reqs......................: 300 9.972712/s
iteration_duration.............: avg=1s min=1s med=1s max=1.01s p(90)=1s p(95)=1s
iterations.....................: 300 9.972712/s
vus............................: 10 min=10 max=10
vus_max........................: 10 min=10 max=10
running (0m30.1s), 00/10 VUs, 300 complete and 0 interrupted iterations
default ✓ [======================================] 10 VUs 30s
ㅇ k6로 테스트 실행
ㅇ Grafana 대시보드에서 실시간으로 결과 모니터링
ㅇ pm2 plus 지표 결과
ㅇ pm2 monit으로 서버 지표 및 로그 확인 결과
ㅇ pm2 imonit으로 처리 지연상황을 확인 할 수 있음.
ㅁ 과부하 테스트
$ k6 run --out influxdb=http://localhost:8086 --vus 1000 --duration 300s test.js
~~~~~~~
data_received..................: 71 MB 237 kB/s
data_sent......................: 24 MB 80 kB/s
http_req_blocked...............: avg=102.67µs min=0s med=2µs max=101.1ms p(90)=4µs p(95)=5µs
http_req_connecting............: avg=95.86µs min=0s med=0s max=101.07ms p(90)=0s p(95)=0s
http_req_duration..............: avg=3.06ms min=0s med=1.63ms max=57.83ms p(90)=6.75ms p(95)=11.8ms
{ expected_response:true }...: avg=3.03ms min=198µs med=1.63ms max=57.83ms p(90)=6.63ms p(95)=11.59ms
http_req_failed................: 0.27% 823 out of 299000
http_req_receiving.............: avg=34.24µs min=0s med=13µs max=20.65ms p(90)=30µs p(95)=46µs
http_req_sending...............: avg=38.37µs min=0s med=5µs max=34.82ms p(90)=25µs p(95)=64µs
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
http_req_waiting...............: avg=2.99ms min=0s med=1.6ms max=47.45ms p(90)=6.65ms p(95)=11.44ms
http_reqs......................: 299000 995.960361/s
iteration_duration.............: avg=1s min=1s med=1s max=1.1s p(90)=1s p(95)=1.01s
iterations.....................: 299000 995.960361/s
vus............................: 1000 min=1000 max=1000
vus_max........................: 1000 min=1000 max=1000
running (5m00.2s), 0000/1000 VUs, 299000 complete and 0 interrupted iterations
default ✓ [======================================] 1000 VUs 5m0s
ㅇ 가상사용자 1000명, 5분동안 부하를 발생시켰다.
ㅇ 823 out of 299000가 실패, 실패율: 0.27%
ㅇ grafana 지표이다.
ㅇ 가상 사용자, 초당 인입량
ㅇ max, min의 처리지연 그래프.
ㅇ 요청 지연 시간을 확인할 수 있다.(오른쪽 하단)
ㅁ 함께 보면 좋은 사이트
ㅇ [Spring] SpringBoot K6 + Grafana 부하 https://yeon-dev.tistory.com/203테스트 및 모니터링