25/04/2026 02:47น.

EP.107 การทำ Profiling และ Benchmark WebSocket Server
#Golang
#Benchmark
#Profiling
#WebSocket
เมื่อคุณพัฒนา WebSocket Server จนพร้อมใช้งานจริง (Production-ready) สิ่งสำคัญไม่ใช่แค่ "ระบบทำงานได้" แต่ต้อง ทำงานได้เร็ว เสถียร และใช้ทรัพยากรอย่างมีประสิทธิภาพ 🚀
ใน EP นี้ เราจะพาคุณเข้าสู่โลกของ Profiling และ Benchmarking เพื่อตรวจสอบว่าโค้ดของคุณทำงานได้ดีแค่ไหน พร้อมเทคนิคปรับแต่งประสิทธิภาพให้ทะลุขีดจำกัด!
เครื่องมือที่เราจะใช้:
- 🔬 pprof — วิเคราะห์การใช้ CPU, Memory และ Goroutines
- 💣 wrk — ทดสอบโหลดและความสามารถในการรับ request
- ⚡ hey — ทดสอบ Latency และอัตราความสำเร็จของการเชื่อมต่อ
🧩 1. ทำไมต้องทำ Profiling และ Benchmark?
เพราะถ้าไม่วัดผล เราจะไม่มีทางรู้ว่าโค้ดเราช้าเพราะอะไร
สิ่งที่คุณสามารถตรวจสอบได้ เช่น:
| สิ่งที่ควรรู้ | เพราะอะไร |
|---|---|
| จุดที่ใช้ CPU มาก | ปรับ logic หรือหลีกเลี่ยง loop ซ้อน |
| จุดที่ใช้ Memory เยอะ | ตรวจสอบ memory leak |
| Goroutine ค้างหรือเกิน | ป้องกัน deadlock หรือ panic |
| Latency สูง | หาคอขวดของการประมวลผล |
| รองรับกี่ connection | วางแผนขยายระบบได้แม่นยำ |
🔍 2. การใช้ pprof วิเคราะห์โค้ดระหว่างรันจริง
pprof คือเครื่องมือ built-in ของ Go ที่ให้คุณดู performance ของระบบใน runtime สามารถเปิด endpoint /debug/pprof/ แล้ววิเคราะห์ผ่านเบราว์เซอร์หรือ CLI
ตัวอย่างโค้ดเปิด pprof
import (
"log"
"net/http"
_ "net/http/pprof"
)
func main() {
go func() {
log.Println("Start pprof on :6060")
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
log.Println("WebSocket Server on :8080")
http.ListenAndServe(":8080", nil)
}
⚙️ 3. การใช้ wrk ทดสอบ Load และ Throughput
wrk เป็นเครื่องมือ benchmark ที่สามารถยิงโหลดระดับสูงไปยัง WebSocket หรือ HTTP ได้
ตัวอย่างคำสั่ง:
wrk -t12 -c400 -d30s http://localhost:8080/ws
| พารามิเตอร์ | ความหมาย |
|---|---|
-t12 | ใช้ 12 threads |
-c400 | จำลอง 400 connections |
-d30s | ยิง request ต่อเนื่อง 30 วินาที |
ผลลัพธ์ที่ได้จะบอก:
- Request/sec
- Latency เฉลี่ย
- Transfer/sec
⚡ 4. การใช้ hey ตรวจสอบ Latency และ Error Rate
hey เป็น CLI ที่ช่วยวัด Response Time และ Stability ของระบบ
ติดตั้ง:
go install github.com/rakyll/hey@latest
ตัวอย่างการใช้:
hey -n 1000 -c 50 http://localhost:8080/ws
จะได้ข้อมูลเช่น:
- 📉 Latency เฉลี่ย
- ❌ Error rate
- ✅ Success rate
🧠 5. เทคนิค Optimize สำหรับ Production
หลังจากได้ผลการวัดประสิทธิภาพแล้ว ให้ใช้ข้อมูลเพื่อปรับระบบ:
| ปัญหา | แนวทางแก้ |
|---|---|
| CPU ใช้สูง | ใช้ Goroutine Pool / ลดการ parse JSON |
| Memory สูง | ใช้ sync.Pool สำหรับ reuse buffer |
| Latency สูง | ใช้ binary protocol / ลดการ compress |
| Connection หลุดบ่อย | ปรับ timeout และ retry logic |
| GC หนัก | ปรับ runtime.GCPercent / เช็ค memory leak |
📊 6. ตัวอย่างการสรุปผล Benchmark
| Metric | ค่าเฉลี่ย | เป้าหมายที่ดี |
|---|---|---|
| Latency | 8.5 ms | < 10 ms |
| Throughput | 22,000 req/sec | > 20,000 |
| Memory Usage | 85 MB | < 100 MB |
| Error Rate | 0.03% | < 0.1% |
สรุปผลเหล่านี้ในทุก Sprint จะช่วยให้คุณวางแผน scaling และ optimize ระบบได้แบบมืออาชีพ
🚀 ท้าให้ลอง!
- ลองเปิด
pprofบน WebSocket Server จริงของคุณ - ใช้
wrkและheyยิงทดสอบจากเครื่องอื่น - เปรียบเทียบ “ก่อน” และ “หลัง optimize”
- ทำ Dashboard สรุปผลเทียบทุก Sprint
🌟 EP ถัดไป
📘 EP.108: การจัดการ Timeout และ Connection Cleanup แบบ Advanced เราจะพูดถึงเทคนิคจัดการ connection ที่หลุด ช้า หรือ idle เพื่อป้องกัน resource leak และทำให้ระบบเสถียรยิ่งขึ้นใน production!
อ่านบทความ 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/