สรุปสั้น ๆ
สวัสดีครับ วันนี้ผมจะมาแนะนำเครื่องมือสำหรับทำ Load Test กันครับ สำหรับใครที่เคยใช้เครื่องมืออื่น ๆ อย่างเช่น JMeter มาก่อนหน้า ต้องบอกเอาไว้ก่อนว่าความสามารถของเจ้า AutoCannon อาจจะไม่เยอะเท่า แต่ความง่ายนั้นชนะขาดแน่นอนครับ
เขียนโดย
Sutthinai Boonyingyongchai
MidLevel Software Developer
บทความนี้ตีพิมพ์ และ เผยแพร่เมื่อ 25 สิงหาคม 2566
แนะนำตัว AutoCannon
AutoCannon เป็น “HTTP/1.1 benchmarking tool” หรือก็คือเป็นเครื่องมือ Load Test นั่นแหละ โดยได้แรงบันดาลใจมาจาก wrk และ wrk2 (ที่ผมเองก็ไม่รู้จักมาก่อนเหมือนกัน) แล้วก็ตามที่เกริ่นเอาไว้ในหัวบทความครับ AutoCannon สร้างด้วย Node นั่นเอง เพราะฉะนั้น ตั้งแต่การติดตั้งไปจนกระทั่งการใช้งานก็สะดวกมาก ๆ ถ้าเราติดตั้ง Node ไว้ในเครื่องของเราแล้ว
ติดตั้ง
ใช้ท่าประจำ npm i ติดตั้งแบบ Global ได้เหมือน Package ทั่ว ๆ ไป
npm i autocannon -g
หรือว่าถ้าเรียกใช้ผ่านโค้ดในโปรเจ็กต์ก็ติดตั้งแบบธรรมดาได้
npm i autocannon
ใช้แบบไว ๆ ผ่าน Command Line
เริ่มด้วยวิธีใช้งานที่ง่ายที่สุดก็คือใน Command Line นั่นเอง โดยถ้าหากเราติดตั้งแบบ Global เราก็จะสามารถเรียกใช้งานด้วยชื่อ Package ได้ทุกที่เลย ตอนนี้เรามาลองดูหน้าตาการเรียกใช้กันก่อน
แบบพื้นฐาน
ใช้คำสั่ง autocannon ตามด้วย URL โดยที่ไม่ได้ระบุ Option อะไรเลย
คำสั่ง
autocannon http://localhost:3001
ผลลัพธ์
จากผลลัพธ์จะเป็นการทดสอบโดยใช้ค่า Default ทั้งหมด ก็คือสร้าง 10 Connection รุมยิงไปที่ URL ดังกล่าวเป็นเวลา 10 วินาที
จากรูปผลลัพธ์จะแบ่งเป็น 2 ตาราง ได้แก่
- Request Latency – ระยะเวลาที่ได้รับ Response
- Request Volume – จำนวน Request และขนาดข้อมูลต่อวินาที
ส่วนหัวตารางทั้งสองอันก็จะมี
- ตัวเลขผลลัพธ์จากแต่ละ Percentile
- Avg – Average
- Stdev – Standard deviation
- Max – Request Latency ที่มากที่สุด
- Min – Request Volume ที่น้อยที่สุด
แบบระบุ Options
AutoCannon มี Option ให้ใส่เยอะมาก ตามไปดูเต็ม ๆ ได้ที่ Command Line Usage โดยแต่ละคำสั่งจะเรียกใช้ได้แบบย่อและแบบเต็มแล้วแต่ความชอบ โดยรูปแบบคำสั่งจะเป็นแบบนี้
autocannon [options] URL
Option ที่น่าสนใจ เช่น
- -c/–connections NUM
ระบุจำนวน Connection ที่จะใช้ยิง - -d/–duration SEC
ระยะเวลาในการทดสอบหน่วยเป็นวินาที - -a/–amount NUM
จำนวน Request ที่ต้องการยิง ถ้าระบุค่านี้ Option duration จะไม่ถูกนำมาใช้ - -m/–method METHOD
HTTP Method ที่จะใช้ - -b/–body BODY
Request Body - -H/–headers K:V
Request Header ในรูปแบบของ Key:Value
ตัวอย่าง
- autocannon -c 100 -d 30 -m POST http://localhost:3000/posts
- -c 100
สร้าง 100 Connection - -d 30
ยิงเป็นเวลา 30 วินาที - -m POST
ด้วย Method POST
- -c 100
- autocannon -m POST -H “Content-Type: application/json” -b ‘{“key”: “value”}’ http://localhost:3000/posts
- -m POST
ใช้ Method POST - -H “Content-Type: application/json”
ใส่ Content-Type: application/json ใน Header - -b ‘{“key”: “value”}’
JSON ที่ส่งใน Body
- -m POST
ใช้แบบเขียนโค้ด
เนื่องจาก AutoCannon สร้างขึ้นมาด้วย Node เพราะฉะนั้น เราจึงสามารถเขียนโค้ดและเรียกใช้งานในโปรเจ็กต์ได้ ถ้าต้องการความซับซ้อนของการทดสอบ ต้องการเอามาใช้ซ้ำ หรือว่าจะเอาไปเป็นส่วนนึงของโปรเจ็กต์ก็สามารถทำได้ไม่ยาก โดย AutoCannon สามารถใช้งานทั้งแบบ Callback และ Async/Await
แบบ Callback
ใช้ console.log เป็น Callback Function
const autocannon = require('autocannon');
autocannon({
url: 'http://localhost:3000',
connections: 10,
duration: 10
}, console.log);
หรือเขียนแบบเต็ม ๆ ก็จะสามารถรับค่า Error ได้ด้วย
const autocannon = require('autocannon');
autocannon({
url: 'http://localhost:3001',
connections: 10,
duration: 10
}, (err, result) => {
if (err) {
console.error('Error:', err);
} else {
console.log(result);
}
});
แบบ Async/Await
รอ Result แล้วค่อยเอาไปใช้งานต่อ
const autocannon = require('autocannon');
async function runAutoCannon() {
const result = await autocannon({
url: 'http://localhost:3000/posts',
connections: 10,
duration: 10
});
console.log(result);
}
runAutoCannon();
ผลลัพธ์
ผลลัพธ์จะออกมาเป็น Object ที่ระบุ Option ที่ใช้ แล้วก็ผลลัพธ์ที่ได้ หน้าตาแบบนี้
❯ node main.js
{
title: undefined,
url: 'http://localhost:3000/posts',
socketPath: undefined,
connections: 10,
sampleInt: 1000,
pipelining: 1,
workers: undefined,
duration: 10.02,
samples: 10,
start: 2023-08-25T10:28:58.427Z,
finish: 2023-08-25T10:29:08.446Z,
errors: 0,
timeouts: 0,
mismatches: 0,
non2xx: 0,
resets: 0,
'1xx': 0,
'2xx': 9758,
'3xx': 0,
'4xx': 0,
'5xx': 0,
statusCodeStats: { '200': { count: 9758 } },
latency: {
average: 9.75,
mean: 9.75,
stddev: 2.29,
min: 2,
max: 43,
p0_001: 2,
p0_01: 2,
p0_1: 3,
p1: 7,
p2_5: 8,
p10: 8,
p25: 8,
p50: 9,
p75: 10,
p90: 12,
p97_5: 15,
p99: 18,
p99_9: 39,
p99_99: 43,
p99_999: 43,
totalCount: 9758
},
requests: {
average: 975.8,
mean: 975.8,
stddev: 87.16,
min: 805,
max: 1087,
total: 9758,
p0_001: 805,
p0_01: 805,
p0_1: 805,
p1: 805,
p2_5: 805,
p10: 805,
p25: 909,
p50: 994,
p75: 1044,
p90: 1064,
p97_5: 1087,
p99: 1087,
p99_9: 1087,
p99_99: 1087,
p99_999: 1087,
sent: 9768
},
throughput: {
average: 273209.6,
mean: 273209.6,
stddev: 24380.55,
min: 225400,
max: 304360,
total: 2732240,
p0_001: 225407,
p0_01: 225407,
p0_1: 225407,
p1: 225407,
p2_5: 225407,
p10: 225407,
p25: 254591,
p50: 278527,
p75: 292351,
p90: 297983,
p97_5: 304383,
p99: 304383,
p99_9: 304383,
p99_99: 304383,
p99_999: 304383
}
}
สำหรับตัวอย่างการใช้งาน AutoCannon ที่เอามาให้ดูในครั้งนี้ก็เป็นแค่การใช้งานแบบพื้นฐานเท่านั้น ทั้งการใช้งานแบบ Command Line และแบบเขียน Code ยังมี Option อีกเยอะมาก ๆ ให้เลือกใช้งาน ลองแวะเข้าไปอ่าน Doc แบบเต็ม ๆ กันได้ แล้วก็ขอให้สนุกกับการเขียนโค้ดครับ
ระบบฝึกทักษะ การเขียนโปรแกรม
ที่พร้อมตรวจผลงานคุณ 24 ชั่วโมง
- โจทย์ปัญหากว่า 200 ข้อ ที่รอท้าทายคุณอยู่
- รองรับ 9 ภาษาโปรแกรมหลัก ไม่ว่าจะ Java, Python, C ก็เขียนได้
- ใช้งานได้ฟรี ! ครบ 20 ข้อขึ้นไป รับ Certificate ไปเลย !!