12/04/2026 18:15น.

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 เพื่อทดสอบ
- วิเคราะห์ผลลัพธ์เพื่อตัดสินใจปรับปรุงประสิทธิภาพ