K6 Load-Test Beginner Guide

Arthorn Kittinukul
4 min readJul 14, 2024

--

Table of Contents

  1. Introduction
  2. K6 คืออะไร? ทำไมใช้ K6 ในการ Load Testing?
  3. Setting Up K6
  4. เริ่มต้นเขียน K6 Script
  5. Analyzing Test Results
  6. ข้อผิดพลาดทั่วไปและการแก้ไขปัญหา
  7. สรุป
GitHub — grafana/k6: A modern load testing tool, using Go and JavaScript — https://k6.io

1. Introduction

การทำ Load test เป็นการทดสอบว่า application ของเราสามารถรองรับการเข้ามาของผู้ใช้พร้อมๆกันได้ไหม เครื่องเราจะ down หรือปล่าว ซึ่งจะช่วยเพิ่มประสิทธิภาพและความน่าเชื่อถือ เมื่อไม่นานมานี้ผมมีโอกาสได้ทำงานเกี่ยวกับการ Load test และผมก็อยากจะมาแชร์สิ่งที่ผมได้เรียนรู้มาทั้งข้อดีเเละข้อผิดพลาดที่เกิดขึ้น

2. K6 คืออะไร? ทำไมใช้ K6 ในการ Load Testing?

K6 คือ open-source load test ออกเเบบมาเพื่อทดสอบ performance ของ application K6 ถูกเขียนมาจาก Golang เเต่ใช้ JavaScript interface ให้ผู้ใช้เขียน script ผ่าน JavaScript เเต่ไปทำงานผ่าน Go

ดังนั้นเราจึงไม่สามารถ import package ของ JavaScript มาใช้ได้ทั้งหมด เราต้องไปดู document ของ K6 ว่า allow package ไหนให้เราใช้บ้าง Modules (k6.io)

Example: เราสามารถใช้ K6 จำลองเสมือนเป็นผู้ใช้จริงตั้งเเต่หลักสิบ หลักร้อย หลัก พัน หรือหลายหมื่นคน ตามเเต่เราจะ config ซึ่งจะเหมือนกับการที่มีผู้ใช้จำนวนหนึ่งเข้ามาใช้งาน application ของเรา นั้นทำให้เราสามารถจำลองสถานะการต่างๆในการเข้ามาของผู้ใช้ ได้ว่าจะเข้ามาใช้งานมากน้อยตอนไหน เช่น ถ้าเราทำ application ขายของ เเละมีของใหม่จะปล่อยเข้ามาในระบบ และคาดหวังว่าจะมีคนเข้ามากดเพิ่มสินค้าเข้าตะกร้าพร้อมๆกัน การใช้ K6 จึงเหมือนการจำลองสถานการณ์เพื่อให้เรารับมือเมื่อถึงเวลาจริงได้ดีขึ้น

3. Setting Up K6

MacOS

สามารถ install ผ่าน brew ได้ด้วย command

brew install k6

Windows

choco install k6

หรือ

winget install k6 --source winget

หรือ download ผ่าน link นี้ https://dl.k6.io/msi/k6-latest-amd64.msi

4. เริ่มต้นเขียน K6 Script

สร้าง K6 script เเละเริ่มเขียน test scenario เป็น JavaScript file. โดยเราจะมาเริ่มกันที่พื้นฐานของการเรียก HTTP request ไปหา service กันก่อน

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

export let options = {
vus: 10,
duration: '30s',
};

export default function () {
let res = http.get('https://test.k6.io');
check(res, {
'status is 200': (r) => r.status === 200,
});
sleep(1);
}

วิธีการ run K6 scprit นั้นง่ายมาก ไปที่ directory ที่ไฟล์ script ของเราอยู่ เเล้วสามารถ run ผ่าน command ต่อไปนี้ได้เลย

k6 run script.js

ถ้า script ทำงานจะเห็นหน้าตาแบบนี้ที่ terminal โดย K6 จะทำการ process และ แสดง output แบบ real time โดยที่เมื่อหลังจาก process เสร็จเเล้วเราจะเห็นข้อมูล เช่น จำนวนผู้ใช้เสมือน (VU) อัตรา request/sec และ response

เริ่มปรับ script ของเรา เช่น ทำเป็น scenario หรือจะเพิ่ม จำนวน VU หรือการ ramping up/down VU ตามเวลาที่เราต้องการ

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

export let options = {
scenarios: {
scenario1: {
executor: 'ramping-vus',
startVUs: 1,
stages: [
{ duration: '5s', target: 10}, // Ramp-up to 10 users in 5s
{ duration: '5s', target: 50 }, // Ramp-up to 50 users in 5s
{ duration: '10s', target: 2}, // Ramp-down to 2 users in 10s
],
},
},
}

export default function () {
let res = http.get('https://test.k6.io');
check(res, {
'status is 200': (r) => r.status === 200,
});
sleep(1);
}

หรือเรายังสามารถเพิ่ม thresholds เพื่อเอาไว้ check ค่าที่เรา expect ไว้ได้ เช่น

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

export let options = {
scenarios: {
scenario1: {
executor: 'ramping-vus',
startVUs: 1, // Start at 1 VU
stages: [
{ duration: '5s', target: 10}, // Ramp-up to 10 users in 5s
{ duration: '5s', target: 50 }, // Ramp-up to 50 users in 5s
{ duration: '10s', target: 2}, // Ramp-down to 2 users in 10s
],
},
},
thresholds: {
http_req_duration: ['p(90)<1500'], // 90% of requests must complete below 1.5s
}
}

export default function () {
let res = http.get('https://test.k6.io');
check(res, {
'status is 200': (r) => r.status === 200,
});
sleep(1);
}

