FiveM MariaDB Too Many Connections คืออะไร? วิธีแก้ max_connections เต็มและหาสาเหตุ Database Connection พุ่ง

 FiveM MariaDB Too many connections คือ Error ที่เกิดเมื่อจำนวน Client Connections ที่ MariaDB ต้องรับพร้อมกันชนหรือเกินขีดจำกัดที่กำหนดด้วย max_connections ทำให้ Connection ใหม่ไม่สามารถเข้าฐานข้อมูลได้ตามปกติ.

สำหรับ FiveM Server ที่ใช้ oxmysql ปัญหานี้ไม่ควรถูกแก้ด้วยการเพิ่ม max_connections อย่างเดียว เพราะ Connection จำนวนมากอาจเป็นเพียงอาการของปัญหาที่แท้จริง เช่น Query ช้า, Query ถูกยิงมากเกินไป, Resource ทำ N+1 Query, Autosave พร้อมกันจำนวนมาก หรือมี Application อื่นใช้ Database เดียวกันอยู่

แนวทางที่ถูกต้องคือ:

Too many connections
↓
ดู max_connections
↓
ดู Threads_connected
↓
ดู Max_used_connections
↓
ดู Threads_running
↓
SHOW FULL PROCESSLIST
↓
หา Query / Application ต้นเหตุ
↓
Optimize
↓
ค่อยปรับ Capacity ถ้าจำเป็นจริง

① Too many connections คืออะไร

MariaDB ระบุว่าเมื่อระบบมี Connections มากเกินกว่าที่ Server อนุญาต สามารถเกิด Error:

Too many connections

โดยตัวแปรหลักที่กำหนดเพดานคือ:

max_connections

MariaDB แนะนำให้ดูทั้งจำนวน Connection ปัจจุบันและค่าที่เคยขึ้นสูงสุดก่อนตัดสินใจปรับค่า.

② max_connections คืออะไร

max_connections คือ MariaDB Server System Variable ที่ใช้จำกัดจำนวน Client Connections พร้อมกัน เพื่อป้องกัน Database Server ถูกใช้ Resources มากเกินไปจาก Connections จำนวนมหาศาล.

ดังนั้น:

max_connections
=
เพดาน Connection Capacity

ไม่ใช่:

จำนวนผู้เล่น FiveM

โดยตรง

③ Player 1 คนไม่ได้เท่ากับ 1 Database Connection

อย่าใช้สูตร:

100 Players
=
100 Database Connections

เพราะ FiveM Resources ส่ง SQL Operations ผ่าน oxmysql และ Application Database Layer สามารถใช้ Connections ร่วมกันผ่าน Connection Management/Pooling ได้

ดังนั้นสิ่งที่ต้องดูคือ:

Concurrent Database Operations

มากกว่าจำนวน Players เพียงอย่างเดียว

④ วิธีดู max_connections ปัจจุบัน

ใช้:

SHOW GLOBAL VARIABLES
LIKE 'max_connections';

หรือ:

SELECT @@GLOBAL.max_connections;

ค่าที่ได้คือ Configuration ของ MariaDB Server ในขณะนั้น

⑤ Threads_connected คืออะไร

MariaDB ระบุว่า:

Threads_connected

คือจำนวน Client Connections ที่กำลังเชื่อมต่ออยู่กับ Server ในขณะนั้น.

ตรวจด้วย:

SHOW GLOBAL STATUS
LIKE 'Threads_connected';

ตัวอย่าง:

Threads_connected = 80

แปลว่าขณะตรวจมี Connections อยู่ 80 Connections

⑥ Max_used_connections คืออะไร

ค่าที่สำคัญมากคือ:

Max_used_connections

MariaDB แนะนำให้ดูค่านี้ เพราะ Threads_connected บอกเพียงสถานะตอนนี้ ขณะที่ Max_used_connections ช่วยบอก Peak Connections ที่ Server เคยใช้.

ตรวจ:

SHOW GLOBAL STATUS
LIKE 'Max_used_connections';

⑦ ทำไม Max_used_connections สำคัญกว่าเดาตัวเลข

สมมติ:

max_connections = 300

Threads_connected = 30
Max_used_connections = 290

ตอนที่คุณเปิดดู Database อาจดูเหมือนไม่มีปัญหาเพราะเหลือเพียง 30 Connections

แต่ Peak เคยขึ้น:

290

ซึ่งใกล้ Limit มาก

ดังนั้นต้องดู Historical Peak ไม่ใช่ Snapshot จุดเดียว.

⑧ Threads_running คืออะไร

MariaDB ระบุว่า:

Threads_running

คือจำนวน Client Connections ที่กำลัง Execute Command อยู่จริง ไม่รวม Connections ที่เพียงเชื่อมค้างไว้และรอคำสั่ง.

ตรวจ:

SHOW GLOBAL STATUS
LIKE 'Threads_running';

นี่ช่วยแยก:

Connections เยอะ

ออกจาก:

Connections ที่กำลังทำงานหนักจริง

⑨ Threads_connected สูงแต่ Threads_running ต่ำหมายถึงอะไร

ตัวอย่าง:

Threads_connected = 200
Threads_running   = 5

