Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Follow install instructions here: https://k6.io/docs/getting-started/installation

 

...

Writing tests

This sample test calls the api/health endpoint on gamma.voluntarily.nz for 5 minutes. using 200 virtual users running as fast as possible.

The check block allows verification that the response is valid and transaction time is below a target value (here 1 second).

Code Block
import http from 'k6/http'
import { check, sleep } from 'k6'

const host = 'https://gamma.voluntarily.nz'
export const options = {
  vus: 200,
  duration: '300s'
}
export default function () {
  const res = http.get(`${host}/api/health`)
  check(res, {
    'status was 200': r => r.status === 200,
    'transaction time OK': r => r.timings.duration < 1000
  })
  sleep(1)
}

Running Tests

K6 performance tests are stored in x/perf/k6

Code Block
k6 run x/perf/k6/api_health.js

Typical output

Code Block

          /\      |‾‾|  /‾‾/  /‾/   
     /\  /  \     |  |_/  /  / /    
    /  \/    \    |      |  /  ‾‾\  
   /          \   |  |‾\  \ | (_) | 
  / __________ \  |__|  \__\ \___/ .io

  execution: local
     output: json=x/perf/k6/output/api_health.json
     script: x/perf/k6/api_health.js

    duration: 30s, iterations: -
         vus: 200, max: 200

    done [==========================================================] 30s / 30s

    ✓ status was 200
    ✓ transaction time OK

    checks.....................: 100.00% ✓ 10516 ✗ 0    
    data_received..............: 3.4 MB  114 kB/s
    data_sent..................: 551 kB  18 kB/s
    http_req_blocked...........: avg=36.89ms  min=0s      med=1µs     max=1.08s    p(90)=1µs      p(95)=1µs     
    http_req_connecting........: avg=3.49ms   min=0s      med=0s      max=120.69ms p(90)=0s       p(95)=0s      
    http_req_duration..........: avg=119.72ms min=54.47ms med=83.04ms max=849.47ms p(90)=243.28ms p(95)=344.75ms
    http_req_receiving.........: avg=383.49µs min=36µs    med=269µs   max=15.28ms  p(90)=913µs    p(95)=1.11ms  
    http_req_sending...........: avg=50.17µs  min=20µs    med=42µs    max=795µs    p(90)=73µs     p(95)=97µs    
    http_req_tls_handshaking...: avg=26.3ms   min=0s      med=0s      max=782.27ms p(90)=0s       p(95)=0s      
    http_req_waiting...........: avg=119.28ms min=54.14ms med=82.66ms max=849.07ms p(90)=241.8ms  p(95)=343.65ms
    http_reqs..................: 5258    175.265303/s
    iteration_duration.........: avg=1.16s    min=1.05s   med=1.08s   max=2.85s    p(90)=1.26s    p(95)=1.36s   
    iterations.................: 5078    169.26535/s
    vus........................: 200     min=200 max=200
    vus_max....................: 200     min=200 max=200

Key metrics are:

  • http_req_duration..........: avg=119.72ms

  • iterations.................: 5078 169.26535/s

This means the test request took on average 120ms - as expected. and that we were able to sustain 170 requests per second without errors.

Note that the deployment uses autoscaling. So when under load it may ramp up the number of servers available from 1 to 10. This means that an initial test might return a low result, possibly even error responses or too slow responses but that when run a second time more servers will be running and the test will pass ok.

To avoid longer running tests should ramp up the number of requests slowly. or disable autoscaling and set the service to a fixed number of servers.

Filter by label (Content by label)
showLabelsfalse
max5
spacescom.atlassian.confluence.content.render.xhtml.model.resource.identifiers.SpaceResourceIdentifier@aba
showSpacefalse
sortmodified
typepage
reversetrue
labelsperformance
cqllabel = "performance" and type = "page" and space = "VP"

...