-- 降低 InnoDB 並發度,緩解 CPU/鎖競爭
SET GLOBAL innodb_thread_concurrency = 16; -- 視壓力調整 16~64
-- 提高最大連接數
SET GLOBAL max_connections = 1000;
-- 限制單用戶連接數,防單點佔滿
SET GLOBAL max_user_connections = 500;
-- 關閉 metadata 統計觸發的磁碟讀取
SET GLOBAL innodb_stats_on_metadata = 0;
[mysqld]
max_connections = 1000
max_user_connections = 500
innodb_thread_concurrency = 16
innodb_stats_on_metadata = 0
wait_timeout = 100
interactive_timeout = 100
# 連線池建議:應用層使用 HikariCP/Druid,避免頻繁建連
編輯 /usr/local/mysql/bin/mysqld_safe,在 mysqld 啟動行追加:
-O max_connections=1500
重啟驗證:mysqladmin -u root -p variables | grep max_connections
Threads_connected、Aborted_connects、Connection_errors_max_connections 納入監控。MySQL 每個連線對應一個執行緒,執行緒切換、鎖競爭、記憶體分配隨連線數線性增長。thread_pool (Percona/MariaDB/Enterprise) 可將連線多工至固定工作者執行緒,突破「連線即執行緒」瓶頸。
max_connections 會耗盡記憶體(每連線 ~256KB+),導致 OOM Killer 殺進程。innodb_thread_concurrency=0 表不限制,高並發下反而因鎖競爭效能下降。wait_timeout 過長導致睡眠連線佔槽,建議 60-300 秒。