Percona 5.6 thread pool說明及使用

84223932發表於2014-05-28
本文主要簡單介紹一下thread pool,因為目前網上的文章都只是針對thread pool的原理說明,沒有實際的使用示範。因此本會針對thread pool的使用做一些說明。

歡迎轉載,請註明作者、出處。
作者:張正
blog:http://space.itpub.net/26355921 
QQ:176036317
如有疑問,歡迎聯絡。


Thread pool是什麼:

MySQL是每個連線上來都要建立一個執行緒來執行語句。這樣每一個新的連線進來即會建立一個新的執行緒,這種動作對MySQL本身壓力比較大。Threadpool是提供一種執行緒代理的模型執行每個連線的語句。而MySQL內部維護一個可能接受的執行緒總數,減少執行緒太多在CPU切換等方面的壓力。

使用Threadpool的好處:

1.使用執行緒代理的模型在連線數已知可控的情況下,提前建立好過執行緒並利用作業系統的threadpool技術維護,能減少很多開銷
2.儘可能的使用作業系統的執行緒方面的管理,把執行緒管理開銷降到最低
3. 利用thread_pool_max_threads控制資源使用

使用方法:

目前支援threadpool的有MariaDB, Percona, 官方MySQL 5.5的一個收費plugin功能。percona與mariadb配置啟用:

在my.cnf 中新增引數:

[mysqld]
 
#thread pool
 
thread_handling=pool-of-threads
thread_pool_max_threads=100       #設定thread pool執行緒的上限值(同時running的最大執行緒數為100)
thread_pool_size=50               #thread pool中執行緒數的下限值

mysql> show variables like 'thread%';
+-------------------------------+-----------------+
| Variable_name                 |      Value      |
+-------------------------------+-----------------+
| thread_cache_size             |         28      |
| thread_concurrency            |         10      |
| 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       |    120          |
| thread_pool_oversubscribe     |      3          |
| thread_pool_size              |     50          |
| thread_pool_stall_limit       |    500          |
| thread_stack                  | 262144          |
| thread_statistics             | OFF             |
+-------------------------------+-----------------+

Thread_pool_stall_limit:以10ms為單位,預設60ms範圍值4-600,每個語句的時間片大小,一旦耗完則掛起將CPU交於其他執行緒

空閒時:
mysql> show global status like 'thread%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Threadpool_idle_threads | 51    |
| Threadpool_threads      | 52    |
| Threads_cached          | 0     |
| Threads_connected       | 22    |
| Threads_created         | 148   |
| Threads_running         | 1     |
+-------------------------+-------+
6 rows in set (0.00 sec)
系統中22個執行緒數(Threads_connected)為zabbix的連線,雖然目前總連線數為22,但是thread pool中的執行緒數(Threadpool_threads)為52。
該值的最小值決定於引數thread_pool_size 的值。
目前running執行緒數為1,空閒執行緒數為 51.


sysbench增加連線數:
使用sysbench建立1000個執行緒進行讀寫操作,同時還有22個zabbix的連線,共1022個連線:
sysbench --num-threads=1000 --test=oltp --mysql-user=root --mysql-password=root --mysql-table-engine=innodb  --init-rng=on --oltp-table-size=19390000 --max-time=$RT --max-requests=20000 --mysql-db=test --mysql-socket=/var/lib/mysql/mysql.sock run > sysbench.log

mysql> show global status like 'thread%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Threadpool_idle_threads | 46    |     --&gt目前thread pool中還剩餘46個空閒thread
| Threadpool_threads      | 120   |     --&gtthread pool中允許同時running的最大執行緒數
| Threads_cached          | 0     |
| Threads_connected       | 1022  |     --&gt目前資料庫一共有1022個連線
| Threads_created         | 476   |
| Threads_running         | 87    |     --&gt目前正在執行的執行緒數為87
+-------------------------+-------+
6 rows in set (0.37 sec)

資料庫中 Threadpool_idle_threads(46) + Threads_running(87) 之和(133) 大致是與 Threadpool_threads(120) 的值相等的,
而 Threadpool_threads 的最大值是受限於 引數thread_pool_max_threads的值。

系統中總共連線數有1022,而running的執行緒數只有87,還有46空閒,是因為作業系統的CPU已經耗盡。








來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26355921/viewspace-1171800/,如需轉載,請註明出處,否則將追究法律責任。

相關文章