การดู : 271

22/04/2026 07:11น.

Ep.30 Go กับการวิเคราะห์ Log หลัง Stress Testing - ปรับปรุงระบบให้ดียิ่งขึ้น!

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 65535

2. 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 เฉลี่ยในแต่ละช่วงเวลา!