程序連接數(shù)據(jù)庫響應(yīng)慢!是Thread pool參數(shù)搗的鬼嗎?
數(shù)據(jù)庫版本:percona-mysql 5.6.16
在很長一段時間,都會出現(xiàn)程序連接數(shù)據(jù)庫,出現(xiàn)響應(yīng)慢的情況,正常在幾到幾十毫秒之間,但是偶爾會出現(xiàn)上百毫秒的情況;
開始由于開發(fā)重新設(shè)置并調(diào)整過程序連接池,一直懷疑是連接池的問題,但是問題依舊;
因為使用的版本是 percona-mysql 5.6.16 并且使用了數(shù)據(jù)庫連接池。
Thread Pool 根據(jù)參數(shù) thread_pool_size 被分為若干個 group, 每個 group 維護 client 發(fā)起的 connections, 當(dāng) MySQL 建立 connection 時,
MySQL 根據(jù) connection 的 thread id 對 thread_pool_size 取模, 將 connection 發(fā)起的 sql 語句分配到對應(yīng)的 group。每個 group 的*** worker
數(shù)量為 thread_pool_oversubscribe+1。若 worker 達(dá)到***數(shù)量后還是不足以處理回話請求, 則連接在本 group 上等待, 導(dǎo)致 sql 語句的 rt 增大;
因此將 thread_pool_oversubscribe 參數(shù)調(diào)大,但是問題依舊;
檢查 thread_cache_size,服務(wù)器內(nèi)存大小為 64G,thread_cache_size=128;
每建立一個連接,都需要一個線程來與之匹配,此參數(shù)用來緩存空閑的線程,以至不被銷毀,如果線程緩存中有空閑線程,這時候如果建立新連接,MYSQL 就會很快的響應(yīng)連接請求;
- show status like '%thread%';
- Variable_name Value
- Threads_cached 0
- Threads_connected 219
- Threads_created 655068
- Threads_running 48
使用 show status 查看當(dāng)前 mysql 連接情況:
- SHOW STATUS WHERE Variable_name LIKE '%Thread%';
Threads_cached : 代表當(dāng)前此時此刻線程緩存中有多少空閑線程。
Threads_connected : 代表當(dāng)前已建立連接的數(shù)量,因為一個連接就需要一個線程,所以也可以看成當(dāng)前被使用的線程數(shù)。
Threads_created : 代表從最近一次服務(wù)啟動,已創(chuàng)建線程的數(shù)量。
Threads_running : 代表當(dāng)前激活的(非睡眠狀態(tài))線程數(shù)。并不是代表正在使用的線程數(shù),有時候連接已建立,但是連接處于 sleep 狀態(tài),這里相對應(yīng)的線程也是 sleep 狀態(tài)。
***將 thread_cache_size 設(shè)置成與 threads_connected 一樣。
- show variables like '%thread%';
- +-----------------------------------------+-----------------+
- | Variable_name | Value |
- +-----------------------------------------+-----------------+
- | innodb_purge_threads | 1 |
- | innodb_read_io_threads | 4 |
- | innodb_thread_concurrency | 0 |
- | innodb_thread_sleep_delay | 10000 |
- | innodb_write_io_threads | 4 |
- | max_delayed_threads | 20 |
- | max_insert_delayed_threads | 20 |
- | myisam_repair_threads | 1 |
- | performance_schema_max_thread_classes | 50 |
- | performance_schema_max_thread_instances | -1 |
- | pseudo_thread_id | 8735851 |
- | thread_cache_size | 128 |
- | thread_concurrency | 24 |
- | thread_handling | pool-of-threads |
- | thread_pool_high_prio_mode | transactions |
- | thread_pool_high_prio_tickets | 4294967295 |
- | thread_pool_idle_timeout | 60 |
- | thread_pool_max_threads | 100000 |
- | thread_pool_oversubscribe | 40 |
- | thread_pool_size | 12 |
- | thread_pool_stall_limit | 500 |
- | thread_stack | 262144 |
- | thread_statistics | OFF |
- +-----------------------------------------+-----------------+
可以不斷刷新,如果 Threads_cached = 0 且 Threads_created 不斷增大,那么當(dāng)前 thread_cache_size 的值設(shè)置要改大,改到 Threads_connected 值左右,
再結(jié)合物理內(nèi)存 1G —> 8;2G —> 16; 3G —> 32; >3G —> 64 二個情況綜合考慮一下值, 將 thread_cache_size 改為 512;
注譯:
Threads_cached : 代表當(dāng)前此時此刻線程緩存中有多少空閑線程。
Threads_connected : 代表當(dāng)前已建立連接的數(shù)量,因為一個連接就需要一個線程,所以也可以看成當(dāng)前被使用的線程數(shù)。
Threads_created : 代表從最近一次服務(wù)啟動,已創(chuàng)建線程的數(shù)量。
Threads_running : 代表當(dāng)前激活的(非睡眠狀態(tài))線程數(shù)。并不是代表正在使用的線程數(shù),有時候連接已建立,但是連接處于 sleep 狀態(tài),這里相對應(yīng)的線程也是 sleep 狀態(tài)。
修改 thread_cache_size 為 512 后,重新測試程序連接數(shù)據(jù)庫響應(yīng)時間,速度極快,不再出現(xiàn)程序連接數(shù)據(jù)庫響應(yīng)慢的情況!