ERROR 1040 (HY000): Too many connections
應用報錯、新連線被拒、現有連線可能卡死。
mysqli_close() 未調用、連線池未釋放排查:
SHOW PROCESSLIST;
-- 觀察 Command=Sleep、Time 較大、Info=NULL 的連線
排查:
SHOW FULL PROCESSLIST;
-- 找 Time 大、State=Sending data/Locked 的查詢
-- 配合 slow_query_log 定位
某電商大促:Web 節點一台掛掉 → 流量湧向剩餘節點 → PHP-FPM 處理變慢 → MySQL 連線釋放延遲 → 連線數飆升 → 雪崩。
對策:
pm.max_requests 定期回收進程request_terminate_timeout 防止卡死max_connections 預留緩衝mysql> SET GLOBAL max_connections = 2000;
[mysqld]
max_connections = 2000
# 配套調大
open_files_limit = 65535
table_open_cache = 4000
innodb_open_files = 4000
重啟生效。注意:每連線約消耗 256KB~2MB 記憶體,2000 連線需 1-4GB 額外 RAM。
# my.ini
[mysqld]
max_connections = 2000
重啟服務:net stop mysql && net start mysql
# sql/mysqld.cc
{"max_connections", ..., 2000, 1, 100000, ...} # 預設值改為 2000
# 重新編譯安裝
# 關鍵指標
SHOW STATUS LIKE 'Threads_connected'; -- 當前連線數
SHOW STATUS LIKE 'Max_used_connections'; -- 歷史峰值
SHOW STATUS LIKE 'Aborted_connects'; -- 被拒連線數
# Prometheus + Grafana 告警規則
mysql_global_status_threads_connected / mysql_global_variables_max_connections > 0.8
max_connections=151 太小,生產環境起步設 500-1000pconnect,改用短連線 + 連線池