หมายความว่ามี Connections จำนวนมากเปิดอยู่ แต่ Connections ที่กำลัง Execute Commands จริงมีน้อยกว่า

นี่ไม่ได้แปลว่าไม่มีปัญหา แต่ช่วยชี้ว่าควรวิเคราะห์:

Idle Connections
Connection Pool
Application Connection Behavior

มากกว่าดู CPU Query Processing อย่างเดียว

⑩ Threads_running สูงควรระวังอะไร

ถ้า:

Threads_connected = 200
Threads_running   = 180

แสดงว่ามี Connections จำนวนมากกำลังทำงานพร้อมกัน

ต้องตรวจ:

Query Type
Slow Queries
Locks
Disk I/O
CPU
Resource Query Burst

เพราะการเพิ่ม max_connections อาจเพียงเปิดทางให้ Database รับงานพร้อมกันมากขึ้น โดยไม่ได้แก้ Bottleneck เดิม

⑪ SHOW PROCESSLIST คืออะไร

MariaDB มี:

SHOW PROCESSLIST;

และ:

SHOW FULL PROCESSLIST;

สำหรับดู Threads/Connections ที่กำลังทำงานอยู่ โดย FULL ช่วยแสดง Query Information ได้มากกว่ารูปแบบปกติ.

⑫ ทำไม SHOW FULL PROCESSLIST สำคัญ

เมื่อ Connection พุ่ง คุณสามารถดู:

User
Host
Database
Command
Time
State
SQL

เพื่อหา:

ใครกำลังใช้ Connection?
Query ไหนทำงานนาน?
Connections มาจาก Application ไหน?

MariaDB ระบุว่า Process List สามารถดูผ่าน SHOW PROCESSLIST, information_schema.PROCESSLIST หรือ mariadb-admin processlist ได้.

⑬ ตัวอย่างใช้ SHOW FULL PROCESSLIST

SHOW FULL PROCESSLIST;

จากนั้นดู Rows ที่:

Time สูง
State ผิดปกติ
Query ซ้ำจำนวนมาก

โดยเฉพาะช่วงที่ FiveM ขึ้น Database Error

⑭ อย่าฆ่า Connection ทุกตัวทันที

เมื่อเห็น Process List ยาว อย่าเริ่มจาก Kill Connections แบบสุ่ม

เพราะบาง Connection อาจกำลัง:

Save Player
Transaction
Migration
Backup
Maintenance

การตัดกลาง Operation อาจสร้างปัญหาใหม่

ให้หา Root Cause ก่อน

⑮ Information Schema PROCESSLIST คืออะไร

MariaDB มี:

information_schema.PROCESSLIST

ซึ่งเก็บรายละเอียดเกี่ยวกับ Threads ที่กำลังทำงาน เช่น Connection ID, User, State และเวลาการทำงาน.

จึงสามารถ Query เพื่อวิเคราะห์ Connections ได้ละเอียดขึ้น

ตัวอย่าง:

SELECT *
FROM information_schema.PROCESSLIST;

⑯ Too many connections เกิดจากอะไรได้บ้าง

สาเหตุหลักที่ควรวิเคราะห์:

① max_connections ต่ำกว่าความต้องการจริง
② Resource Query มากเกินไป
③ Query ช้า
④ Connections ค้างนาน
⑤ Database ใช้ร่วมหลาย Applications
⑥ Login Burst
⑦ Autosave Burst
⑧ Long Transaction
⑨ Database CPU/Disk ตัน
⑩ Application Connection Management ผิด

MariaDB เองแนะนำว่าเมื่อเจอ Too Many Connections ควรดู Peak Connections และวิเคราะห์ก่อนเพิ่ม Capacity.

⑰ Slow Query ทำให้ Connection เต็มได้อย่างไร

ลองสมมติ:

Query A = 2 วินาที

มี Requests เข้ามาเรื่อยๆ:

Connection 1
→ Query A

Connection 2
→ Query A

Connection 3
→ Query A

...

เพราะแต่ละ Queryใช้เวลานาน Connection Capacity จึงถูกใช้นานขึ้น

ดังนั้น Slow Query สามารถทำให้ Concurrent Connection Pressure สูงขึ้นได้

⑱ oxmysql Slow Query Warning ช่วยอะไร

oxmysql รองรับ:

mysql_slow_query_warning

เช่น:

set mysql_slow_query_warning 150

เพื่อแจ้ง Queries ที่ใช้เวลานานกว่าค่าที่กำหนด โดย oxmysql เตือนว่า Query Time อาจไม่ได้หมายถึง Database Problem เสมอ เพราะ Server Hitch ก็สามารถมีผลได้.

⑲ ใช้ mysql_debug เพื่อหา Query หนัก

oxmysql ระบุว่าความเร็ว Query จริงสามารถดูผ่าน Debug UI และ Server Console เมื่อเปิด mysql_debug.

เมื่อ Connection พุ่ง ให้ดูพร้อมกัน:

Query Time
+
Query Count

เพราะ Query 5 ms ที่ถูกเรียกหลายหมื่นครั้งก็สามารถสร้าง Load ได้

⑳ oxmysql Debug UI ดูอะไรได้