เเละยังมี detail อีกมากมายในการ เขียน script สามารถตามอ่านต่อได้ที่ Load testing for engineering teams | Grafana k6

5. Analyzing Test Results

K6 output มี detail มาให้หลายอย่างหลังจาก run script เสร็จเเล้ว เช่น response times, error rates, and throughput. section นี้จะเป็น guide walkthrough output ต่างๆที่ K6 ให้มา

Result ที่ดูหลังจาก script run เสร็จ

  • http_req_duration:
http_req_duration..............: avg=300ms  min=100ms  med=200ms  max=1s  p(90)=500ms  p(95)=700ms

avg(ค่าเฉลี่ยของ response time)
min(response time ที่น้อยที่สุด)
med(response time ค่ากลาง)
max(response time มากที่สุด)
P(90)(Percentile 90)
P(95)(Percentile 95)

ค่าที่ดูบ่อยๆ เพื่อประกอบการตัดสินใจจะเป็น P(90)

หมายถึงค่า response time ที่ 90% ของ requests ทั้งหมด เสร็จสิ้นภายในเวลานั้น คือ ถ้า P(90) ของ response time เท่ากับ 500ms หมายความว่า 90% ของ requests ทั้งหมดมี response time ไม่เกิน 500 มิลลิวินาที และมีเพียง 10% ของ requests ที่ใช้ response time นานกว่านั้น

  • http_req_failed: คือค่าที่ requests fail ของ requests ทั้งหมด เช่น
http_req_failed................: 0.1%  (10/10000)

มี requests ทั้งหมด 10,000 requests
requests ที่ล้มเหลวมี 10 requests
requests ที่ล้มเหลวคิดเป็น 0.1% ของ requests ทั้งหมด
  • iterations: หมายถึง application สามารถรองรับจำนวนการดำเนินการที่มากภายใต้การโหลด
iterations...................227 7.309/s

จำนวน iterations ทั้งหมดคือ 227 ครั้ง
อัตรา iterations เฉลี่ยคือ 7.309 ต่อวินาที

Output ที่จะเห็นหลังจาก script run เสร็จเเล้ว:

เพื่อให้ K6 ทำงานได้ดีที่สุดจากการทำ load test ควรเอา load test script ไปทำงานรวมกับ CI/CD pipeline เพื่อเป็นการ monitored ทุกๆ code change ไม่ทำให้ performance ของระบบนั้นช้าลง ซึ่งสามารถ integrate รวมกับ Jenkins, GitLab CI, and GitHub Actions ได้.

หนึ่งใน best practise ที่ควรเอามาใช้ตอนทำ load test คือ ควรเริ่มจาก จำนวน VU(Virtul User) น้อยๆ เเละค่อยเพิ่มขึ้นตามลำดับ เรียกอีกอย่างก็คือ ค่อยๆเพิ่ม load ของระบบทีละเล็กๆ และสุดท้ายนี้คือ ควรจะจำลองการเข้ามาของผู้ใช้ให้เหมือนจริง

6. ข้อผิดพลาดทั่วไปและการแก้ไขปัญหา

Load test นั้นเป็นเรื่องที่ค่อนข้าง challange พอสมควรเพราะว่าเป็นทั้งการจำลองพฤติกรรมผู้ใช้ และเป็นการ set up resource ของเครื่อง server, database type, อีกทั้งยังเรื่องของ code ที่เราได้ทำลงไปนั้น ก็มีส่วนในการทำให้ performance ดีขึ้นหรือช้าลงได้ สิ่งที่ควรจะทำก่อนการเริ่มทำ load test นั้นมีดังนี้

  • หาว่า application ของเรานั้นจะมีผู้ใช้เข้ามากี่คน เเละพฤติกรรมของการใช้งานเป็นอย่างไร
  • ดูว่า service ของเรานั้นมี dependency กับอะไรบ้าง เช่น Gateway ของเราใช้อะไร มี plugin อะไรไหม? database size, database connection, ระบบของเรามี cache ไหม, ระบบของเรามีเรียกไปหา 3rd Party หรือปล่าว
  • เตรียมข้อมูลของ VU ของเราก่อนเริ่ม execute script
  • Check log ของระบบว่าเรามีไหม และ log เเสดงอะไรมาบ้าง
  • เตรียม test environment และ check ให้ดีว่าไม่ไปกระทบกับ environment อื่น
  • อ่าน document ของ K6

7. สรุป

ส่วนตัวเเล้ว ผมไม่ได้ทำ Load test บ่อย หรือเชี่ยวชาญทางด้านการทำ Load test ซึ่งไม่ว่าคุณจะเป็นนักพัฒนามือใหม่ หรือนักพัฒนาที่มีประสบการณ์ K6 สามารถช่วยคุณระบุและแก้ไขปัญหาด้าน performance ได้ ทำให้มั่นใจได้ว่า application จะปรับ config และ resource ได้อย่างราบรื่นภายใต้โหลดจำนวนมาก

อย่าลืมเริ่มต้นจากการทำ script และ VU เล็กๆก่อน ค่อยๆ เพิ่ม load และจำลองสถานการณ์ที่สมจริงเสมือนผู้ใช้จะมาใช้งานระบบเรา อีกหนึ่งเรื่องที่ทำให้เรามั่นใจใน application คือการรวม K6 เข้ากับ pipeline CI/CD จะช่วยทำให้เราสามารถ monitor performance ได้อยู่ตลอดที่ code change.

การทำ load test นั้นไม่ใช่เรื่องยาก เเต่ก็ไม่ใช่เรื่องง่ายด้วยเช่นกัน ขอให้สนุกกับการทำ Load Test ครับ!”

Reference

--

--

No responses yet