Skip to main content
0

สรุปสั้น ๆ

สวัสดีครับ วันนี้ผมจะมาแนะนำเครื่องมือสำหรับทำ 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
  • 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

ใช้แบบเขียนโค้ด

เนื่องจาก 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 ไปเลย !!
เข้าใช้งานระบบ DevLab ฟรี !เรียนรู้เพิ่มเติม

เรียนรู้ไอที “อัพสกิลเขียนโปรแกรม” จากตัวจริง
ปั้นให้คุณเป็น คนสายไอทีระดับมืออาชีพ

BorntoDev

Author BorntoDev

BorntoDev Co., Ltd.

More posts by BorntoDev

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • คุกกี้ที่จำเป็น
    เปิดใช้งานตลอด

    ประเภทของคุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้
    รายละเอียดคุกกี้

  • คุกกี้สำหรับการติดตามทางการตลาด

    ประเภทของคุกกี้ที่มีความจำเป็นในการใช้งานเพื่อการวิเคราะห์ และ นำเสนอโปรโมชัน สินค้า รวมถึงหลักสูตรฟรี และ สิทธิพิเศษต่าง ๆ คุณสามารถเลือกปิดคุกกี้ประเภทนี้ได้โดยไม่ส่งผลต่อการทำงานหลัก เว้นแต่การนำเสนอโปรโมชันที่อาจไม่ตรงกับความต้องการ
    รายละเอียดคุกกี้

บันทึกการตั้งค่า