k6 installation is surprisingly easy, but the real magic is how it lets you define complex load scenarios with simple JavaScript.

Let’s see k6 in action. Imagine you want to simulate 100 users hitting your API’s /users endpoint every second for 30 seconds. Here’s how you’d write that script:

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

export const options = {
  vus: 100, // Virtual Users
  duration: '30s', // Duration of the test
};

export default function () {
  http.get('http://your-api.com/users');
  sleep(1); // Wait for 1 second between iterations
}

To run this, you’d first install k6 (more on that below). Then, save the code as script.js and execute:

k6 run script.js

Within seconds, k6 will spin up 100 virtual users, each making a request to /users every second for half a minute. You’ll see output like this in your terminal, showing request rates, latencies, and error rates:

          /\      | cyclohexane |
     /\  /  \    /  \
    /  \    /  \    /  \
   /    \  /    \  /    \
  /______\/______\/______\

  http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
  http_req_failed=0.00%
  http_req_sending=0ms  avg=0ms   min=0ms   max=0ms   p(90)=0ms   p(95)=0ms   p(99)=0ms
  http_req_waiting=50ms  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
  http_req_connecting=0ms  avg=0ms   min=0ms   max=0ms   p(90)=0ms   p(95)=0ms   p(99)=0ms
  http_req_tls_handshake=0ms  avg=0ms   min=0ms   max=0ms   p(90)=0ms   p(95)=0ms   p(99)=0ms
  http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
  checks=1.00%  ✓

     data_received=1.2MB  50.0KB/s
     data_sent=780B  32.5B/s
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)  avg=50ms  min=50ms  max=50ms  p(90)=50ms  p(95)=50ms  p(99)=50ms
     checks=1.00%  ✓
     http_req_failed=0.00%
     http_req_duration=(50ms,50ms,50ms)

Want structured learning?

Take the full K6 course →