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

ก่อนเปลี่ยนค่า ตรวจ:

  1. ค่า wait_timeout ปัจจุบัน

  2. ค่า interactive_timeout

  3. Threads_connected

  4. Max_used_connections

  5. Threads_running

  6. SHOW FULL PROCESSLIST

  7. จำนวน Sleep Connections

  8. อายุ Sleep Connections

  9. Database User ของ Connections

  10. Host ของ Connections

  11. FiveM ใช้ oxmysql Version อะไร

  12. Resource ไหน Query เยอะ

  13. Slow Query มีหรือไม่

  14. Query Burst มีหรือไม่

  15. Autosave พร้อมกันหรือไม่

  16. Login Burst หรือไม่

  17. Long Transaction หรือไม่

  18. Locks หรือไม่

  19. Database CPU

  20. Database RAM

  21. Remote Database หรือ Local

  22. Network Timeout มีหรือไม่

  23. Connection Errors หลัง Idle หรือไม่

  24. Reconnect Errors หรือไม่

  25. เปลี่ยนทีละค่า

  26. เก็บ Baseline

  27. Test Staging

  28. Restart MariaDB แล้ว Verify

  29. Monitor หลังเปลี่ยน

  30. Rollback ได้

ตาราง Timeout ที่ไม่ควรสับสน

ค่า/แนวคิดใช้กับอะไร
wait_timeoutIdle Non-interactive Connection
interactive_timeoutIdle Interactive Connection
innodb_lock_wait_timeoutรอ InnoDB Lock
Query Timeoutจำกัด Query Execution
Network TimeoutNetwork/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

Popular posts from this blog

FiveM ยังน่าเล่นไหม? Enhanced เปลี่ยน FiveM แค่ไหน

FiveM คืออะไร เล่นอย่างไร สำหรับมือใหม่ เริ่มต้นตั้งแต่ศูนย์

วิธีตั้ง Admin Permission ด้วย add_ace และ add_principal FiveM แบบละเอียด