萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL thread_cache_size 調優實戰:從 Threads_created 爆增看線程緩存配置

現象: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 GB8
2 GB16
3 GB32
4 GB+64~128
高並發 (連線數>1000)128~256

動態調整(無需重啟)

SET GLOBAL thread_cache_size = 128;
-- 永久生效請同步寫入 my.cnf [mysqld] 區段

驗證效果

  1. 調整後觀察一段時間(如 1 小時)。
  2. Threads_created 增長速度應明顯放緩(接近 0 增長)。
  3. Threads_cached 穩定在設定值附近。

避坑提醒

  • 設太大無益處:閒置線程佔用記憶體(每線程 ~256KB~1MB),超過實際並發峰值無意義。
  • 連線池才是正解:應用層使用連線池(HikariCP、Druid、PHP mysqli 持久連線)才能根治頻繁建連,thread_cache_size 只是服務端緩衝。
  • 監控指標:納入 Prometheus/Grafana 監控 mysql_global_status_threads_created 速率,告警閾值如 > 10/s 持續 5 分鐘。
copyright © 萬盛學電腦網 all rights reserved