Debug UI ของ oxmysql แสดง:

Queries
Execution Time
จำนวน Queries
Slow Queries
Resource Statistics

และสามารถแยกตาม Resource ได้.

จึงช่วยหาได้ว่า:

resource ไหน

กำลังสร้าง Database Workload สูงผิดปกติ

㉑ Debug UI ควรเปิด Production ตลอดไหม

oxmysql ระบุว่า Debug UI ควรใช้ระหว่าง Development หรือ Server ที่ Player Count ต่ำ และสำหรับ Server ใหญ่ควรพิจารณา Built-in MySQL Logging แทน.

ดังนั้นอย่าเปิด Diagnostic UI หนักๆ ตลอด Production โดยไม่มีเหตุผล

㉒ Query Count สำคัญอย่างไร

สมมติ Resource A:

Query = 150 ms
เรียก 10 ครั้ง

Resource B:

Query = 3 ms
เรียก 100,000 ครั้ง

Resource B อาจสร้าง Workload รวมมากกว่า

Debug UI ของ oxmysql แสดงทั้งจำนวน Queries และ Execution Time ต่อ Resource จึงควรดูสองค่าไปพร้อมกัน.

㉓ N+1 Query คืออะไร

ตัวอย่าง:

local players = getPlayers()

for i = 1, #players do
    MySQL.single.await(
        'SELECT ... WHERE identifier = ?',
        {
            players[i].identifier
        }
    )
end

ถ้ามี:

200 Players

Loop นี้สามารถสร้าง:

200 Database Queries

สำหรับหนึ่ง Operation

ถ้า Operation เกิดบ่อย Database Connection Pressure ก็เพิ่มตาม

㉔ N+1 Query แก้อย่างไร

พิจารณา:

Query รวม
Batch
Cache
Load ข้อมูลก่อน

ตาม Use Case

เป้าหมายคือ:

ลด Database Round Trips

ไม่ใช่เพียงเพิ่ม max_connections

㉕ Query ทุก Tick อันตรายมาก

หลีกเลี่ยง:

CreateThread(function()
    while true do

        MySQL.query.await(
            'SELECT ...'
        )

        Wait(0)
    end
end)

ถึง Query จะเร็ว Resource ก็สร้าง Database Operations ต่อเนื่องโดยไม่จำเป็น

Database ไม่ควรถูกใช้เป็น Runtime Variable Store ทุก Frame

㉖ Cache ช่วยอย่างไร

ตัวอย่าง:

Player Login
↓
Database Query
↓
Cache
↓
Gameplay อ่านจาก Cache

แทน:

Gameplay ทุก Action
↓
Database Query

ช่วยลด Query Count และ Connection Pressure พร้อมกัน

㉗ Login Burst คืออะไร

หลัง Restart Server ผู้เล่นจำนวนมากอาจเข้าใกล้กัน

แต่ละ Player อาจทำ:

Account Query
Character Query
Settings Query
Vehicle Query
Metadata Query

สมมติ:

100 Players
×
10 Queries
=
1,000 Queries

ในช่วงสั้นๆ

ปัญหาจึงอาจเกิดเฉพาะช่วง Server เปิดใหม่

㉘ Autosave Burst คืออะไร

สมมติทุก 5 นาที Resource ทำ:

Save Player ทุกคนพร้อมกัน

ถ้ามี:

300 Players

และ Player แต่ละคน Save 5 Queries:

300 × 5
=
1,500 Queries

ในช่วงเวลาใกล้กัน

นี่สามารถสร้าง Database Spike โดยไม่เกี่ยวกับ max_connections ที่ต่ำอย่างเดียว

㉙ วิธีลด Autosave Burst

พิจารณา:

Dirty Flag
Stagger Save
Batch Operation
Upsert
ลดข้อมูลที่ Save ซ้ำ

แทนการ Save ทุก Player พร้อมกันตรงนาทีเดียว

㉚ Dirty Flag คืออะไร

เก็บสถานะว่า Data มีการเปลี่ยนหรือไม่

ตัวอย่าง:

dirty = false

เมื่อ Data เปลี่ยน:

dirty = true

Autosave:

dirty = false
→ ไม่ Query

dirty = true
→ Save

ช่วยลด Database Writes ที่ไม่มีการเปลี่ยนข้อมูลจริง

㉛ Transaction ใหญ่มีผลอย่างไร

oxmysql Transaction จะ Execute หลาย Queries และ Commit เมื่อทั้งหมดสำเร็จ หากหนึ่ง Query ล้มเหลวจะไม่ Commit ชุดนั้น.

หาก Transaction มี Queries จำนวนมากหรือมี Slow Query อยู่ภายใน Database Work อาจใช้เวลานานขึ้น

ดังนั้นควรใส่เฉพาะ Operations ที่ต้อง Atomic จริง

㉜ MySQL.prepare ช่วยไหม

oxmysql ระบุว่า MySQL.prepare เหมาะสำหรับ Queries ที่ถูกเรียกบ่อยและรองรับ Parameter Sets หลายชุด.

แต่ Prepare:

ไม่ได้ลด Query Count อัตโนมัติ

และ:

