[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-go-websocket-log-analysis-after-stress-testing-ep30-all--*":3,"academy-blog-translations-h91k0ln9qqrq06q":150},{"data":4,"page":137,"perPage":137,"totalItems":137,"totalPages":137},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":145,"keywords":146,"locale":119,"published_at":147,"scheduled_at":13,"school_blog":141,"short_description":148,"status":139,"title":6,"updated":149,"updated_by":13,"slug":142,"views":144},"Ep.30 Go กับการวิเคราะห์ Log หลัง Stress Testing - ปรับปรุงระบบให้ดียิ่งขึ้น!","sclblg987654321","school_blog_translations","\u003Cp class=\"p1\">\u003Cstrong>Go กับการวิเคราะห์ Log หลัง Stress Testing - ปรับปรุงระบบให้ดียิ่งขึ้น!\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p1\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">ใน EP นี้ เราจะมาดูวิธีวิเคราะห์ Log และ ผลลัพธ์จาก Stress Testing เพื่อค้นหาคอขวด (Bottleneck) ของระบบ WebSocket และแนวทางการแก้ปัญหาเพื่อเพิ่มประสิทธิภาพระบบของคุณครับ!\u003C\u002Fp>\u003Cp class=\"p2\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>ทำไมต้องวิเคราะห์ Log หลัง Stress Testing?\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p3\">Log เป็นแหล่งข้อมูลสำคัญที่ช่วยให้เรา :\u003C\u002Fp>\u003Cp class=\"p3\">1.เข้าใจปัญหาที่เกิดขึ้น เช่น การเชื่อมต่อหลุด หรือข้อความที่ส่งไม่สำเร็จ\u003C\u002Fp>\u003Cp class=\"p3\">2.ระบุทรัพยากรที่ใช้งานหนักเกินไป เช่น CPU, RAM หรือเครือข่าย\u003C\u002Fp>\u003Cp class=\"p3\">3.วางแผนปรับปรุงระบบเพื่อรองรับผู้ใช้งานจำนวนมากขึ้น\u003C\u002Fp>\u003Cp class=\"p2\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>ประเภทของ Log ที่ต้องตรวจสอบ\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p3\">1.Connection Log : ตรวจสอบจำนวนการเชื่อมต่อที่สำเร็จและล้มเหลว\u003C\u002Fp>\u003Cp class=\"p3\">2.Latency Log : วิเคราะห์เวลาที่ใช้ในการตอบสนองคำขอ\u003C\u002Fp>\u003Cp class=\"p3\">3.Error Log : ดูข้อผิดพลาด เช่น การตัดการเชื่อมต่อหรือข้อความที่ไม่สามารถส่งได้\u003C\u002Fp>\u003Cp class=\"p3\">4.Resource Log : ตรวจสอบการใช้งานทรัพยากร เช่น CPU, RAM และแบนด์วิดท์\u003C\u002Fp>\u003Cp class=\"p2\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>ตัวอย่างการวิเคราะห์ Log ใน Go\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p3\">1.&nbsp;เพิ่ม Logging ใน WebSocket Server\u003C\u002Fp>\u003Cp class=\"p3\">ในตัวอย่างนี้ :\u003C\u002Fp>\u003Cp class=\"p3\">บันทึก Log เมื่อมีการเชื่อมต่อใหม่และเมื่อการเชื่อมต่อสิ้นสุด\u003C\u002Fp>\u003Cp class=\"p3\">บันทึกข้อผิดพลาดและข้อความที่ได้รับจากผู้ใช้\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext\">package main\n\nimport (\n    \"log\"\n    \"net\u002Fhttp\"\n\n    \"github.com\u002Fgorilla\u002Fwebsocket\"\n)\n\nvar upgrader = websocket.Upgrader{\n    CheckOrigin: func(r *http.Request) bool {\n        return true\n    },\n}\n\nfunc handleConnections(w http.ResponseWriter, r *http.Request) {\n    conn, err := upgrader.Upgrade(w, r, nil)\n    if err != nil {\n        log.Printf(\"Error upgrading connection: %v\", err)\n        return\n    }\n    defer conn.Close()\n\n    log.Printf(\"New client connected: %s\", r.RemoteAddr)\n\n    for {\n        _, msg, err := conn.ReadMessage()\n        if err != nil {\n            log.Printf(\"Error reading message from %s: %v\", r.RemoteAddr, err)\n            break\n        }\n        log.Printf(\"Received from %s: %s\", r.RemoteAddr, msg)\n\n        if err := conn.WriteMessage(websocket.TextMessage, msg); err != nil {\n            log.Printf(\"Error writing message to %s: %v\", r.RemoteAddr, err)\n            break\n        }\n    }\n\n    log.Printf(\"Client disconnected: %s\", r.RemoteAddr)\n}\n\nfunc main() {\n    http.HandleFunc(\"\u002Fws\", handleConnections)\n    log.Println(\"WebSocket server started at :8080\")\n    log.Fatal(http.ListenAndServe(\":8080\", nil))\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">2. ใช้ Log Analyzer สำหรับการวิเคราะห์\u003C\u002Fp>\u003Cp class=\"p3\">คุณสามารถใช้เครื่องมือ เช่น ELK Stack (Elasticsearch, Logstash, Kibana) เพื่อรวบรวมและวิเคราะห์ Log :\u003C\u002Fp>\u003Cp class=\"p3\">Elasticsearch : เก็บข้อมูล Log\u003C\u002Fp>\u003Cp class=\"p3\">Logstash : ส่งข้อมูลจาก WebSocket Server ไปยัง Elasticsearch\u003C\u002Fp>\u003Cp class=\"p3\">Kibana : แสดงผล Log แบบกราฟิก\u003C\u002Fp>\u003Cp class=\"p2\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>การแก้ปัญหาหลังวิเคราะห์ Log\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p3\">1. ปัญหา Connection ล้มเหลว\u003C\u002Fp>\u003Cp class=\"p3\">สาเหตุ:\u003C\u002Fp>\u003Cul class=\"ul1\">\u003Cli class=\"li3\">เซิร์ฟเวอร์เต็ม (Connection Limit)\u003C\u002Fli>\u003Cli class=\"li3\">Network Latency สูง\u003C\u002Fli>\u003C\u002Ful>\u003Cp class=\"p3\">แนวทางแก้ไข :\u003C\u002Fp>\u003Cul class=\"ul1\">\u003Cli class=\"li3\">เพิ่มจำนวน WebSocket Server ใน Cluster\u003C\u002Fli>\u003Cli class=\"li3\">ปรับเพิ่มค่า ulimit บนเซิร์ฟเวอร์ :\u003C\u002Fli>\u003C\u002Ful>\u003Cpre>\u003Ccode class=\"language-plaintext\">ulimit -n 65535\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp class=\"p3\">2. Latency สูง\u003C\u002Fp>\u003Cp class=\"p3\">สาเหตุ :\u003C\u002Fp>\u003Cul class=\"ul1\">\u003Cli class=\"li3\">การประมวลผลข้อความใช้เวลานาน\u003C\u002Fli>\u003Cli class=\"li3\">เซิร์ฟเวอร์ถูกโหลดหนักเกินไป\u003C\u002Fli>\u003C\u002Ful>\u003Cp class=\"p3\">แนวทางแก้ไข :\u003C\u002Fp>\u003Cul class=\"ul1\">\u003Cli class=\"li3\">ใช้ Worker Pool เพื่อกระจายการประมวลผล\u003C\u002Fli>\u003Cli class=\"li3\">ตรวจสอบโค้ดและเพิ่มประสิทธิภาพในส่วนที่ใช้ทรัพยากรหนัก เช่น การเข้าถึงฐานข้อมูล\u003C\u002Fli>\u003C\u002Ful>\u003Cp class=\"p2\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">3. ข้อผิดพลาดในการส่งข้อความ\u003C\u002Fp>\u003Cp class=\"p3\">สาเหตุ :\u003C\u002Fp>\u003Cul class=\"ul1\">\u003Cli class=\"li3\">การเชื่อมต่อหลุด\u003C\u002Fli>\u003Cli class=\"li3\">การส่งข้อความไปยัง Client ที่ไม่ตอบสนอง\u003C\u002Fli>\u003C\u002Ful>\u003Cp class=\"p3\">แนวทางแก้ไข :\u003C\u002Fp>\u003Cul class=\"ul1\">\u003Cli class=\"li3\">เพิ่ม Timeout ในการส่งข้อความ\u003C\u002Fli>\u003C\u002Ful>\u003Cpre>\u003Ccode class=\"language-plaintext\">conn.SetWriteDeadline(time.Now().Add(10 * time.Second))\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp class=\"p3\">ใช้ ping\u002Fpong เพื่อเช็คการเชื่อมต่อ :\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext\">conn.SetPingHandler(func(appData string) error {\n    log.Println(\"Ping received\")\n    return conn.WriteControl(websocket.PongMessage, []byte(appData), time.Now().Add(10*time.Second))\n})\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp class=\"p2\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">4. การใช้งานทรัพยากรหนักเกินไป\u003C\u002Fp>\u003Cp class=\"p3\">สาเหตุ :\u003C\u002Fp>\u003Cul class=\"ul1\">\u003Cli class=\"li3\">จำนวน Connection มากเกินไป\u003C\u002Fli>\u003Cli class=\"li3\">ไม่มีการกระจายโหลด (Load Balancing)\u003C\u002Fli>\u003C\u002Ful>\u003Cp class=\"p3\">แนวทางแก้ไข :\u003C\u002Fp>\u003Cul class=\"ul1\">\u003Cli class=\"li3\">ใช้ Load Balancer เช่น NGINX หรือ Kubernetes\u003C\u002Fli>\u003Cli class=\"li3\">ตรวจสอบการใช้ Redis Pub\u002FSub เพื่อลดการประมวลผลซ้ำซ้อน\u003C\u002Fli>\u003Cli class=\"li3\">การตรวจสอบผลหลังปรับปรุง\u003C\u002Fli>\u003C\u002Ful>\u003Cp class=\"p3\">หลังจากแก้ไขปัญหา ให้ทำ Stress Testing อีกครั้งและเปรียบเทียบผลลัพธ์ :\u003C\u002Fp>\u003Cul class=\"ul1\">\u003Cli class=\"li3\">Latency ลดลงหรือไม่?\u003C\u002Fli>\u003Cli class=\"li3\">จำนวนการเชื่อมต่อสำเร็จเพิ่มขึ้นหรือไม่?\u003C\u002Fli>\u003Cli class=\"li3\">การใช้งานทรัพยากรลดลงหรือไม่?\u003C\u002Fli>\u003C\u002Ful>\u003Cp class=\"p2\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>สรุปง่ายๆ\u003C\u002Fstrong>\u003C\u002Fp>\u003Cul class=\"ul2\">\u003Cli class=\"li3\">วิเคราะห์ Log เพื่อตรวจสอบปัญหา เช่น Connection ล้มเหลวหรือ Latency สูง\u003C\u002Fli>\u003Cli class=\"li3\">ใช้เครื่องมือ เช่น ELK Stack หรือ Kibana เพื่อช่วยวิเคราะห์\u003C\u002Fli>\u003Cli class=\"li3\">ปรับปรุงระบบโดยใช้ Load Balancer, Worker Pool และการตั้งค่า Timeout\u003C\u002Fli>\u003C\u002Ful>\u003Cp class=\"p2\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>กิจกรรมสนุกๆ\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p4\">ลองใช้\u003Cspan class=\"s3\"> ELK Stack \u003C\u002Fspan>เพื่อวิเคราะห์\u003Cspan class=\"s3\"> Log \u003C\u002Fspan>ของ\u003Cspan class=\"s3\"> WebSocket Server \u003C\u002Fspan>และสร้างกราฟแสดง\u003Cspan class=\"s3\"> Latency \u003C\u002Fspan>เฉลี่ยในแต่ละช่วงเวลา\u003Cspan class=\"s3\">!\u003C\u002Fspan>\u003C\u002Fp>","29_11zon_95p8jmr362.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fvkdp58hcg7k4qbx\u002F29_11zon_95p8jmr362.webp","2026-03-04 08:51:43.572Z","",{"keywords":15,"locale":113,"school_blog":123},[16,23,28,33,38,43,48,53,58,63,68,73,78,83,88,93,98,103,108],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":22,"updated_by":13},"sclkey987654321","school_keywords","2026-03-04 08:51:41.825Z","diyc6ekhc8jbb4k","วิเคราะห์ Log","2026-04-10 16:14:38.891Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-04 08:34:00.521Z","44l3qn47xjhwgf8","Stress Testing","2026-04-10 16:08:05.159Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":32,"updated_by":13},"2026-03-04 08:34:04.241Z","x1xo601mpmb6rla","คอขวด","2026-04-10 16:08:06.459Z",{"collectionId":17,"collectionName":18,"created":34,"created_by":13,"id":35,"name":36,"updated":37,"updated_by":13},"2026-03-04 08:34:00.920Z","ecac9y661or1xka","WebSocket","2026-04-10 16:08:05.227Z",{"collectionId":17,"collectionName":18,"created":39,"created_by":13,"id":40,"name":41,"updated":42,"updated_by":13},"2026-03-04 08:34:03.569Z","wjlmz4fxu92ctl7","ปรับปรุงประสิทธิภาพ","2026-04-10 16:08:06.185Z",{"collectionId":17,"collectionName":18,"created":44,"created_by":13,"id":45,"name":46,"updated":47,"updated_by":13},"2026-03-04 08:51:42.285Z","6tb1l3s4tk9fqzj","การวิเคราะห์ข้อมูล","2026-04-10 16:14:39.042Z",{"collectionId":17,"collectionName":18,"created":49,"created_by":13,"id":50,"name":51,"updated":52,"updated_by":13},"2026-03-04 08:20:11.547Z","ey3puyme01a9bsw","Go","2026-04-10 16:07:25.893Z",{"collectionId":17,"collectionName":18,"created":54,"created_by":13,"id":55,"name":56,"updated":57,"updated_by":13},"2026-03-04 08:20:14.253Z","ah6lvy4x8qe08l5","Golang","2026-04-10 16:07:26.172Z",{"collectionId":17,"collectionName":18,"created":59,"created_by":13,"id":60,"name":61,"updated":62,"updated_by":13},"2026-03-04 08:33:59.518Z","7pqn3y8ffwzzde5","ภาษา Go","2026-04-10 16:08:04.777Z",{"collectionId":17,"collectionName":18,"created":64,"created_by":13,"id":65,"name":66,"updated":67,"updated_by":13},"2026-03-04 08:34:09.187Z","3zp82zk9hqz13ko","การเขียนโปรแกรม Go","2026-04-10 16:08:08.225Z",{"collectionId":17,"collectionName":18,"created":69,"created_by":13,"id":70,"name":71,"updated":72,"updated_by":13},"2026-03-04 08:32:29.161Z","uewvwdt9cf41o8n","การเขียนโปรแกรมสำหรับมือใหม่","2026-04-10 16:07:54.935Z",{"collectionId":17,"collectionName":18,"created":74,"created_by":13,"id":75,"name":76,"updated":77,"updated_by":13},"2026-03-04 08:32:27.645Z","vfe4f15x4b3afpm","การศึกษาการเขียนโปรแกรม","2026-04-10 16:07:54.538Z",{"collectionId":17,"collectionName":18,"created":79,"created_by":13,"id":80,"name":81,"updated":82,"updated_by":13},"2026-03-04 08:31:30.863Z","oyltq82epf0vqka","การเขียนโปรแกรม","2026-04-10 16:07:41.883Z",{"collectionId":17,"collectionName":18,"created":84,"created_by":13,"id":85,"name":86,"updated":87,"updated_by":13},"2026-03-04 08:32:27.254Z","xl8ixz1jmfnab5f","ฝึกเขียนโปรแกรม","2026-04-10 16:07:54.377Z",{"collectionId":17,"collectionName":18,"created":89,"created_by":13,"id":90,"name":91,"updated":92,"updated_by":13},"2026-03-04 08:31:53.015Z","801w5t09mfaa9hl","ภาษาโปรแกรม","2026-04-10 16:07:46.625Z",{"collectionId":17,"collectionName":18,"created":94,"created_by":13,"id":95,"name":96,"updated":97,"updated_by":13},"2026-03-04 08:20:37.794Z","x2c5z8w1cr41ij3","ภาษาโปรแกรมมิ่ง","2026-04-10 16:07:27.917Z",{"collectionId":17,"collectionName":18,"created":99,"created_by":13,"id":100,"name":101,"updated":102,"updated_by":13},"2026-03-04 08:32:24.473Z","xquecx7u5svb567","โปรแกรม","2026-04-10 16:07:53.714Z",{"collectionId":17,"collectionName":18,"created":104,"created_by":13,"id":105,"name":106,"updated":107,"updated_by":13},"2026-03-04 08:26:56.612Z","yf74wkqyamfc5qx","โปรแกรมเมอร์","2026-04-10 16:07:36.426Z",{"collectionId":17,"collectionName":18,"created":109,"created_by":13,"id":110,"name":111,"updated":112,"updated_by":13},"2026-03-04 08:26:59.195Z","gab60xd583s3qaw","Superdev School","2026-04-10 16:07:37.087Z",{"code":114,"collectionId":115,"collectionName":116,"created":117,"flag":118,"id":119,"is_default":120,"label":121,"updated":122},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":124,"collectionId":125,"collectionName":126,"created":13,"expand":127,"id":141,"slug":142,"updated":143,"views":144},"wqxt7ag2gn7xcmk","pbc_2105096300","school_blogs",{"category":128},{"blogIds":129,"collectionId":130,"collectionName":131,"created":132,"created_by":13,"id":124,"image":133,"image_alt":13,"image_path":134,"label":135,"name":136,"priority":137,"publish_at":138,"scheduled_at":13,"status":139,"updated":140,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:33:53.210Z","59ty92ns80w_15oc1implw.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fwqxt7ag2gn7xcmk\u002F59ty92ns80w_15oc1implw.png",{"en":136,"th":136},"Golang The Series",1,"2026-03-16 04:39:38.440Z","published","2026-04-25 02:32:15.470Z","h91k0ln9qqrq06q","go-websocket-log-analysis-after-stress-testing-ep30","2026-05-06 22:26:05.097Z",271,"vkdp58hcg7k4qbx",[20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110],"2025-01-27 04:43:11.256Z","เรียนรู้วิธีวิเคราะห์ Log และผลลัพธ์จาก Stress Testing เพื่อค้นหาคอขวดในระบบ WebSocket และแนวทางการแก้ปัญหาเพื่อเพิ่มประสิทธิภาพระบบของคุณ","2026-04-22 07:11:49.057Z",{"th":142,"en":142}]