連接數飆升至 600+ 甚至上千,MySQL CPU 飆高、回應變慢、甚至 OOM 掛掉。核心矛盾:單執行緒處理模型下,連接數與效能呈負相關。
-- 線上動態調整,無需重啟
SET GLOBAL innodb_thread_concurrency = 16; -- 先降至 16 觀察,再逐步調大至 64
-- 永久生效寫入 my.cnf
[mysqld]
innodb_thread_concurrency = 64
原理: 限制同時進入 InnoDB 核心層的執行緒數,減少上下文切換與鎖競爭,類比「食堂打飯限流」。
[mysqld]
max_connections = 1000 # 預設 151,視記憶體調整
max_user_connections = 500 # 單用戶上限,防單一應用佔滿
SET GLOBAL max_connections = 1000;
SET GLOBAL max_user_connections = 500;
SHOW VARIABLES LIKE 'max_connections';
SHOW PROCESSLIST; -- 當前連線
SHOW STATUS LIKE 'Threads_connected';
監控工具頻繁查詢 information_schema.TABLES 觸發 innodb_stats_on_metadata,導致大量磁碟讀取。
SET GLOBAL innodb_stats_on_metadata = OFF;
-- 永久
[mysqld]
innodb_stats_on_metadata = 0
編輯 /usr/local/mysql/bin/mysqld_safe,在 mysqld 啟動行追加:
-O max_connections=1500
重啟驗證:mysqladmin -uroot -p variables | grep max_connections