ไม่ได้แก้ Missing Index

จึงต้องใช้ให้ตรงปัญหา

㉝ Too many connections ไม่ได้แปลว่า FiveM ใหญ่เกินไป

Server Player น้อยก็สามารถเจอได้ถ้า Resource พัง เช่น:

Loop Query
Connection Bug
Long Queries
Autosave ผิด

ขณะที่ Server Player เยอะอาจไม่เจอ หาก Query Architecture และ Database Capacity ถูกออกแบบดี

㉞ Database ใช้ร่วมกับ Application อื่นได้ไหม

ได้ แต่ Connection Limit เป็น Resource ของ MariaDB Server โดยรวม

สมมติ Database Server รับ:

FiveM
Website
Admin Panel
Analytics
Backup Tool

Connections ของ Applications เหล่านี้สามารถใช้ Capacity ร่วมกัน

ดังนั้น Process List ต้องดูว่า Connections มาจากใครบ้าง ไม่ใช่กล่าวโทษ FiveM อย่างเดียว

㉟ MAX_USER_CONNECTIONS คืออะไร

MariaDB รองรับ Account Resource Limit:

MAX_USER_CONNECTIONS

เพื่อจำกัดจำนวน Connections พร้อมกันที่ Account หนึ่งสามารถใช้ได้.

เช่น FiveM User อาจถูกจำกัดแยกจาก User ของ Website ตาม Architecture

㊱ MAX_USER_CONNECTIONS = 0 หมายถึงอะไร

MariaDB ระบุว่าเมื่อ Account Limit นี้เป็น 0 จะใช้ Global Connection Rules แทนตาม Configuration ที่เกี่ยวข้อง.

ดังนั้นถ้า FiveM User ถูก Limit แยก ต้องตรวจ Account Resource Limits เพิ่ม ไม่ใช่ดูเฉพาะ Global max_connections

㊲ ตรวจ User Connection Limit อย่างไร

ตรวจ Account Definition/Privileges ของ Database User ที่ FiveM ใช้

รวมถึง:

SHOW GRANTS
FOR 'fivem_app'@'localhost';

และ Account Resource Configuration ที่ตั้งไว้

อย่าเพิ่ม Global Limit หากปัญหาจริงอยู่ที่ User-specific Limit

㊳ เพิ่ม max_connections ได้ไหม

ได้ แต่ควรทำหลังวัดจริง

MariaDB เองแนะนำเมื่อ Connections เกิน Limit ให้พิจารณาค่า Peak Usage และทำการเปลี่ยน Configurationอย่างมีข้อมูลรองรับ.

อย่าตั้ง:

max_connections = 5000

เพียงเพราะต้องการให้ Error หาย

㊴ ทำไม max_connections สูงเกินไปมีผลเสีย

Connections และ Threads ใช้ Memory/Resources ของ Database

MariaDB Documentation ด้าน Memory ระบุว่าจำนวน Connections ที่สูงมากเพิ่ม Memory Consumption และค่า max_connections ในระดับหลักพันอาจเป็นสัญญาณว่ามีปัญหา Architecture อื่นที่ควรแก้ด้วย.

ดังนั้น:

Limit สูง
≠
ฟรี

㊵ เพิ่ม max_connections แล้ว Database CPU 100%

นี่เป็นสถานการณ์ที่เกิดได้ในเชิง Capacity:

เดิมรับ 200 Concurrent Operations
↓
เพิ่ม Limit
↓
รับ 500 Concurrent Operations
↓
CPU / Disk รับไม่ไหว

ดังนั้น Connection Capacity ต้องสัมพันธ์กับ:

CPU
Memory
Disk
Query Performance

ไม่ใช่แค่ค่า Configuration

㊶ วิธีเปลี่ยน max_connections ชั่วคราว

สำหรับ MariaDB Version/Environment ที่ตัวแปรเป็น Dynamic สามารถปรับ Global Runtime Variable ได้ตามสิทธิ์ที่เหมาะสม

ตัวอย่าง:

SET GLOBAL max_connections = 300;

แต่การเปลี่ยน Runtime Setting ไม่ควรถูกถือว่าเป็น Persistent Configuration หลัง Restart โดยอัตโนมัติ

ต้องตรวจ Configuration Management ของ MariaDB ที่ Server ใช้อยู่ด้วย.

㊷ Persistent max_connections ตั้งตรงไหน

ขึ้นกับ MariaDB Installation/Operating System และ Configuration File Layout

หลักการคือกำหนด Server Variable ใน MariaDB Server Configuration และ Restart/Reload ตามวิธีที่ Version/Environment รองรับ

ก่อน Production Change ควร Backup Configuration เดิมและจดค่าปัจจุบันไว้

㊸ อย่าแก้ max_connections ตอน Server มีปัญหาโดยไม่จด Baseline

ก่อนปรับเก็บ:

max_connections
Threads_connected
Max_used_connections
Threads_running
Database CPU
Memory
Query Count
Slow Query

จากนั้นหลังปรับจึงเปรียบเทียบ

ถ้าไม่เก็บ Baseline คุณจะไม่รู้ว่าการเปลี่ยนช่วยจริงหรือเพียงซ่อน Error ชั่วคราว

