25/04/2026 02:47น.

EP.101 การทำ WebSocket Server ให้ใช้ CPU และ Memory อย่างมีประสิทธิภาพ
#WebSocket Server
#Go
#Golang
#Memory Management
#CPU Optimization
ในโลกของระบบ Real-time ที่ผู้ใช้งานสามารถเชื่อมต่อพร้อมกันจำนวนมาก การใช้ WebSocket Server อย่างมีประสิทธิภาพกลายเป็นหัวใจสำคัญของความสำเร็จ โดยเฉพาะการบริหารจัดการทรัพยากร CPU และ Memory ซึ่งมีผลโดยตรงต่อความเร็ว ความเสถียร และความสามารถในการ Scale ระบบ
บทความนี้จะพาคุณไปเรียนรู้แนวทางในการ เพิ่มประสิทธิภาพการใช้ CPU และ Memory ของ WebSocket Server ที่เขียนด้วย Go พร้อมตัวอย่างโค้ด และ Best Practices ที่ใช้ได้จริงใน Production
🔧 1. การจัดการ CPU ให้มีประสิทธิภาพ
🧠 แยกงานหนัก (CPU-bound) ออกจาก main thread
งานที่ต้องใช้ CPU หนัก เช่น การเข้ารหัส, การประมวลผล JSON ขนาดใหญ่, หรือการประมวลผลข้อมูลเชิงลึก ควรถูกส่งไปทำงานใน Goroutine แยกออกมา เพื่อไม่ให้ block main WebSocket loop
go func(taskData string) {
result := heavyComputation(taskData)
fmt.Println(result)
}(data)
🚫 หลีกเลี่ยง Blocking Operation
- อย่าทำ I/O หรือ long-running task บน main thread
- ใช้
select {}กับ timeout เพื่อจัดการ loop ที่อาจรอคอยนานเกินไป
📊 ใช้ Go pprof เพื่อวัด CPU usage
- รัน
pprofserver ภายใน Go app - วิเคราะห์การใช้ CPU และดูว่าจุดไหนกินเวลามากที่สุด
💾 2. การจัดการ Memory ให้มีประสิทธิภาพ
✅ ใช้โครงสร้างข้อมูลแบบ optimized
หลีกเลี่ยงการใช้ struct ซ้อนกันหลายชั้นโดยไม่จำเป็น และใช้ map แบบเจาะจงประเภท เช่น:
var clients = make(map[*websocket.Conn]*Client)
🧹 ป้องกัน Memory Leak
- ปิด connection ที่ไม่ได้ใช้งานแล้วด้วย
conn.Close() - ลบข้อมูลจาก map เมื่อผู้ใช้ disconnect
📨 ใช้ Buffered Channel สำหรับการส่งข้อมูล
- ช่วยให้ไม่ block และลด memory allocation ที่ไม่จำเป็น
eventQueue := make(chan Event, 100) // Buffered channel
📋 3. Best Practices
🧩 ปรับ GOMAXPROCS ให้เหมาะกับจำนวน core
runtime.GOMAXPROCS(runtime.NumCPU())
📦 ใช้ Buffer Pool
ลดการสร้าง object ใหม่บ่อยๆ ด้วยการใช้ sync.Pool:
var bufferPool = sync.Pool{
New: func() interface{} {
return new(bytes.Buffer)
},
}
🔎 ตรวจสอบ Memory Leak ด้วย pprof
- ใช้
go tool pprofเพื่อดู memory profile - ตรวจสอบ object ที่ยังไม่ถูกเก็บ garbage collection
📈 4. การวัดประสิทธิภาพระบบ
🔥 ใช้ Load Testing Tools
| Tool | จุดเด่น |
|---|---|
hey | ง่าย เหมาะกับ HTTP Benchmark |
wrk | รองรับ script และ custom headers |
Gatling | สร้าง Scenario แบบจำลอง load จริง |
Artillery | รองรับ WebSocket โดยตรง |
🧪 Monitor แบบ Real-time
- ใช้ Prometheus + Grafana สำหรับดู CPU, Memory, Network, Latency
- ตรวจสอบว่า WebSocket Server สามารถรองรับ Connection ตามเป้าได้หรือไม่
🎯 Challenge สำหรับคุณ
ลองปรับแต่ง WebSocket Server ของคุณให้พร้อมรับมือกับจำนวนผู้ใช้สูง โดยใช้เทคนิคที่แนะนำในบทความนี้
✅ ใช้ Goroutine ในการแยกงานหนักออกจาก main loop
✅ วัดการใช้ CPU ด้วย pprof และปรับแต่งจุด bottleneck
✅ ใช้ buffered channel และ map สำหรับการจัดการ Client
✅ ตรวจสอบการรั่วของ memory เมื่อมีผู้ใช้งานเข้ามาและออกไป
✅ ทดสอบระบบด้วย Artillery ที่มี 1,000 concurrent connections
🧠 สรุป
WebSocket Server ที่ใช้ Go สามารถรองรับการเชื่อมต่อพร้อมกันจำนวนมากได้อย่างมีประสิทธิภาพ หากมีการจัดการ CPU และ Memory อย่างเหมาะสม โดยมีแนวทางที่ควรนำไปใช้งานจริง เช่น
- แยกงานหนักออกจาก main loop ด้วย Goroutine
- ปรับ
GOMAXPROCSให้เหมาะกับเครื่อง - ตรวจสอบการใช้งาน Memory และ CPU ด้วยเครื่องมือมาตรฐาน
- ลด allocation ใหม่ซ้ำๆ ด้วย buffer pool
🔜 Next EP:
EP.102 – การใช้ Goroutines และ Worker Pool สำหรับการจัดการ Concurrent Connections
เตรียมพบกับแนวทางการจัดการ Goroutines และสร้าง Worker Pool ที่มีประสิทธิภาพเพื่อรองรับ WebSocket Server ที่ต้องทำงานกับผู้ใช้งานหลายพันรายแบบไม่พัง ไม่รั่ว ไม่ค้าง แล้วพบกัน! 🚀
อ่านบทความ Series อื่นๆ
🔵 Facebook: https://www.facebook.com/superdev.academy.th
🔴 YouTube : Superdev Academy
📸 Instagram: Superdev Academy
🎬 TikTok: https://www.tiktok.com/@superdevacademy?lang=th-TH
🌐 Website: https://www.superdevacademy.com/