現象:Threads_created 持續暴增
mysql> SHOW GLOBAL STATUS LIKE 'Thread%';
+-------------------+-----------+
| Variable_name | Value |
+-------------------+-----------+
| Threads_cached | 26 |
| Threads_connected | 510 |
| Threads_created | 35168165 | -- 極大,說明頻繁創建銷毀線程
| Threads_running | 459 |
+-------------------+-----------+
mysql> SHOW VARIABLES LIKE 'thread_cache_size';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| thread_cache_size | 32 | -- 明顯偏小
+-------------------+-------+
原理
- 客戶端斷開連線時,若緩存未滿,線程放入緩存供下次複用。
Threads_created 累計創建線程數,**持續快速增長 = 緩存不足 = 高頻創建銷毀 = CPU/記憶體壓力大**。
Threads_cached 當前閒置緩存線程數,應接近 thread_cache_size 上限。
配置建議(按物理記憶體)
| 實體記憶體 | 建議 thread_cache_size |
| 1 GB | 8 |
| 2 GB | 16 |
| 3 GB | 32 |
| 4 GB+ | 64~128 |
| 高並發 (連線數>1000) | 128~256 |
動態調整(無需重啟)
SET GLOBAL thread_cache_size = 128;
-- 永久生效請同步寫入 my.cnf [mysqld] 區段
驗證效果
- 調整後觀察一段時間(如 1 小時)。
Threads_created 增長速度應明顯放緩(接近 0 增長)。
Threads_cached 穩定在設定值附近。
避坑提醒
- 設太大無益處:閒置線程佔用記憶體(每線程 ~256KB~1MB),超過實際並發峰值無意義。
- 連線池才是正解:應用層使用連線池(HikariCP、Druid、PHP mysqli 持久連線)才能根治頻繁建連,
thread_cache_size 只是服務端緩衝。
- 監控指標:納入 Prometheus/Grafana 監控
mysql_global_status_threads_created 速率,告警閾值如 > 10/s 持續 5 分鐘。