㊹ SHOW STATUS ช่วยอะไร

MariaDB ระบุว่า Global/Session Status Variables สามารถดูผ่าน:

SHOW GLOBAL STATUS
SHOW SESSION STATUS

และข้อมูลเดียวกันยังอยู่ใน information_schema.GLOBAL_STATUS และ SESSION_STATUS.

จึงสามารถทำ Monitoring ได้มากกว่า Snapshot เพียงตัวเดียว

㊺ Database Monitoring ควรดูอะไร

อย่างน้อย:

max_connections
Threads_connected
Max_used_connections
Threads_running
Slow Queries
Queries/sec
CPU
Memory
Disk I/O

รวมถึง FiveM-side:

oxmysql Query Count
Resource Query Time
Hitch Warnings

㊻ Threads_connected ใกล้ max_connections ต้องทำอะไร

ตัวอย่าง:

max_connections = 200
Threads_connected = 190

อย่ารีบเพิ่มเป็น 500

ทำ:

① SHOW FULL PROCESSLIST
② ดู Users/Hosts
③ ดู Query Duration
④ ดู Idle Connections
⑤ ดู Max_used_connections
⑥ ดู Query Count ของ FiveM Resources
⑦ ดู Database CPU
⑧ ค่อยตัดสินใจ

㊼ Max_used_connections ใกล้ Limit แต่เกิดครั้งเดียว

ตรวจว่าช่วงนั้นเกิดอะไร

เช่น:

Server Restart
Player Reconnect
Backup
Migration
Autosave
Website Import

ถ้าเป็น Burst ที่เกิดจากงานหนึ่งครั้ง วิธีแก้อาจต่างจาก Load สูงตลอดวัน

㊽ Max_used_connections สูงทุกวัน

นี่ควรนำไปสู่ Capacity Investigation จริง

ดู Trend:

วันจันทร์ 180
วันอังคาร 185
วันพุธ 192

หาก Limit:

200

แสดงว่าระบบกำลังเข้าใกล้ Capacity

จากนั้นจึง Optimize + Capacity Plan

㊾ Too many connections หลังติดตั้ง Script ใหม่

สงสัย Resource ใหม่ก่อน

ตรวจ oxmysql Debug Statistics เพื่อดูว่า Resource นั้นสร้าง Queries มากแค่ไหน เพราะ Debug UI สามารถแสดง Query Count และ Execution Time แยกตาม Resource ได้.

ถ้า Traffic ไม่เปลี่ยนแต่ Connections พุ่งหลังติดตั้ง Resource ใหม่ มีเหตุผลมากที่จะตรวจ Query Architecture ของ Resource นั้น

㊿ Too many connections หลัง Update Script

ตรวจ:

Loop ใหม่?
Autosave เปลี่ยน?
Query ใหม่?
Migration ทำให้ Index หาย?
Query ช้าขึ้น?

อย่า Assume ว่า MariaDB Config เปลี่ยนเอง

เปรียบเทียบ Query Metrics ก่อนและหลัง Update

51. Too many connections หลังย้าย Database

ตรวจ:

Network Latency
Remote DB CPU
Connection String
Connection Pool Behavior
Firewall
Database Capacity

Remote Database ที่ตอบช้ากว่าเดิมสามารถทำให้ Operations ใช้ Connections นานขึ้นได้ในบาง Workloads

52. Too many connections หลังเปิด Website ใช้ Database เดียวกัน

ใช้:

SHOW FULL PROCESSLIST;

แล้วดู:

User
Host
DB

เพื่อแยกว่า Connections มาจาก FiveM หรือ Website

การใช้ Dedicated Database User ต่อ Application ช่วยวิเคราะห์ปัญหาได้ง่ายขึ้น

53. Dedicated User ช่วยเรื่อง Monitoring อย่างไร

ตัวอย่าง:

fivem_app
website_app
analytics_app

Process List จะช่วยแยก Connections ตาม User ได้ง่ายกว่าให้ทุกระบบใช้:

root

User เดียว

นอกจากด้าน Security แล้ว ยังช่วย Operations และ Troubleshooting

54. Connection Pool ควรสร้างเองใน Resource ไหม

ถ้าใช้ oxmysql อยู่แล้ว Resource ควรใช้ oxmysql API แทนการสร้าง Database Client/Pool แยกเองโดยไม่มีเหตุผล

oxmysql เป็น Resource สำหรับให้ FXServer สื่อสารกับ MySQL-compatible Database ผ่าน Database Driver อยู่แล้ว.

การเพิ่ม Pool แยกหลายตัวอาจทำให้ Connection Architecture ซับซ้อนขึ้น

55. Server หลายตัวใช้ Database เดียวกันได้ไหม

ทำได้ในบาง Architecture แต่ต้องคิด Capacity รวม

ตัวอย่าง:

FiveM Server A
FiveM Server B
Web Panel
↓
MariaDB เดียว

ทุก Application ใช้:

Connection Capacity
CPU
Memory
Disk

จาก Database Server เดียวกัน

ดังนั้น max_connections ต้องออกแบบจาก Total Workload ไม่ใช่ Server A เพียงตัวเดียว

