การดู : 0

12/04/2026 18:15น.

Ep.29 Go กับ Stress Testing - วัดขีดจำกัดระบบของคุณ!

Ep.29 Go กับ Stress Testing - วัดขีดจำกัดระบบของคุณ!

#Go

#Golang

#ภาษา Go

#การเขียนโค้ด Go

#Stress Testing

#WebSocket

#ทดสอบสมรรถนะ

#ปรับปรุงประสิทธิภาพ

#คอขวด

#การจำลองการเชื่อมต่อ

#การพัฒนาโปรแกรม

#การศึกษาการเขียนโปรแกรม

#การเขียนโปรแกรม

#การเขียนโปรแกรม Go

#การเขียนโปรแกรมสำหรับมือใหม่

#ฝึกเขียนโปรแกรม

#ภาษาโปรแกรม

#โปรแกรม

#ภาษาโปรแกรมมิ่ง

#พัฒนาโปรแกรม

#โปรแกรมเมอร์

#Superdev School

Go กับ Stress Testing - วัดขีดจำกัดระบบของคุณ!

ใน EP นี้ เราจะมาดูวิธีการทำ Stress Testing หรือการทดสอบสมรรถนะของ WebSocket เพื่อวัดว่าระบบของคุณสามารถรองรับผู้ใช้งานพร้อมกันได้มากแค่ไหน รวมถึงระบุคอขวด (Bottleneck) เพื่อปรับปรุงประสิทธิภาพครับ!

 

Stress Testing คืออะไร?

Stress Testing เป็นการจำลองการใช้งานระบบในสถานการณ์ที่หนักหน่วง เช่น การเชื่อมต่อพร้อมกันจำนวนมาก หรือการส่งข้อความถี่ๆ เพื่อทดสอบว่าระบบสามารถทำงานได้ตามที่คาดหวังหรือไม่

 

วัตถุประสงค์ของ Stress Testing

1. วัดความสามารถสูงสุดของระบบ

2. ค้นหาคอขวด (Bottleneck) เช่น CPU, RAM หรือเครือข่าย

3. ปรับปรุงประสิทธิภาพและเสถียรภาพของระบบ

 

เครื่องมือสำหรับ Stress Testing WebSocket

1. autocannon : เครื่องมือทดสอบ HTTP และ WebSocket ที่ใช้งานง่าย

2. wrk : เครื่องมือทดสอบ HTTP แบบมีประสิทธิภาพ (รองรับ WebSocket ผ่านสคริปต์)

3. สคริปต์ Go แบบกำหนดเอง : ใช้ Go สร้าง WebSocket Client เพื่อจำลองการใช้งาน

 

วิธีการใช้ autocannon กับ WebSocket

1. ติดตั้ง autocannon

npm install -g autocannon

 

2. เรียกใช้ autocannon เพื่อทดสอบ WebSocket

สมมติว่า WebSocket Server รันอยู่ที่ ws://localhost:8080/ws:

อธิบาย :

  • c 100 : จำนวนการเชื่อมต่อพร้อมกัน (100 connections)
  • d 30 : ระยะเวลาในการทดสอบ (30 วินาที)
  • p 10 : จำนวนการร้องขอพร้อมกันต่อการเชื่อมต่อ (10 requests)

ผลลัพธ์ : autocannon จะแสดงผลลัพธ์ เช่น จำนวนคำขอต่อวินาที (Requests/sec) และเวลาแฝง (Latency)

autocannon -c 100 -d 30 -p 10 ws://localhost:8080/ws

 

การสร้าง Stress Testing ด้วย Go

หากต้องการความยืดหยุ่น เราสามารถเขียนโปรแกรม Go เพื่อจำลองการเชื่อมต่อ WebSocket จำนวนมาก

ตัวอย่างโค้ด Stress Testing ด้วย Go

อธิบาย :

  • clientCount : จำนวนการเชื่อมต่อที่ต้องการทดสอบ
  • testConnection : ฟังก์ชันสำหรับจำลองการเชื่อมต่อและส่งข้อความ
  • sync.WaitGroup : ใช้เพื่อรอให้ทุกการเชื่อมต่อเสร็จสิ้น
package main

import (
    "log"
    "net/url"
    "sync"
    "time"

    "github.com/gorilla/websocket"
)

func testConnection(id int, wg *sync.WaitGroup) {
    defer wg.Done()

    u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"}
    conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
    if err != nil {
        log.Printf("Client %d: Error connecting: %v", id, err)
        return
    }
    defer conn.Close()

    for i := 0; i < 10; i++ { // ส่งข้อความ 10 ครั้ง
        msg := []byte("Hello from client " + string(id))
        if err := conn.WriteMessage(websocket.TextMessage, msg); err != nil {
            log.Printf("Client %d: Error writing message: %v", id, err)
            return
        }
        _, response, err := conn.ReadMessage()
        if err != nil {
            log.Printf("Client %d: Error reading response: %v", id, err)
            return
        }
        log.Printf("Client %d: Received: %s", id, response)
        time.Sleep(500 * time.Millisecond) // เว้นช่วงเวลา
    }
}

func main() {
    var wg sync.WaitGroup
    clientCount := 100

    for i := 0; i < clientCount; i++ {
        wg.Add(1)
        go testConnection(i, &wg)
    }

    wg.Wait()
    log.Println("Stress test completed")
}

การวิเคราะห์ผลลัพธ์

หลังจากทดสอบ คุณควรวิเคราะห์ :

1. การใช้งาน CPU และ RAM : ตรวจสอบว่าทรัพยากรเพียงพอหรือไม่

2. ค่า Latency : เวลาที่ใช้ในการตอบสนองต่อคำขอ

3. การเชื่อมต่อที่ล้มเหลว : จำนวนการเชื่อมต่อที่ไม่สำเร็จหรือหลุด

การปรับปรุงประสิทธิภาพหลังการทดสอบ

1. เพิ่มขนาด Cluster : หากพบว่าระบบไม่สามารถรองรับผู้ใช้จำนวนมากได้ ให้เพิ่มเซิร์ฟเวอร์ใน Cluster

2. ใช้ Load Balancer : เช่น NGINX หรือ Kubernetes เพื่อกระจายคำขอ

3. เพิ่ม Rate Limiting : จำกัดคำขอต่อผู้ใช้เพื่อลดภาระของเซิร์ฟเวอร์

 

สรุปง่ายๆ

  • Stress Testing ช่วยให้คุณทราบขีดจำกัดของระบบ
  • ใช้เครื่องมือ เช่น autocannon หรือเขียนโปรแกรม Go เพื่อทดสอบ
  • วิเคราะห์ผลลัพธ์เพื่อตัดสินใจปรับปรุงประสิทธิภาพ