FiveM MariaDB wait_timeout คืออะไร? วิธีแก้ Idle Connections ค้างและลดปัญหา Connection สะสม
FiveM MariaDB wait_timeout คือค่าที่กำหนดว่า MariaDB จะรอ Connection แบบ Non-interactive ที่ไม่มี Activity ได้นานกี่วินาทีก่อนปิด Connection นั้นโดยอัตโนมัติ โดย MariaDB ระบุว่า wait_timeout และ interactive_timeout ใช้ปิด Connections หลังไม่มี Activity ตามช่วงเวลาที่กำหนด.
สำหรับ FiveM Server ที่ใช้ oxmysql เรื่องนี้เกี่ยวข้องกับปัญหาอย่าง:
Threads_connected สูง
Idle Connections จำนวนมาก
Too many connections
Database Connections สะสม
Connection ถูก MariaDB ปิดหลัง Idle นาน
Resource เจอ Connection Error หลังเปิดทิ้งไว้นาน
แต่ต้องเข้าใจว่า การลด wait_timeout ไม่ใช่วิธีแก้ Too many connections ทุกกรณี เพราะถ้า Connections กำลังติด Slow Query, Transaction, Lock หรือ Resource ยิง Query จำนวนมาก ปัญหาต้องแก้ที่ Query/Architecture ก่อน ไม่ใช่ลด Timeout อย่างเดียว.
① wait_timeout คืออะไร
แนวคิดง่ายๆ:
Application เชื่อม MariaDB
↓
ไม่มี Query หรือ Activity
↓
Idle
↓
รอนานถึง wait_timeout
↓
MariaDB ปิด Connection
MariaDB ระบุว่า wait_timeout เป็นหนึ่งในค่าที่ใช้ปิด Connection หลังไม่มี Activity ตามเวลาที่กำหนด.
ดังนั้นมันเป็น:
Idle Connection Timeout
ไม่ใช่:
Query Execution Timeout
สองเรื่องนี้ต้องแยกกัน
② wait_timeout ไม่ใช่ Slow Query Timeout
สมมติ Query:
SELECT *
FROM `characters`;
ใช้เวลา:
5 วินาที
ไม่ได้หมายความว่า wait_timeout = 3 จะหยุด Query หลัง 3 วินาที
wait_timeout เกี่ยวกับ Connection ที่ ไม่มี Activity
ส่วน MariaDB มีระบบ Query/Transaction/Lock Timeouts อื่นแยกต่างหาก.
จำ:
wait_timeout
= Idle Connection
Slow Query
= SQL Execution Performance
③ interactive_timeout คืออะไร
MariaDB มีอีกค่าคือ:
interactive_timeout
ซึ่งเอกสารระบุว่าเป็นเวลาที่ Server รอ Interactive Connection ที่ไม่มี Activity ก่อนปิด และเป็นคนละ Variable กับ wait_timeout.
โดย Interactive Connection หมายถึง Connection ที่ Client เปิดด้วยลักษณะ Interactive ตาม Client API
ส่วน Application Connections ทั่วไปมักเกี่ยวข้องกับ:
wait_timeout
มากกว่า
④ wait_timeout กับ interactive_timeout ต่างกันอย่างไร
จำแบบง่าย:
wait_timeout
→ Non-interactive connections
interactive_timeout
→ Interactive connections
MariaDB ระบุ interactive_timeout ว่ามี Scope ทั้ง Global และ Session และเป็น Dynamic Variable.
ดังนั้นอย่าเปลี่ยน interactive_timeout เพียงเพราะ FiveM มี Connection เยอะ โดยยังไม่ได้ตรวจว่า Connections ที่มีปัญหาเป็นประเภทใด
⑤ ค่า Timeout ปัจจุบันดูอย่างไร
ใช้:
SHOW GLOBAL VARIABLES
LIKE 'wait_timeout';
และ:
SHOW GLOBAL VARIABLES
LIKE 'interactive_timeout';
หรือ:
SELECT
@@GLOBAL.wait_timeout,
@@GLOBAL.interactive_timeout;
MariaDB System Variables สามารถตรวจและปรับได้ตาม Scope และคุณสมบัติของ Variable แต่ละตัว.
⑥ ดู Session wait_timeout ได้ไหม
ได้
ใช้:
SELECT @@SESSION.wait_timeout;
กับ:
SELECT @@GLOBAL.wait_timeout;
ต้องแยก:
GLOBAL
และ:
SESSION
เพราะ Connection ที่สร้างขึ้นแล้วสามารถมี Session Value ของตัวเองได้ตามระบบ Variables ของ MariaDB.
⑦ ทำไมเปลี่ยน GLOBAL แล้ว Connection เดิมอาจไม่เหมือนกัน
MariaDB System Variables มีทั้ง Global และ Session Scope
ดังนั้นเมื่อปรับ:
SET GLOBAL wait_timeout = ...;
ต้องเข้าใจว่าการตั้ง Global Value มีผลกับ Configuration ระดับ Server สำหรับ Sessions ตาม Behavior ของ Variable ไม่ได้หมายความว่า Session ที่มีอยู่ทุก Connection จะเปลี่ยนทันทีแบบเดียวกันเสมอ.
นี่เป็นเหตุผลที่ควรทดสอบด้วย Connection ใหม่หลังปรับค่า
⑧ ค่า default ต้องเปลี่ยนไหม
อย่าเปลี่ยนเพียงเพราะเห็น Tutorial บอกว่า:
28800 สูงเกินไป
หรือ:
ต้องลดเหลือ 60
โดยไม่วัด Server จริง
ค่าที่เหมาะขึ้นกับ:
Connection Pool
Resource Behavior
Database Load
Application Count
Idle Connection Count
Reconnect Behavior
Network
ดังนั้นควรเก็บ Metrics ก่อน
⑨ Threads_connected คืออะไร
MariaDB ระบุว่าเมื่อวิเคราะห์จำนวน Connections ควรดู:
Threads_connected
ซึ่งบอกจำนวน Connections ปัจจุบัน.
ตรวจด้วย:
SHOW GLOBAL STATUS
LIKE 'Threads_connected';
ตัวอย่าง:
Threads_connected = 80
แปลว่าขณะนั้น MariaDB มี Connections เปิดอยู่ 80 Connections
⑩ wait_timeout เกี่ยวกับ Threads_connected อย่างไร
ถ้ามี Connections จำนวนมากที่:
เปิดอยู่
+
ไม่มี Activity
MariaDB จะยังนับ Connections เหล่านั้นใน Connections ปัจจุบันจนกว่าจะ:
Client ปิด
หรือ:
Server ปิดตาม Timeout
ดังนั้น Idle Timeout มีความสัมพันธ์กับ Connections ที่ถูกปล่อยทิ้งไว้นาน
แต่ถ้า Connections 80 ตัวกำลัง Query ทั้งหมด การลด wait_timeout ไม่ได้ทำให้ Query เหล่านั้นหาย
⑪ Threads_running ต้องดูด้วย
อย่าดูเพียง:
Threads_connected
ควรดู:
SHOW GLOBAL STATUS
LIKE 'Threads_running';
เพื่อแยกว่า Connections จำนวนมากนั้นกำลัง Execute งานจริงหรือเพียงเปิดอยู่
แนวคิด:
Threads_connected = 100
Threads_running = 5
กับ:
Threads_connected = 100
Threads_running = 90
เป็นสถานการณ์คนละแบบ
⑫ Connection Idle คืออะไร
ใน:
SHOW FULL PROCESSLIST;
Connection ที่ไม่ได้กำลัง Execute Query อาจปรากฏในสถานะอย่าง:
Sleep
เป็นช่วงเวลาหนึ่ง
SHOW PROCESSLIST ใช้ดู Threads ที่กำลังอยู่บน MariaDB Server และ FULL จะแสดง Statement Information ได้มากกว่ารูปแบบปกติ.
⑬ วิธีหา Idle Connections
ใช้:
SHOW FULL PROCESSLIST;
แล้วดู:
Command
Time
User
Host
DB
State
หากพบ Connections:
Command = Sleep
Time = สูงมาก
ควรวิเคราะห์ว่า Application ใดเป็นเจ้าของ Connection เหล่านั้น
อย่ารีบ Kill ทุก Connection โดยไม่รู้ต้นเหตุ
⑭ Processlist ช่วยอะไร
MariaDB ระบุว่า SHOW PROCESSLIST แสดง Threads ที่กำลังทำงาน และสามารถดูข้อมูลเดียวกันจาก:
information_schema.PROCESSLIST
ได้เช่นกัน.
นี่ช่วยแยกได้ว่า Connections มาจาก:
fivem_app
website_app
admin tool
backup tool
หรือ Application อื่น
⑮ Dedicated Database User ช่วย Debug มาก
หาก FiveM ใช้:
fivem_app
และ Website ใช้:
web_app
Processlist จะบอกได้ง่ายว่า:
Connections ไหน
เป็นของ FiveM
ต่างจากทุก Application ใช้:
root
เหมือนกันหมด
⑯ wait_timeout ช่วย Too many connections ได้ไหม
ช่วยได้เฉพาะบางกรณี
เช่น:
Application เปิด Connection
↓
Connection Idle นาน
↓
ไม่ปิด
↓
Connections สะสม
การมี Idle Timeout ที่เหมาะสมสามารถช่วยให้ Server ปิด Connections ที่ไม่มี Activity นานเกินไปได้.
แต่ถ้าต้นเหตุคือ:
Slow Queries
Query Burst
N+1 Query
Long Transaction
ต้องแก้สาเหตุนั้น
⑰ อย่าลด wait_timeout เหลือ 5 วินาทีแบบสุ่ม
สมมติ Connection Pool มี Connection ที่ไม่มี Query:
10 วินาที
แล้ว MariaDB ตั้ง:
wait_timeout = 5
Server สามารถปิด Connection นั้นก่อน Application จะนำกลับมาใช้
จากนั้น Client/Pool ต้องจัดการ Connection ที่ถูก Server ปิด
ดังนั้น Timeout ที่ต่ำเกินไปสามารถสร้าง:
Reconnect Churn
Connection Errors
Extra Handshakes
Unexpected Disconnects
ได้
⑱ Connection Pool กับ wait_timeout สำคัญมาก
oxmysql เป็น Database Layer สำหรับ FXServer และใช้ node-mysql2 เป็น Driver.
Connection Pool มีเป้าหมายเพื่อนำ Connections กลับมาใช้ซ้ำ
ดังนั้นต้องให้:
Pool Lifetime
กับ:
Server Idle Timeout
ทำงานสัมพันธ์กัน
ไม่ใช่ให้ MariaDB ปิด Connection เร็วจน Pool ต้องสร้างใหม่ตลอด
⑲ Connection Pool ไม่ได้หมายความว่า Connection อยู่ตลอดไป
Pool มีหน้าที่จัดการ Connection Lifecycle
Connections อาจ:
ถูกสร้าง
ถูกใช้
Idle
ถูกนำกลับมาใช้
ถูกปิด
ถูกสร้างใหม่
ตาม Driver/Pool Configuration
ดังนั้น Threads_connected ไม่จำเป็นต้องเป็นค่าคงที่ตลอดเวลา
⑳ oxmysql ต้องตั้ง wait_timeout ใน server.cfg ไหม
wait_timeout เป็น MariaDB Server Variable
ไม่ใช่ ConVar FiveM ทั่วไปแบบ:
mysql_debug
หรือ:
mysql_slow_query_warning
oxmysql Documentation ระบุ ConVars สำหรับ Connection String, Slow Query Warning และ Debug แยกต่างหาก.
ดังนั้นอย่าใส่:
set wait_timeout ...
ใน server.cfg
แล้วคาดว่า MariaDB จะเปลี่ยน
㉑ wait_timeout ควรตั้งที่ MariaDB
Runtime Configuration สามารถจัดการผ่าน MariaDB Variables ตามสิทธิ์ที่เหมาะสม
แนวคิด:
SET GLOBAL wait_timeout = 600;
เป็นเพียงตัวอย่าง Syntax ไม่ใช่ค่าที่แนะนำสำหรับทุก Server
ก่อนเปลี่ยนต้องตรวจ:
ค่าปัจจุบัน
จำนวน Idle Connections
Pool Behavior
Reconnect Errors
ก่อนเสมอ
㉒ Persistent Configuration ต่างจาก SET GLOBAL
การใช้:
SET GLOBAL ...
เป็นการปรับ Runtime Global Variable ตามความสามารถของ Variable
ส่วนค่าที่ต้องการให้คงหลัง MariaDB Restart ต้องจัดการผ่าน Persistent Server Configuration ที่ Environment รองรับ
อย่าปรับ Runtime แล้วคิดว่าค่าจะอยู่ถาวรโดยไม่ตรวจหลัง Restart.
㉓ วิธีเช็กหลัง Restart
หลัง MariaDB Restart ใช้:
SHOW GLOBAL VARIABLES
LIKE 'wait_timeout';
อีกครั้ง
อย่าอาศัยว่าค่า Config ที่เขียนไว้ถูก Load สำเร็จโดยไม่ Verify
㉔ wait_timeout ต่ำช่วย Memory ไหม
Idle Connections ยังใช้ Server Resources บางส่วน
การปิด Connections ที่ไม่จำเป็นสามารถช่วยลดจำนวน Connections เปิดค้าง
แต่ถ้าตั้งต่ำเกินไปแล้ว Application Reconnect ตลอด อาจแลก Resource แบบหนึ่งกับอีกแบบหนึ่ง
จึงต้อง Benchmark และ Monitor
㉕ Connection เปิดเยอะแต่ไม่ถึง max_connections ต้องแก้ไหม
ไม่จำเป็นเสมอไป
สมมติ:
max_connections = 300
Threads_connected = 50
และ:
Database CPU ต่ำ
ไม่มี Error
Query เร็ว
Connections Stable
อาจไม่มีปัญหาที่ต้องแก้
อย่า Optimize เพียงเพราะตัวเลข Connections ดูเยอะ
㉖ ดู Max_used_connections ด้วย
MariaDB แนะนำว่าการดู:
Max_used_connections
มีประโยชน์กว่าดูเพียง Connections ปัจจุบัน เพราะมันแสดง Peak Usage ที่เคยเกิดขึ้น.
ใช้:
SHOW GLOBAL STATUS
LIKE 'Max_used_connections';
แล้วเปรียบเทียบกับ:
max_connections
㉗ ตัวอย่างวิเคราะห์ Peak
สมมติ:
max_connections = 200
Max_used_connections = 195
แต่ตอนนี้:
Threads_connected = 20
แปลว่ามีช่วงหนึ่ง Server เกือบชน Limit
ต่อไปต้องหา:
เวลาไหน
กิจกรรมอะไร
Resource ไหน
ไม่ใช่ลด wait_timeout ทันที
㉘ Login Burst อาจทำ Connection พุ่ง
หลัง Server Restart:
ผู้เล่น 100 คนเข้าใกล้กัน
Resource อาจทำ:
Character Query
Settings Query
Vehicle Query
Profile Query
จำนวนมากในช่วงสั้นๆ
นี่เป็น:
Active Query Burst
ไม่ใช่ Idle Connection Problem
ดังนั้น wait_timeout ไม่ใช่คำตอบหลัก
㉙ Autosave Burst ก็เช่นกัน
ทุก 5 นาที:
200 Players
↓
Save พร้อมกัน
สามารถทำให้ Database Load พุ่ง
ให้แก้ด้วย:
Dirty Flag
Staggered Save
ลด Query
Upsert
Batch ตามความเหมาะสม
ก่อนพยายามใช้ Timeout แก้
㉚ Slow Query ทำให้ Connections ดูเหมือนค้าง
หาก Query ใช้เวลานาน:
Connection
↓
กำลัง Execute
↓
ยังไม่คืน Pool
Connections ใหม่ยังเข้ามาเรื่อยๆ
จึงอาจเกิด Connection Pressure
oxmysql มี Slow Query Warnings และ Debug Mode สำหรับวิเคราะห์ Queries ที่ช้าหรือถูกเรียกบ่อย.
㉛ mysql_slow_query_warning ใช้ร่วมกัน
ตัวอย่าง:
set mysql_slow_query_warning 150
oxmysql ระบุว่าค่านี้ใช้แจ้ง Queries ที่ใช้เวลานานกว่าค่าที่กำหนด แต่ Query Timing อาจได้รับผลจาก Server Hitch และ Startup Conditions ด้วย.
ใช้เพื่อตรวจ:
Connection เยอะ
เพราะ Query ช้าหรือไม่
㉜ mysql_debug ช่วยดู Query Frequency
เปิด:
set mysql_debug true
oxmysql จะ Print Queries ใน Server Console และสามารถจำกัด Resource ที่ต้อง Debug ได้.
ถ้า Threads_connected พุ่ง ให้ดูว่า Resource ใดกำลัง Query มากผิดปกติ
㉝ อย่าเปิด Debug หนักตลอด Production
Debug Tools มีไว้เพื่อหา Root Cause
เมื่อได้ข้อมูลแล้วควรปิดหรือจำกัด Scope ตามความเหมาะสม
โดยเฉพาะ Server ที่ Query ปริมาณมาก เพราะ Log เองก็สร้าง Workload ได้
㉞ Idle Connection กับ Idle Transaction ต่างกัน
Connection Idle:
ไม่มี Command ทำงาน
แต่ Transaction ที่เปิดค้างเป็นอีกเรื่องหนึ่ง
MariaDB มี Transaction Timeout และ Lock Wait Controls แยกจาก wait_timeout.
อย่าใช้ wait_timeout แทน Transaction Management
㉟ Long Transaction อันตรายอย่างไร
Transaction ที่เปิดนานสามารถเกี่ยวข้องกับ:
Locks
Undo Data
Concurrent Transactions
Connection Usage
ดังนั้นหาก Processlist แสดง Query/Transaction ทำงานนาน ต้องตรวจ Transaction Logic ไม่ใช่ลด Idle Timeout
㊱ Lock Wait กับ wait_timeout คนละเรื่อง
MariaDB มี:
innodb_lock_wait_timeout
และ WAIT / NOWAIT Controls สำหรับ Lock Wait Behavior แยกต่างหาก.
จำ:
wait_timeout
= Connection Idle
innodb_lock_wait_timeout
= รอ InnoDB Lock
อย่าสับสน
㊲ Query Timeout ก็คนละเรื่อง
MariaDB มี Query Limits และ Timeout Mechanisms แยกสำหรับควบคุม Query Execution.
ดังนั้นเมื่อ Server ขึ้น:
Query execution was interrupted
อย่าคิดทันทีว่า wait_timeout เป็นสาเหตุ
㊳ MySQL server has gone away เกี่ยวกับ wait_timeout ได้ไหม
ในเชิงระบบ หาก Server ปิด Connection หลัง Idle นาน แล้ว Application พยายามใช้ Connection เดิมอีกครั้ง อาจเกิด Connection-level Error ได้
MariaDB Connector Documentation เองกล่าวถึงกรณี Server ปิด Connection เมื่อถึง wait_timeout และ Pool ต้องจัดการ Connections ที่ไม่มี Activity.
ดังนั้นถ้า Error เกิดหลัง Server Idle นาน ควรตรวจ Timeout/Pool Interaction
㊴ Server เปิดใหม่แล้วใช้งานได้ แต่เช้าต่อมา Error
Pattern นี้น่าสนใจ:
Restart
↓
Connection ใหม่
↓
ทำงานปกติ
↓
Idle หลายชั่วโมง
↓
MariaDB ปิด Connection
↓
Resource ใช้ Connection เดิม
↓
Error
ไม่ได้แปลว่าเป็น wait_timeout แน่นอน แต่เป็นหนึ่งในจุดที่ควรตรวจ
โดยเฉพาะถ้าปัญหาเกิดหลังช่วงไม่มีผู้เล่นหรือไม่มี Query นาน
㊵ ลด wait_timeout แล้ว Error มากขึ้น
นี่เป็นสัญญาณว่า Timeout อาจต่ำเกิน Interaction ที่ Pool/Driver คาด
หากเดิม:
wait_timeout = สูง
ทำงานดี
แล้วลดมาก:
wait_timeout = ต่ำมาก
จากนั้นเกิด Connection Errors หลัง Idle สั้นๆ
ควรย้อนตรวจ Configuration และ Driver Behavior แทนลดต่อ
㊶ เพิ่ม wait_timeout สูงมากช่วยไหม
ไม่ควรเพิ่มแบบไม่จำกัดเช่นกัน
ถ้า Application เปิด Connections แล้วทิ้งโดยไม่จัดการ การให้ Connections อยู่ Idle นานมากอาจทำให้ Connections สะสมโดยไม่จำเป็น
เป้าหมายคือ:
Timeout ที่สัมพันธ์กับ Pool/Application
ไม่ใช่:
ยิ่งสูงยิ่งดี
㊷ wait_timeout 60 วินาทีดีไหม
ไม่มีคำตอบเดียว
บาง Application อาจรับได้
บาง Connection Pool อาจมี Connections Idle เกิน 60 วินาทีตามปกติ
ดังนั้นต้องทดสอบ:
Reconnect Rate
Error Rate
Threads_connected
Database CPU
Connection Creation
FiveM Gameplay
ก่อนใช้ Production
㊸ wait_timeout 8 ชั่วโมงดีไหม
เช่นเดียวกัน ไม่มีค่าที่ดีที่สุดสำหรับทุกระบบ
MariaDB Variables มีค่า Default ตาม Version/Environment แต่ Production Tuning ควรเกิดจาก Requirement และ Metrics ไม่ใช่เพราะ Default ต้องถูกเปลี่ยนเสมอ.
㊹ วิธีหาค่าที่เหมาะกว่าเดาสุ่ม
เก็บ Metrics:
Threads_connected
Max_used_connections
Threads_running
Idle/Sleep Time
Reconnect Errors
Query Count
Database CPU
จากนั้นดูว่า:
Connections Idle นานจริงไหม
ถ้าไม่ใช่ อย่าใช้ wait_timeout เป็นตัวแก้หลัก
㊺ Query ดู Sleep Connections
สามารถใช้ข้อมูลจาก:
information_schema.PROCESSLIST
MariaDB ระบุว่า Process List Information มีอยู่ใน Table นี้เช่นเดียวกับ SHOW PROCESSLIST.
ตัวอย่างเชิงวิเคราะห์:
SELECT
ID,
USER,
HOST,
DB,
COMMAND,
TIME,
STATE
FROM information_schema.PROCESSLIST
ORDER BY TIME DESC;
ใช้ดู Connection ที่อยู่มานาน
㊻ อย่า Kill Sleep Connections แบบ Cron ก่อนรู้สาเหตุ
บาง Admin ใช้วิธี:
ทุก 1 นาที
→ Kill Sleep Connections
นี่อาจซ่อนปัญหาแทนแก้
Connection Pool อาจตั้งใจเก็บ Idle Connection สำหรับ Reuse
การ Kill จากภายนอกตลอดสามารถสร้าง Reconnect Churn
ให้ปรับ Lifecycle ที่ Application/Database Layer อย่างเข้าใจก่อน
㊼ Too many connections + Sleep เต็ม Processlist
นี่เป็นกรณีที่ wait_timeout ควรถูกนำมาพิจารณามากขึ้น
แต่ยังต้องตอบว่า:
ทำไม Connections เหล่านั้นถูกเปิด?
Pool ควรเก็บจำนวนเท่าไร?
มี Applications กี่ตัว?
Timeout เท่าไร?
ก่อนปรับ
㊽ Too many connections + Query เต็ม Processlist
ถ้าส่วนใหญ่:
Query
หรือ:
Executing
และ Time สูง
ปัญหาน่าจะเกี่ยวกับ:
Slow Query
Locks
Database Capacity
Query Burst
มากกว่า Idle Timeout
㊾ Too many connections + Sleep เวลาไม่สูง
ถ้า Sleep Connections มี Time:
1–10 วินาที
จำนวนหนึ่งอาจเป็นพฤติกรรมปกติของ Connection Pool
อย่าเห็นคำว่า:
Sleep
แล้วสรุปว่าเป็น Connection Leak ทันที
ต้องดู:
จำนวน
อายุ
แนวโน้ม
㊿ Connection Leak คืออะไร
ในความหมายทั่วไปคือ Application เปิด Connection แล้วไม่ได้คืน/ปิดตาม Lifecycle ที่ควร
อาการอาจเป็น:
Threads_connected เพิ่มขึ้นเรื่อยๆ
↓
ไม่ลด
↓
สุดท้ายชน max_connections
แต่ใน FiveM ที่ใช้ oxmysql อย่ารีบสรุปว่าเป็น Leak ก่อนตรวจ Driver/Pool/Resources จริง
51. Restart MariaDB แล้ว Threads_connected ลด
เป็นเรื่องปกติที่ Existing Connections ถูกตัดเมื่อ Database Service Restart
แต่ถ้า:
ผ่านไป 2 ชั่วโมง
↓
Connections กลับมาเต็ม
แปลว่า Root Cause ยังอยู่
Restart ไม่ใช่การแก้ Connection Architecture
52. Restart FXServer แล้ว Connections ลด
เช่นเดียวกัน
Connections ของ FiveM Application ถูก Reset
แต่ Resource ที่สร้าง Query/Connection Pressure เดิมจะกลับมาทำงานอีก
จึงต้องหา Resource ต้นเหตุ
53. Database อยู่ Remote ต้องสนใจ wait_timeout มากขึ้นไหม
Remote Connection มี Network Layer เพิ่ม
ถ้า Connection Idle ถูก Server ปิด แล้ว Client ต้อง Reconnect ก็มี Network Connection Setup เพิ่มเข้ามา
จึงควรให้ Timeout และ Pool Behaviorสัมพันธ์กันอย่างเหมาะสม
แต่ไม่ได้หมายความว่า Remote Database ต้องมี Timeout สูงเสมอ
54. Firewall Idle Timeout เกี่ยวไหม
Network Devices หรือ Cloud Infrastructure บางประเภทสามารถมี Connection Idle Timeouts ของตัวเอง
ดังนั้นหาก Connection ถูกตัดเร็วกว่าค่า MariaDB wait_timeout ที่ตรวจไว้ ต้องตรวจ:
Firewall
Load Balancer
NAT
VPN
Cloud Network
ด้วย
อย่าคิดว่าการ Disconnect ทุกครั้งมาจาก MariaDB
55. TCP Keepalive เกี่ยวไหม
Keepalive เป็น Network-level Mechanism คนละ Layer กับ MariaDB wait_timeout
การปรับ Network Keepalive ไม่ได้แทน MariaDB Connection Lifecycle
และไม่ควร Tune โดยไม่มีหลักฐานว่าปัญหาอยู่ Network Layer
56. oxmysql Connection String ควรแก้ไหม
ถ้าปัญหาเป็น:
Idle timeout
อย่าเปลี่ยน:
host
password
database
แบบสุ่ม
oxmysql Documentation ระบุ Connection String ใช้กำหนด Database Connection Settings และควรตั้งก่อน Resources Start.
Timeout Tuning เป็นอีกเรื่องหนึ่ง
57. Resource Query ไม่ควรใช้ Database เป็น Heartbeat
อย่าแก้ Connection Idle ด้วยการสร้าง Query เช่น:
SELECT 1;
ทุกวินาทีจากทุก Resource เพียงเพื่อให้ Connectionไม่ Idle
เพราะจะสร้าง Database Workload ที่ไม่จำเป็น
ให้ Driver/Pool และ Database Connection Management ทำหน้าที่ของมัน
58. Query ทุกนาทีเพื่อ Keepalive ดีไหม
ไม่ควรสร้างเองโดยไม่มี Requirement
Driver/Connection Pool ที่ดีควรจัดการ Connection Lifecycle
การเพิ่ม Keepalive Query แบบ Application-level อาจเพียงทำให้:
Query Count สูงขึ้น
โดยไม่แก้ปัญหาที่แท้จริง
59. Application อื่นใช้ Database เดียวกันต้องตรวจด้วย
สมมติ:
FiveM
Website
Admin Panel
Analytics
ใช้ MariaDB เดียวกัน
Threads_connected เป็น Connections ของ Database Server โดยรวม
ถ้า Website เปิด Connections ค้างมาก ปัญหาอาจไม่ใช่ oxmysql
ใช้:
SHOW FULL PROCESSLIST;
เพื่อแยก User/Host/Application.
60. Checklist wait_timeout สำหรับ FiveM
ก่อนเปลี่ยนค่า ตรวจ:
ค่า
wait_timeoutปัจจุบันค่า
interactive_timeoutThreads_connectedMax_used_connectionsThreads_runningSHOW FULL PROCESSLISTจำนวน Sleep Connections
อายุ Sleep Connections
Database User ของ Connections
Host ของ Connections
FiveM ใช้ oxmysql Version อะไร
Resource ไหน Query เยอะ
Slow Query มีหรือไม่
Query Burst มีหรือไม่
Autosave พร้อมกันหรือไม่
Login Burst หรือไม่
Long Transaction หรือไม่
Locks หรือไม่
Database CPU
Database RAM
Remote Database หรือ Local
Network Timeout มีหรือไม่
Connection Errors หลัง Idle หรือไม่
Reconnect Errors หรือไม่
เปลี่ยนทีละค่า
เก็บ Baseline
Test Staging
Restart MariaDB แล้ว Verify
Monitor หลังเปลี่ยน
Rollback ได้
ตาราง Timeout ที่ไม่ควรสับสน
| ค่า/แนวคิด | ใช้กับอะไร |
|---|---|
wait_timeout | Idle Non-interactive Connection |
interactive_timeout | Idle Interactive Connection |
innodb_lock_wait_timeout | รอ InnoDB Lock |
| Query Timeout | จำกัด Query Execution |
| Network Timeout | Network/Driver Layer |
| Connection Timeout | ระยะรอเปิด Connection |
MariaDB แยก Idle Connection Timeouts, Transaction/Lock Timeouts และ Query Limits ออกจากกันอย่างชัดเจน.
FiveM wait_timeout ดูยังไง
ใช้:
SHOW GLOBAL VARIABLES
LIKE 'wait_timeout';
และ:
SELECT @@SESSION.wait_timeout;
เพื่อแยก Global กับ Session Value
MariaDB System Variables มี Scope ตามประเภทของ Variable และสามารถตรวจได้ผ่าน SQL.
FiveM wait_timeout ควรตั้งเท่าไร
ไม่มีค่าตายตัวสำหรับทุก Server
ควรวัด:
Idle Connection Duration
Pool Behavior
Threads_connected
Reconnect Errors
Peak Connections
ก่อน
อย่า Copy ค่า 60, 300 หรือ 600 จาก Server อื่นโดยไม่รู้ Workload
FiveM wait_timeout แก้ Too many connections ได้ไหม
ได้เฉพาะกรณีที่ Connections จำนวนมากเป็น Idle Connections ที่เปิดค้างเกินความจำเป็น
MariaDB ระบุว่า wait_timeout ปิด Connections หลังไม่มี Activity แต่ Too Many Connections ยังต้องวิเคราะห์ Peak Connections และ Workload อื่นด้วย.
FiveM Threads_connected สูงทำอย่างไร
ใช้:
SHOW GLOBAL STATUS
LIKE 'Threads_connected';
SHOW GLOBAL STATUS
LIKE 'Threads_running';
SHOW FULL PROCESSLIST;
แล้วแยก:
Idle
หรือ
Active
ก่อนแก้
FiveM Sleep Connections เยอะอันตรายไหม
ไม่เสมอไป
Connection Pool สามารถมี Idle Connections เพื่อ Reuse ได้
ให้ดู:
จำนวน
Time
Trend
max_connections
ก่อนสรุปว่าเป็น Leak
FiveM Connection หลุดหลัง Idle นานแก้อย่างไร
ตรวจ:
wait_timeout
Network Idle Timeout
Pool/Driver Behavior
Database Restart
Firewall/NAT
MariaDB ระบุว่า Connection สามารถถูกปิดเมื่อถึง Idle Timeout และ Pool/Connector ต้องจัดการ Connection Lifecycle ให้เหมาะสม.
FiveM ลด wait_timeout แล้ว Database Error มากขึ้นเพราะอะไร
อาจเป็นเพราะ MariaDB ปิด Idle Connections เร็วกว่าที่ Application/Pool คาด
จึงเกิด Connection Reuse/Reconnect Errors มากขึ้น
ควรย้อนดู:
Processlist
Error Logs
Driver Behavior
และ Rollback ค่าเมื่อจำเป็น
FiveM wait_timeout กับ oxmysql ต้องตั้งเท่ากันไหม
ไม่มีสูตรว่าต้องมีตัวเลขเดียวกัน
สิ่งสำคัญคือ Database Server และ Connection Pool ต้องมี Lifecycle ที่เข้ากันได้
oxmysql ใช้ node-mysql2 เป็น Driver และทำหน้าที่เป็น Database Layer ของ FiveM.
FAQ FiveM MariaDB wait_timeout
wait_timeout คืออะไร
เป็น MariaDB Timeout ที่เกี่ยวกับการปิด Non-interactive Connections หลังไม่มี Activity เป็นระยะเวลาที่กำหนด.
interactive_timeout คืออะไร
เป็น Timeout สำหรับ Interactive Connections ที่ Idle และ MariaDB ระบุว่าเป็น Global/Session Dynamic Variable.
wait_timeout ใช้หยุด Slow Query ไหม
ไม่ เป็น Idle Connection Timeout ไม่ใช่ Query Execution Timeout
wait_timeout ช่วย Too many connections ไหม
ช่วยได้บางกรณีที่มี Idle Connections สะสม แต่ MariaDB แนะนำให้วิเคราะห์ Connections และ Peak Usage ก่อนปรับ Capacity.
ดู Connections ปัจจุบันอย่างไร
ใช้ Threads_connected และ SHOW FULL PROCESSLIST เพื่อดูจำนวนและรายละเอียด Threads/Connections.
Sleep Connection คือ Connection Leak ไหม
ไม่จำเป็น Connection Pool สามารถมี Idle Connections ได้ตามปกติ ต้องดูจำนวนและระยะเวลา
wait_timeout ต่ำเกินไปมีปัญหาไหม
มีโอกาสทำให้ Server ปิด Idle Connections บ่อยและ Application ต้อง Reconnect มากขึ้น
wait_timeout สูงเกินไปมีปัญหาไหม
ถ้า Application เปิด Connections ค้างจำนวนมาก Connections อาจอยู่ Idle นานเกินความจำเป็น
wait_timeout กับ innodb_lock_wait_timeout เหมือนกันไหม
ไม่ wait_timeout เกี่ยวกับ Idle Connection ส่วน innodb_lock_wait_timeout เกี่ยวกับการรอ InnoDB Lock.
wait_timeout ตั้งใน server.cfg ไหม
ไม่ใช่ FiveM ConVar โดยตรง แต่เป็น MariaDB Server Variable
oxmysql มี mysql_debug ไหม
มี สามารถใช้ set mysql_debug true เพื่อ Print Queries ใน Server Console และกำหนดเฉพาะ Resources ได้.
Connections สูงต้องเพิ่ม max_connections ก่อนหรือไม่
ไม่ควร MariaDB แนะนำให้ดู Threads_connected และ Max_used_connections เพื่อวิเคราะห์ Capacity ก่อน.
ประเด็นสำคัญ
FiveM MariaDB wait_timeout มีหน้าที่หลักคือ:
Connection ไม่มี Activity
↓
Idle
↓
ถึง Timeout
↓
MariaDB ปิด Connection
มันไม่ได้มีหน้าที่:
แก้ Slow Query
แก้ Lock
หยุด Query ช้า
แก้ N+1 Query
เพิ่ม Database CPU
MariaDB แยก Idle Connection Timeouts ออกจาก Query/Transaction/Lock Timeouts อย่างชัดเจน.
เมื่อ FiveM มี Connections สูง ให้เริ่มจาก:
Threads_connected
↓
Threads_running
↓
Max_used_connections
↓
SHOW FULL PROCESSLIST
↓
ดู Sleep/Active
↓
ดู oxmysql Queries
↓
ค่อยพิจารณา wait_timeout
ไม่ควรลด Timeout แบบสุ่ม เพราะ oxmysql ใช้ Database Driver ที่จัดการ Connections และ Connections ที่ Idle บางส่วนอาจมีไว้สำหรับ Pool Reuse ตามปกติ.
ถ้าพบว่า Processlist เต็มไปด้วย Connections ที่ Sleep เป็นเวลานานจริง จึงค่อยวิเคราะห์ wait_timeout, Pool Behavior และ Applications ที่เชื่อม Database แต่ถ้า Processlist เต็มไปด้วย Queries ที่กำลัง Execute หรือรอ Locks ให้แก้ Slow Query, Index, Transactions หรือ Query Burst แทน
สำหรับผู้อ่าน comsiam ให้จำสูตร “Connection เยอะ → แยก Idle กับ Active ก่อน → แล้วค่อยปรับ Timeout” และ comsiam แนะนำให้เก็บค่าเดิมและ Metrics ทุกครั้งก่อนปรับ wait_timeout เพราะค่าที่ดีที่สุดไม่ใช่ค่าที่ต่ำที่สุด แต่คือค่าที่สัมพันธ์กับ Connection Pool และ Workload ของ FiveM Server จริง
Comments
Post a Comment