56. MariaDB Thread Pool คืออะไร

MariaDB มี Thread Pool ซึ่งเป็นกลไก Server-side สำหรับจัดการ Threads ของ Client Connections และสร้าง/ลด Threads ตาม Demand ใน Mode ที่รองรับ.

แต่:

Thread Pool
≠
เพิ่ม max_connections แล้วจบ

การ Tune Thread Model เป็น Database Performance Topic ที่ต้องดู Version และ Workload จริง

57. ควรเปิด MariaDB Thread Pool เพื่อแก้ทันทีไหม

ไม่ควรเปลี่ยน Thread Handling โดยไม่มี Benchmark

ให้แก้:

Query Architecture
Indexes
Slow Queries
Connection Burst

ก่อน

จากนั้นถ้า Database Scale ต้องการ Thread Pool Tuning จริงจึงทดสอบใน Staging

58. backlog คืออะไร

MariaDB มี Server Variable สำหรับจำนวน Outstanding Connection Requests ที่สามารถรอใน TCP Listen Queue ได้ และ Requests ที่เกิน Queue สามารถถูกปฏิเสธได้.

นี่เป็นคนละเรื่องกับ max_connections

ดังนั้น Connection Burst Issues อาจเกี่ยวข้องกับ Network Listen Queue ได้ด้วยในระบบที่มี Connections ใหม่พร้อมกันจำนวนมาก

59. อย่าปรับทุก Connection Variable พร้อมกัน

หลีกเลี่ยง:

max_connections
back_log
thread_handling
timeouts

ทั้งหมดในครั้งเดียว

เพราะหลังจากนั้นจะไม่รู้ว่าตัวไหนทำให้ระบบดีขึ้นหรือแย่ลง

ใช้:

Measure
↓
Change 1 เรื่อง
↓
Measure

เป็นหลัก

60. Too many connections กับ Database Down ต่างกัน

Too many connections

Database Server ยังตอบ แต่ไม่รับ Client Connection เพิ่มเพราะ Capacity/Limit

Database Down

Service ไม่พร้อมให้ Connection ตามปกติ

จึงต้องอ่าน Error Message จริง ไม่ใช่ Restart Everything ทุกครั้ง

61. Too many connections กับ Access Denied ต่างกัน

Too many connections

Capacity / Limit

Access Denied

Authentication / User / Host / Permission

ถ้า Error เป็น Access Denied การเพิ่ม max_connections ไม่ช่วย

62. Too many connections กับ Slow Query ต่างกัน

เป็นคนละ Error แต่เกี่ยวกันได้

Slow Query
↓
Connection ถูกใช้นาน
↓
Connections สะสม
↓
Too many connections

ดังนั้นเมื่อ Connection เต็มควรตรวจ Slow Queries ไปด้วย

63. Too many connections กับ Timeout

เมื่อ Database Capacity ตึง Applications อาจเริ่มรอนานและ Timeout ตามมาได้

แต่ Timeout ยังอาจเกิดจาก:

Network
Firewall
Database Down

ดังนั้นอย่าสรุปจาก Timeout อย่างเดียวว่า max_connections เต็ม

64. Emergency Fix ควรทำอย่างไร

ถ้า Production กำลังใช้งานไม่ได้:

① ตรวจ max_connections
② ตรวจ Threads_connected
③ SHOW FULL PROCESSLIST
④ หา Connections/Queries ผิดปกติ
⑤ ลดหรือหยุด Resource ต้นเหตุเมื่อจำเป็น
⑥ ปรับ Capacity ชั่วคราวหาก Database Resources รองรับ
⑦ เก็บ Logs
⑧ ทำ Root Cause Analysis ต่อ

อย่าเพิ่ม Limit หลายเท่าโดยไม่ดู RAM/CPU

65. การ Restart MariaDB แก้ได้ไหม

Restart จะตัด Existing Connections และทำให้ Status บางอย่างเริ่มใหม่ แต่ถ้า Root Cause คือ:

Resource Query Loop
Autosave Burst
Slow Query

Connections จะกลับมาพุ่งอีก

Restart จึงอาจแก้อาการชั่วคราว ไม่ใช่ Root Cause

66. Restart FXServer ช่วยไหม

เช่นเดียวกัน

หาก FiveM Resources เป็นต้นเหตุ Restart อาจ Reset Runtime State และ Connections ชั่วคราว แต่ Bug/Architecture เดิมยังอยู่

หลังเปิด Server Connections อาจกลับมาเต็มอีกครั้ง

67. FiveM Profiler ต้องใช้ไหม

ถ้า Database Debug บอก Query ไม่ได้ช้ามาก แต่ Server ยังมี Hitch อาจต้องตรวจ FiveM Resource Processing เพิ่ม

Database Connection Metrics และ Resource CPU Metrics ควรดูร่วมกันเมื่อปัญหาไม่ชัด

68. Checklist Too many connections

