K6 是一套負載測試工具 Load Testing Tool

用 Go 語言寫的,但是測試設定是用 javascript

K6 最初是 Load Impact , Load Impact 之後變成了 K6 , 再來被 Grafana 買去了

而 K6 分 Open Source 及 Cloud 產品線, Cloud 是要錢的,不過有最多 50 人模擬不用錢

底下拿 Open Source 來作測試

(如果想知道各家負載測試工具比較評筆,可看 Open source load testing tool review 2020)

安裝 K6

yum install https://dl.k6.io/rpm/repo.rpm -y
yum install --nogpgcheck k6 -y

寫設定檔

vi script.js
import http from 'k6/http';
import { sleep } from 'k6';

export default function () {
  http.get('https://ssorc.tw');
  sleep(1);
}

執行測試

k6 run script.js

結果

          /\      |‾‾| /‾‾/   /‾‾/   
     /\  /  \     |  |/  /   /  /    
    /  \/    \    |     (   /   ‾‾\  
   /          \   |  |\  \ |  (‾)  | 
  / __________ \  |__| \__\ \_____/ .io

  execution: local
     script: script.js
     output: -

  scenarios: (100.00%) 1 scenario, 1 max VUs, 10m30s max duration (incl. graceful stop):
           * default: 1 iterations for each of 1 VUs (maxDuration: 10m0s, gracefulStop: 30s)


running (00m01.1s), 0/1 VUs, 1 complete and 0 interrupted iterations
default   [======================================] 1 VUs  00m01.1s/10m0s  1/1 iters, 1 per VU

     data_received..................: 52 kB 47 kB/s
     data_sent......................: 698 B 635 B/s
     http_req_blocked...............: avg=45.28ms min=45.28ms med=45.28ms max=45.28ms p(90)=45.28ms p(95)=45.28ms
     http_req_connecting............: avg=2.96ms  min=2.96ms  med=2.96ms  max=2.96ms  p(90)=2.96ms  p(95)=2.96ms 
     http_req_duration..............: avg=51.53ms min=51.53ms med=51.53ms max=51.53ms p(90)=51.53ms p(95)=51.53ms
       { expected_response:true }...: avg=51.53ms min=51.53ms med=51.53ms max=51.53ms p(90)=51.53ms p(95)=51.53ms
     http_req_failed................: 0.00% ✓ 0       ✗ 1  
     http_req_receiving.............: avg=12.75ms min=12.75ms med=12.75ms max=12.75ms p(90)=12.75ms p(95)=12.75ms
     http_req_sending...............: avg=185.3µs min=185.3µs med=185.3µs max=185.3µs p(90)=185.3µs p(95)=185.3µs
     http_req_tls_handshaking.......: avg=35.09ms min=35.09ms med=35.09ms max=35.09ms p(90)=35.09ms p(95)=35.09ms
     http_req_waiting...............: avg=38.58ms min=38.58ms med=38.58ms max=38.58ms p(90)=38.58ms p(95)=38.58ms
     http_reqs......................: 1     0.91013/s
     iteration_duration.............: avg=1.09s   min=1.09s   med=1.09s   max=1.09s   p(90)=1.09s   p(95)=1.09s  
     iterations.....................: 1     0.91013/s
     vus............................: 1     min=1     max=1
     vus_max........................: 1     min=1     max=1

如果要模擬 10 人 , 並持續 30 秒

k6 run --vus 10 --duration 30s script.js

或者在 js 裡

import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
  vus: 10,
  duration: '30s',
};
export default function () {
  http.get('https://ssorc.tw');
  sleep(1);
}

如果要模擬不同時間不同人數

30 秒內為 20 人, 1 分 30 秒內為 10 人,剩 20 秒為 0 人 , 且狀態要是 200

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '30s', target: 20 },
    { duration: '1m30s', target: 10 },
    { duration: '20s', target: 0 },
  ],
};

export default function () {
  const res = http.get('https://ssorc.tw');
  check(res, { 'status was 200': (r) => r.status == 200 });
  sleep(1);
}

K6 支援輸出的格式

讓你可以將結果輸出至以下平台

  • Amazon CloudWatch
  • Apache Kafka (deprecated)
  • Cloud
  • CSV
  • Datadog
  • Grafana Cloud / Prometheus
  • InfluxDB
  • JSON
  • Netdata
  • New Relic
  • Prometheus
  • StatsD

輸出成 JSON 格式

可以這麼作

k6 run script.js --out json=output.json

或者

使用 grafana + influxdb 圖形介面

(參考 使用 influxdb + telegraf + grafana 收集主機資料、監控,並圖形化分析)

先在 influxdb 設好資料庫

create database k6db
create user k6user with password 'k6password'
grant all on k6db to k6user

確認連線 OK

curl -G http://1.1.1.1:8086/query -u k6user:k6password --data-urlencode "q=SHOW DATABASES"
influx -username 'k6user' -password 'k6password'

就可以加上 –out 參數輸出至 influxdb

k6 run --out influxdb=http://localhost:8086/k6db script.js

使用 grafana 來顯示結果 (範本 )

k6 - load testing tool

Related posts 相關文章
Grafana k6 有 Web dashboard
More...

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。