22/04/2026 07:11น.

Ep.30 Go กับการวิเคราะห์ Log หลัง Stress Testing - ปรับปรุงระบบให้ดียิ่งขึ้น!
#วิเคราะห์ Log
#Stress Testing
#คอขวด
#WebSocket
#ปรับปรุงประสิทธิภาพ
#การวิเคราะห์ข้อมูล
#Go
#Golang
#ภาษา Go
#การเขียนโปรแกรม Go
#การเขียนโปรแกรมสำหรับมือใหม่
#การศึกษาการเขียนโปรแกรม
#การเขียนโปรแกรม
#ฝึกเขียนโปรแกรม
#ภาษาโปรแกรม
#ภาษาโปรแกรมมิ่ง
#โปรแกรม
#โปรแกรมเมอร์
#Superdev School
Go กับการวิเคราะห์ Log หลัง Stress Testing - ปรับปรุงระบบให้ดียิ่งขึ้น!
ใน EP นี้ เราจะมาดูวิธีวิเคราะห์ Log และ ผลลัพธ์จาก Stress Testing เพื่อค้นหาคอขวด (Bottleneck) ของระบบ WebSocket และแนวทางการแก้ปัญหาเพื่อเพิ่มประสิทธิภาพระบบของคุณครับ!
ทำไมต้องวิเคราะห์ Log หลัง Stress Testing?
Log เป็นแหล่งข้อมูลสำคัญที่ช่วยให้เรา :
1.เข้าใจปัญหาที่เกิดขึ้น เช่น การเชื่อมต่อหลุด หรือข้อความที่ส่งไม่สำเร็จ
2.ระบุทรัพยากรที่ใช้งานหนักเกินไป เช่น CPU, RAM หรือเครือข่าย
3.วางแผนปรับปรุงระบบเพื่อรองรับผู้ใช้งานจำนวนมากขึ้น
ประเภทของ Log ที่ต้องตรวจสอบ
1.Connection Log : ตรวจสอบจำนวนการเชื่อมต่อที่สำเร็จและล้มเหลว
2.Latency Log : วิเคราะห์เวลาที่ใช้ในการตอบสนองคำขอ
3.Error Log : ดูข้อผิดพลาด เช่น การตัดการเชื่อมต่อหรือข้อความที่ไม่สามารถส่งได้
4.Resource Log : ตรวจสอบการใช้งานทรัพยากร เช่น CPU, RAM และแบนด์วิดท์
ตัวอย่างการวิเคราะห์ Log ใน Go
1. เพิ่ม Logging ใน WebSocket Server
ในตัวอย่างนี้ :
บันทึก Log เมื่อมีการเชื่อมต่อใหม่และเมื่อการเชื่อมต่อสิ้นสุด
บันทึกข้อผิดพลาดและข้อความที่ได้รับจากผู้ใช้
package main
import (
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true
},
}
func handleConnections(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Printf("Error upgrading connection: %v", err)
return
}
defer conn.Close()
log.Printf("New client connected: %s", r.RemoteAddr)
for {
_, msg, err := conn.ReadMessage()
if err != nil {
log.Printf("Error reading message from %s: %v", r.RemoteAddr, err)
break
}
log.Printf("Received from %s: %s", r.RemoteAddr, msg)
if err := conn.WriteMessage(websocket.TextMessage, msg); err != nil {
log.Printf("Error writing message to %s: %v", r.RemoteAddr, err)
break
}
}
log.Printf("Client disconnected: %s", r.RemoteAddr)
}
func main() {
http.HandleFunc("/ws", handleConnections)
log.Println("WebSocket server started at :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
2. ใช้ Log Analyzer สำหรับการวิเคราะห์
คุณสามารถใช้เครื่องมือ เช่น ELK Stack (Elasticsearch, Logstash, Kibana) เพื่อรวบรวมและวิเคราะห์ Log :
Elasticsearch : เก็บข้อมูล Log
Logstash : ส่งข้อมูลจาก WebSocket Server ไปยัง Elasticsearch
Kibana : แสดงผล Log แบบกราฟิก
การแก้ปัญหาหลังวิเคราะห์ Log
1. ปัญหา Connection ล้มเหลว
สาเหตุ:
- เซิร์ฟเวอร์เต็ม (Connection Limit)
- Network Latency สูง
แนวทางแก้ไข :
- เพิ่มจำนวน WebSocket Server ใน Cluster
- ปรับเพิ่มค่า ulimit บนเซิร์ฟเวอร์ :
ulimit -n 655352. Latency สูง
สาเหตุ :
- การประมวลผลข้อความใช้เวลานาน
- เซิร์ฟเวอร์ถูกโหลดหนักเกินไป
แนวทางแก้ไข :
- ใช้ Worker Pool เพื่อกระจายการประมวลผล
- ตรวจสอบโค้ดและเพิ่มประสิทธิภาพในส่วนที่ใช้ทรัพยากรหนัก เช่น การเข้าถึงฐานข้อมูล
3. ข้อผิดพลาดในการส่งข้อความ
สาเหตุ :
- การเชื่อมต่อหลุด
- การส่งข้อความไปยัง Client ที่ไม่ตอบสนอง
แนวทางแก้ไข :
- เพิ่ม Timeout ในการส่งข้อความ
conn.SetWriteDeadline(time.Now().Add(10 * time.Second))ใช้ ping/pong เพื่อเช็คการเชื่อมต่อ :
conn.SetPingHandler(func(appData string) error {
log.Println("Ping received")
return conn.WriteControl(websocket.PongMessage, []byte(appData), time.Now().Add(10*time.Second))
})
4. การใช้งานทรัพยากรหนักเกินไป
สาเหตุ :
- จำนวน Connection มากเกินไป
- ไม่มีการกระจายโหลด (Load Balancing)
แนวทางแก้ไข :
- ใช้ Load Balancer เช่น NGINX หรือ Kubernetes
- ตรวจสอบการใช้ Redis Pub/Sub เพื่อลดการประมวลผลซ้ำซ้อน
- การตรวจสอบผลหลังปรับปรุง
หลังจากแก้ไขปัญหา ให้ทำ Stress Testing อีกครั้งและเปรียบเทียบผลลัพธ์ :
- Latency ลดลงหรือไม่?
- จำนวนการเชื่อมต่อสำเร็จเพิ่มขึ้นหรือไม่?
- การใช้งานทรัพยากรลดลงหรือไม่?
สรุปง่ายๆ
- วิเคราะห์ Log เพื่อตรวจสอบปัญหา เช่น Connection ล้มเหลวหรือ Latency สูง
- ใช้เครื่องมือ เช่น ELK Stack หรือ Kibana เพื่อช่วยวิเคราะห์
- ปรับปรุงระบบโดยใช้ Load Balancer, Worker Pool และการตั้งค่า Timeout
กิจกรรมสนุกๆ
ลองใช้ ELK Stack เพื่อวิเคราะห์ Log ของ WebSocket Server และสร้างกราฟแสดง Latency เฉลี่ยในแต่ละช่วงเวลา!