เมื่อ Error เกิด ตรวจตามนี้:

  1. max_connections

  2. Threads_connected

  3. Max_used_connections

  4. Threads_running

  5. SHOW FULL PROCESSLIST

  6. User ของ Connections

  7. Host ของ Connections

  8. Query Duration

  9. Idle Connections

  10. Slow Queries

  11. Query Count ต่อ Resource

  12. Resource ที่เพิ่งติดตั้ง

  13. Resource ที่เพิ่ง Update

  14. Login Burst

  15. Autosave Burst

  16. N+1 Query

  17. Query ทุก Tick

  18. Long Transactions

  19. Missing Index

  20. Database CPU

  21. Database RAM

  22. Disk I/O

  23. Remote Database Latency

  24. Applications อื่นใช้ DB เดียวกันหรือไม่

  25. MAX_USER_CONNECTIONS

  26. Backup/Migration กำลังทำหรือไม่

  27. Query Debug

  28. Historical Peak

  29. Capacity Trend

  30. ค่อยปรับ max_connections

ตาราง MariaDB Connection Metrics ที่ควรรู้

ค่าใช้ดูอะไร
max_connectionsเพดาน Connections
Threads_connectedConnections ปัจจุบัน
Max_used_connectionsPeak Connections ที่เคยใช้
Threads_runningConnections ที่กำลัง Execute Command
SHOW FULL PROCESSLISTรายละเอียด Connections/Queries
MAX_USER_CONNECTIONSLimit ต่อ Database Account

MariaDB แนะนำให้ดูทั้ง Current Connections และ Peak Connections เมื่อวิเคราะห์ Too many connections.

FiveM Too many connections แก้อย่างไร

เริ่มจาก:

SHOW GLOBAL VARIABLES
LIKE 'max_connections';

SHOW GLOBAL STATUS
LIKE 'Threads_connected';

SHOW GLOBAL STATUS
LIKE 'Max_used_connections';

SHOW GLOBAL STATUS
LIKE 'Threads_running';

SHOW FULL PROCESSLIST;

จากนั้นหา:

Resource ไหน
Query ไหน
Application ไหน

กำลังใช้ Connections ก่อนตัดสินใจเพิ่ม Limit

FiveM max_connections ควรตั้งเท่าไร

ไม่มีตัวเลขเดียวสำหรับทุก FiveM Server

ค่าที่เหมาะสมขึ้นกับ:

Database Hardware
Memory
Query Workload
Concurrent Operations
Applications ที่ใช้ DB
Connection Architecture

MariaDB เตือนว่าจำนวน Connections สูงมากใช้ Memory เพิ่มและอาจสะท้อนปัญหาอื่นที่ควรแก้.

FiveM 100 คนต้อง max_connections 100 ไหม

ไม่

Player Count กับ Database Connections ไม่ได้ Mapping แบบหนึ่งต่อหนึ่ง

ให้ดู:

Max_used_connections

และ Workload จริงแทน

FiveM 500 คนต้อง max_connections 500 ไหม

ไม่จำเป็นเช่นกัน

Server 500 Players ที่ Cache ดีและ Query มีประสิทธิภาพอาจต้องการ Connections น้อยกว่า Server ขนาดเล็กที่ Resource Query ผิด Architecture

ใช้ Monitoring ตัดสิน

FiveM Threads_connected สูงแก้อย่างไร

ดู:

Threads_running
+
SHOW FULL PROCESSLIST

เพื่อแยกว่า Connections:

กำลังทำงาน

หรือ:

Idle

MariaDB แยก Threads_connected กับ Threads_running ไว้เป็น Status Variables คนละค่า.

FiveM Max_used_connections คืออะไร

คือ Peak Connections ที่ MariaDB เคยใช้ และ MariaDB แนะนำให้ดูค่านี้เมื่อตรวจ Too Many Connections เพราะ Snapshot Threads_connected เพียงอย่างเดียวอาจไม่เห็นช่วง Peak.

FiveM SHOW PROCESSLIST ใช้ยังไง

ใช้:

SHOW FULL PROCESSLIST;

เพื่อตรวจ Threads/Queries ที่ทำงานอยู่

MariaDB ระบุว่า Command นี้ใช้แสดง Running Threads และหากใช้ FULL จะเห็น Statement Information มากกว่ารูปแบบปกติ.

FiveM ต้องเพิ่ม max_connections ทันทีไหม

ไม่

เพิ่มเมื่อ:

Workload ถูก Optimize แล้ว
Database ยังมี Resources เหลือ
Peak Connections ต้องการ Capacity เพิ่มจริง

ไม่ใช่เมื่อ:

Query Loop ยังพัง

เพราะจะเพียงเลื่อนเวลาที่ Error เกิดออกไป

FiveM Query ช้าทำให้ Connections เต็มได้ไหม

ได้ในเชิง Workload เพราะ Operations ที่ใช้เวลานานสามารถทำให้ Connections ถูกใช้นานขึ้น ขณะที่ Requests ใหม่ยังเข้ามา

ควรตรวจ Slow Queries ด้วย oxmysql Debug/Logging ควบคู่กับ MariaDB Connection Metrics.

FiveM mysql_debug ช่วยได้ไหม

ได้ oxmysql ระบุว่า Real Query Speeds สามารถดูผ่าน Debug UI และ Server Console เมื่อ mysql_debug เปิด.

ใช้หา Query ที่:

