การดู : 250

25/04/2026 02:47น.

EP.101 การทำ WebSocket Server ให้ใช้ CPU และ Memory อย่างมีประสิทธิภาพ

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

  • รัน pprof server ภายใน 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/