Thread pool引數引起的程式連線資料庫響應慢
資料庫版本:percona-mysql 5.6.16
在很長一段時間,都會出現程式連線資料庫,出現響應慢的情況,正常在幾到幾十毫秒之間,但是偶爾會出現上百毫秒的情況;
開始由於開發重新設定並調整過程式連線池,一直懷疑是連線池的問題,但是問題依舊;
因為使用的版本是percona-mysql 5.6.16 並且使用了資料庫連線池。
Thread Pool根據引數thread_pool_size被分為若干個group,每個group維護client 發起的 connections,當MySQL建立 connection 時,
MySQL 根據connection的thread id 對thread_pool_size取模,將connection 發起的sql 語句分配到對應的group。每個group的最大worker
數量為thread_pool_oversubscribe+1。若worker達到最大數量後還是不足以處理回話請求,則連線在本group上等待,導致sql 語句的rt 增大;
因此將thread_pool_oversubscribe引數調大,但是問題依舊;
檢查thread_cache_size,伺服器記憶體大小為64G,thread_cache_size=128;
每建立一個連線,都需要一個執行緒來與之匹配,此引數用來快取空閒的執行緒,以至不被銷燬,如果執行緒快取中有空閒執行緒,這時候如果建立新連線,MYSQL就會很快的響應連線請求;
show status like '%thread%';
Variable_name Value
Threads_cached 0
Threads_connected 219
Threads_created 655068
Threads_running 48
使用 show status檢視當前mysql連線情況:
SHOW STATUS WHERE Variable_name LIKE '%Thread%';
Threads_cached :代表當前此時此刻執行緒快取中有多少空閒執行緒。
Threads_connected :代表當前已建立連線的數量,因為一個連線就需要一個執行緒,所以也可以看成當前被使用的執行緒數。
Threads_created :代表從最近一次服務啟動,已建立執行緒的數量。
Threads_running :代表當前啟用的(非睡眠狀態)執行緒數。並不是代表正在使用的執行緒數,有時候連線已建立,但是連線處於sleep狀態,這裡相對應的執行緒也是sleep狀態。
最好將thread_cache_size設定成與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 不斷增大,那麼當前thread_cache_size的值設定要改大,改到 Threads_connected 值左右,
再結合實體記憶體 1G —> 8;2G —> 16; 3G —> 32; >3G —> 64 二個情況綜合考慮一下值,將thread_cache_size改為512;
註譯:
Threads_cached :代表當前此時此刻執行緒快取中有多少空閒執行緒。
Threads_connected :代表當前已建立連線的數量,因為一個連線就需要一個執行緒,所以也可以看成當前被使用的執行緒數。
Threads_created :代表從最近一次服務啟動,已建立執行緒的數量。
Threads_running :代表當前啟用的(非睡眠狀態)執行緒數。並不是代表正在使用的執行緒數,有時候連線已建立,但是連線處於sleep狀態,這裡相對應的執行緒也是sleep狀態。
修改thread_cache_size為512後,重新測試程式連線資料庫響應時間,速度極快,不再出現程式連線資料庫響應慢的情況!
在很長一段時間,都會出現程式連線資料庫,出現響應慢的情況,正常在幾到幾十毫秒之間,但是偶爾會出現上百毫秒的情況;
開始由於開發重新設定並調整過程式連線池,一直懷疑是連線池的問題,但是問題依舊;
因為使用的版本是percona-mysql 5.6.16 並且使用了資料庫連線池。
Thread Pool根據引數thread_pool_size被分為若干個group,每個group維護client 發起的 connections,當MySQL建立 connection 時,
MySQL 根據connection的thread id 對thread_pool_size取模,將connection 發起的sql 語句分配到對應的group。每個group的最大worker
數量為thread_pool_oversubscribe+1。若worker達到最大數量後還是不足以處理回話請求,則連線在本group上等待,導致sql 語句的rt 增大;
因此將thread_pool_oversubscribe引數調大,但是問題依舊;
檢查thread_cache_size,伺服器記憶體大小為64G,thread_cache_size=128;
每建立一個連線,都需要一個執行緒來與之匹配,此引數用來快取空閒的執行緒,以至不被銷燬,如果執行緒快取中有空閒執行緒,這時候如果建立新連線,MYSQL就會很快的響應連線請求;
show status like '%thread%';
Variable_name Value
Threads_cached 0
Threads_connected 219
Threads_created 655068
Threads_running 48
使用 show status檢視當前mysql連線情況:
SHOW STATUS WHERE Variable_name LIKE '%Thread%';
Threads_cached :代表當前此時此刻執行緒快取中有多少空閒執行緒。
Threads_connected :代表當前已建立連線的數量,因為一個連線就需要一個執行緒,所以也可以看成當前被使用的執行緒數。
Threads_created :代表從最近一次服務啟動,已建立執行緒的數量。
Threads_running :代表當前啟用的(非睡眠狀態)執行緒數。並不是代表正在使用的執行緒數,有時候連線已建立,但是連線處於sleep狀態,這裡相對應的執行緒也是sleep狀態。
最好將thread_cache_size設定成與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 不斷增大,那麼當前thread_cache_size的值設定要改大,改到 Threads_connected 值左右,
再結合實體記憶體 1G —> 8;2G —> 16; 3G —> 32; >3G —> 64 二個情況綜合考慮一下值,將thread_cache_size改為512;
註譯:
Threads_cached :代表當前此時此刻執行緒快取中有多少空閒執行緒。
Threads_connected :代表當前已建立連線的數量,因為一個連線就需要一個執行緒,所以也可以看成當前被使用的執行緒數。
Threads_created :代表從最近一次服務啟動,已建立執行緒的數量。
Threads_running :代表當前啟用的(非睡眠狀態)執行緒數。並不是代表正在使用的執行緒數,有時候連線已建立,但是連線處於sleep狀態,這裡相對應的執行緒也是sleep狀態。
修改thread_cache_size為512後,重新測試程式連線資料庫響應時間,速度極快,不再出現程式連線資料庫響應慢的情況!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28939273/viewspace-2148548/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料庫連線非常慢資料庫
- 資料庫連線緩慢資料庫
- 利用weblogic的POOL(連線池)連線資料庫 (轉)Web資料庫
- MySql連線資料庫常用引數及程式碼示例MySql資料庫
- JDBC連線資料庫時,Oracle9i的連線引數配置JDBC資料庫Oracle
- 資料庫的連線數資料庫
- 一次資料庫響應慢分析資料庫
- 資料庫響應慢問題處理資料庫
- laravel 5.8 連線資料庫庫查詢 資料 速度慢,使用mysql 直接查詢響應就快,什麼原因呢?Laravel資料庫MySql
- 一次資料庫響應緩慢的問題排查資料庫
- oracle資料庫修改連線數Oracle資料庫
- remote_os_authent引數引起的系統無法連線故障REM
- (轉)PHP連線資料庫之PHP連線MYSQL資料庫程式碼PHP資料庫MySql
- PHP擴充套件資料庫連線引數說明詳解PHP套件資料庫
- kettle通過命令列引數傳遞資料庫連線資訊命令列資料庫
- jmap檢視java程式佔用的資料庫連線數Java資料庫
- 資料庫的連線資料庫
- dg庫日誌應用慢引數調整
- 用Navicat連線資料庫-資料庫連線(MySQL演示)資料庫MySql
- SQL 記錄資料庫連線數資訊SQL資料庫
- 連線資料庫資料庫
- 資料庫連線資料庫
- Oracle資料庫非同步IO導致查詢響應緩慢Oracle資料庫非同步
- 資料庫連線(2) - 為什麼C3P0連線池那麼慢資料庫
- 各種連線資料庫的連線字串資料庫字串
- 連線資料庫的疑惑資料庫
- 資料庫的連線串資料庫
- 應用程式偶發連線不上資料庫的排查案例資料庫
- JDBC連線引數JDBC
- mysql 的thread poolMySqlthread
- 域名解析導致資料庫連線緩慢(hosts :files dns)資料庫DNS
- Tomcat DBCP(Database Connection Pool) 資料庫連線池入門介紹TomcatDatabase資料庫
- 影響資料庫效能與穩定性的幾個重要引數資料庫
- 故障分析 | 血的教訓-由慢查詢引發的備份等待導致資料庫連線打滿資料庫
- 【Java面試】資料庫連線池有什麼用?它有哪些關鍵引數?Java面試資料庫
- ssh連線反應慢問題
- 資料庫連線池到底應該設多大?資料庫
- 幾種連線資料庫的OLEDB驅動程式資料庫