ช้า
หรือ
ถูกเรียกบ่อยผิดปกติ

FiveM Resource ไหนใช้ Query เยอะดูยังไง

oxmysql Debug UI แสดง Query Count, Total Execution Time และ Slow Queries แยกตาม Resource.

จึงเหมาะกับการหา Resource ที่สร้าง Database Pressure

FiveM เพิ่ม max_connections แล้วต้อง Restart ไหม

ขึ้นกับวิธีเปลี่ยนค่า

การเปลี่ยน Dynamic Global Variable สามารถมีผล Runtime ตาม MariaDB Variable Behavior แต่ Persistent Configuration ต้องตั้งให้ถูกใน MariaDB Server Configuration ที่ Environment ใช้.

อย่าคิดว่า Runtime Change จะอยู่หลัง Database Restart เสมอไป

FAQ FiveM MariaDB Too Many Connections

Too many connections คืออะไร

คือ MariaDB ไม่สามารถรับ Connection ใหม่ได้ตามปกติเพราะจำนวน Connections ชน Limit ที่เกี่ยวข้องกับ max_connections.

max_connections คืออะไร

เป็น Server Variable สำหรับจำกัดจำนวน Connections พร้อมกันเพื่อช่วยป้องกัน Resource Exhaustion.

Threads_connected คืออะไร

จำนวน Client Connections ที่เชื่อมอยู่ในขณะนั้น.

Threads_running คืออะไร

จำนวน Client Connections ที่กำลัง Execute Commands อยู่จริง.

Max_used_connections คืออะไร

Peak จำนวน Connections ที่ MariaDB เคยใช้งาน และเป็นค่าที่มีประโยชน์มากในการวิเคราะห์ Capacity.

SHOW FULL PROCESSLIST ใช้ทำอะไร

ใช้ดู Running Threads และ SQL/Connection Details เพื่อหาว่า Connection ไหนกำลังทำอะไร.

Player 1 คนเท่ากับ 1 Connection ไหม

ไม่ ควรวัด Concurrent Database Operations และ Peak Connections จริงแทน

เพิ่ม max_connections เยอะๆ ดีไหม

ไม่เสมอไป MariaDB ระบุว่า Connections ใช้ Memory และจำนวน Connections ในระดับสูงมากอาจบ่งบอกปัญหาอื่นที่ควรแก้.

Slow Query ทำให้ Connection เต็มได้ไหม

สามารถเพิ่ม Connection Pressure ได้ เพราะ Operations ใช้เวลานานขึ้น ควรตรวจ Slow Query และ Query Count ไปพร้อมกัน

mysql_debug ช่วยหาได้ไหม

ได้ oxmysql ระบุว่าสามารถดู Query Speeds ผ่าน Debug UI และ Console เมื่อเปิด mysql_debug.

MAX_USER_CONNECTIONS คืออะไร

เป็น MariaDB Account Resource Limit สำหรับจำกัด Connections พร้อมกันของ Account หนึ่ง.

Restart MariaDB แก้ถาวรไหม

ไม่ หาก Root Cause คือ Resource Query Loop, Slow Query หรือ Query Burst ปัญหาสามารถกลับมาอีกหลังระบบเปิดใหม่

ประเด็นสำคัญ

เมื่อ FiveM ขึ้น:

Too many connections

อย่าเริ่มจาก:

เพิ่ม max_connections

ทันที

ให้เริ่มจาก:

max_connections
↓
Threads_connected
↓
Max_used_connections
↓
Threads_running
↓
SHOW FULL PROCESSLIST
↓
oxmysql Query Statistics
↓
Slow Query
↓
Resource Query Count

MariaDB แนะนำให้ดู Threads_connected ร่วมกับ Max_used_connections เพื่อเข้าใจทั้งสถานะปัจจุบันและ Peak Connection Usage ก่อนตัดสินใจแก้ Capacity.

จากนั้นตรวจ FiveM-side ด้วย oxmysql เพราะ Debug UI สามารถแสดงว่า Resource ไหนยิง Queries มาก, ใช้เวลารวมเท่าไร และมี Slow Queries เท่าไร.

สิ่งที่ต้องจำคือ:

Too many connections
ไม่ได้แปลว่า
max_connections ต่ำเสมอ

ต้นเหตุอาจเป็น:

Query Loop
N+1 Query
Slow Query
Autosave Burst
Login Burst
Long Transaction
Application อื่นใช้ DB เดียวกัน

และ MariaDB เตือนว่าการตั้ง Connections สูงมากเพิ่ม Memory Requirements และอาจสะท้อน Architecture Problem ที่ควรถูกแก้ก่อน.

สำหรับผู้อ่าน comsiam ให้จำสูตร “Connections เต็ม → วัดก่อน → หา Query → Optimize → ค่อยเพิ่ม Capacity” และ comsiam แนะนำว่า max_connections ควรเป็นผลจาก Monitoring และ Capacity Planning ไม่ใช่ตัวเลขที่ Copy มาจาก Server อื่น เพราะ Database ที่รับ Connections ได้เยอะที่สุดไม่ได้หมายความว่าเป็น Database ที่ทำงานดีที่สุด

Comments

Popular posts from this blog

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

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

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