mysql 的thread pool
什麼是thread pool
Mysql為一個客戶端連線分配一個執行緒,然而頻繁的連線請求會消耗大量的CPU資源,而執行緒池透過快取並重用執行緒可有效解決這一問題;
Thread pool plugin提供此功能,但其為商業版5.5.16所提供;
功能
1 重用thread stack,保證其一直位於cpu cache而不被踢出,可以更加高效的利用CPU cache;
2 在mysql伺服器端限制併發執行的執行緒數,減輕context switch的消耗,同時為OS排程器降壓;
3 並行事務過多會導致mutex競爭,而thread pool可透過限制並行的執行緒數避免這一點
原理
客戶端連線 à thread pool à 伺服器執行緒
對兩者進行對映,且對應關係不固定 ,伺服器執行緒負責執行從客戶端傳來的sql
基本單位為執行緒組,每組包含一個監聽執行緒和執行執行緒(有可能多個),前者負責接受客戶端傳來的sql,後者負責執行;
當接受到新sql時,如果此時沒有其他sql則由監聽執行緒立即執行,此期間該組暫時無監聽,如果sql執行時間過長,則執行緒池為其分配一個新的監聽執行緒;否則排隊等待;
每組包含兩個執行對列,low-priority和low-priority,優先執行high-priority佇列;
事務的第一個sql進入low-priority,而其後續sql則被放入high-priority;
非事務引擎或啟動auto_commit時,所有sql都被當作low-priority,如果innodb和Myisam混合使用,則優先執行innodb相關語句;
若sql在low-priority等待超過thread_pool_prio_kickup_timer,則被移到high-priority;
執行緒池包含若干執行緒組,每組包含一系列客戶端連線,採用round-robin分配機制;
理論上講,一個執行緒組一次只能由1個執行執行緒,但會根據實際情況自動調整:
每個組各有一個監聽thread,用於接收客戶端傳來的sql,;如果是立即執行則由監聽thread負責,此期間該組暫時無監聽thread,如果該sql執行時間過長,則執行緒池為其分配一個新的監聽thread;執行緒池有個後臺程式專門健康各組工作狀態;
執行緒池啟動時為每個組會建立一個監聽thread;
每個組包含兩個佇列,high
引數
Thread_pool_size:執行緒組數量,決定同時可執行的語句數;預設16,候選值1-64;5.5.16後才引入此值;對於Innodb,候選值範圍16-36;而MyISAM可降低為4-8;
Thread_pool_algorithm:管理執行緒池的演算法;0預設值,採用保守的低併發演算法;1採用相對激進演算法,增加併發性;5.5.16後才引入此值;
Thread_pool_high_priority_connection:0預設值,等待執行的語句使用低優先順序和高優先順序兩個佇列;1只使用高優先順序佇列;5.5.16後才引入此值;
Thread_pool_max_unused_threads:最大非活動執行緒數;0(預設值)無限制,最大4096;非活動執行緒可含有1個消費者執行緒和其他保留執行緒,其中消費者執行緒優先被喚醒;5.5.16後才引入此值;
Thread_pool_stall_limit:以10ms為單位,預設60ms範圍值4-600,每個語句的時間片大小,一旦耗完則掛起將CPU交於其他執行緒;5.5.16後才引入此值;
Thread_pool_prio_kickup_timer:low-priority移到high-priority所需等待時間,單位毫秒,預設為1000即1秒;
理論上講,伺服器支援的最大執行緒數=max_connections + thread_pool_size,即所有連線都處於執行模式,且每個執行緒組又有1個監聽thread
thread_cache_size定義重用執行緒的最大個數,當客戶端推出時其對應的thread保留以待後續的連線使用,但其無法控制並非執行的執行緒數
http://dev.mysql.com/doc/refman/5.5/en/thread-pool-plugin.html
為客戶端連線池,省去了建立執行緒的資源消耗,但無法控制執行緒爭用CPU和資料庫mutex;而thread pool用來控制伺服器不會過載;
Thread_cache_size:執行緒快取大小,當有客戶端退出時將其執行緒放入快取以供新的連線使用;對於連線繁忙的資料庫可提升效能;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-766302/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Hystrix Thread Pool 解析thread
- DUBBO Thread pool is EXHAUSTED!thread
- mysql併發執行緒控制之thread pool和優先佇列MySql執行緒thread佇列
- Percona 5.6 thread pool說明及使用thread
- Thread pool引數引起的程式連線資料庫響應慢thread資料庫
- 【案例】常駐查詢引發的thread pool 效能問題之二thread
- 【案例】常駐查詢引發的thread pool 效能問題之一thread
- MySQL 引擎特性:InnoDB Buffer PoolMySql
- 【Mysql】mysql快速預熱innodb_buffer_poolMySql
- kill_mysql_sleep_threadMySqlthread
- Oracle 的 KEEP pool, RECYCLE pool和DEFAULT poolOracle
- 帶你學會區分Scheduled Thread Pool Executor 與Timerthread
- mysql additional pool 指的是什麼?MySql
- MySQL innodb_buffer_pool_size 變數MySql變數
- MySQL入門--記憶體buffer poolMySql記憶體
- mysql 5.5 -- innodb buffer pool最佳化MySql
- MySQL怎麼緩解讀的壓力的?---buffer poolMySql
- mysql thread status 解釋說明MySqlthread
- MySQL中讀頁緩衝區buffer poolMySql
- MySQL監控InnoDB Buffer Pool命中率MySql
- 【Mysql】Mysql額外記憶體池 innodb_additional_mem_pool_sizeMySql記憶體
- MYSQL sync_relay_log對I/O thread的影響分析MySqlthread
- PHP mysql_thread_id 返回當前執行緒的 IDPHPMySqlthread執行緒
- 【Mysql】讀書筆記之--innodb_buffer_pool記憶體的管理MySql筆記記憶體
- Apache的Common-pool中的Object pool的疑問!多謝!ApacheObject
- 【Mysql】為MySQL增加執行緒記憶體監控 (MySQL Thread Memory Usage Monitor)MySql執行緒記憶體thread
- mysql引數之innodb_buffer_pool_size大小設定MySql
- MySQL服務端innodb_buffer_pool_size配置引數MySql服務端
- ORACLE記憶體管理 之五 SGA variable pool,shared_pool,large_pool,java_poolOracle記憶體Java
- php-fpm的poolPHP
- 分割槽表放入keep pool,recycle pool的問題及解析
- mysql point in time recovery using sql_thread SQL_Thread增量恢復binlog 要點MySqlthread
- MySQL案例-不同尋常的[ERROR]Can't create a new thread (errno 11)MySqlErrorthread
- MySQL5.7 線上調整Innodb_Buffer_Pool_size不用重啟mysql程式薦MySql
- 【MySQL 5.7參考手冊】8.14.2 General Thread StatesMySqlthread
- MySQL innodb buffer pool 命中率以及快取了哪些 InnoDB TableMySql快取
- MySQL 5.7新特性之動態修改innodb_buffer_pool大小MySql
- MYSQL INNODB innodb_thread_concurrency相關引數理解MySqlthread