线程池的开源实现(mariadb和percona版本)
生活随笔
收集整理的這篇文章主要介紹了
线程池的开源实现(mariadb和percona版本)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
一、"Thread pool in MariaDB 5.5"線程池解決的問題: 傳統mysql使用一個線程處理一個客戶端連接,如果許多的并發用戶,將使性能下降。因為大量的線程將引起上下文交換,cpu緩存失效,增加鎖爭用。一個理想的解決方案是減少上下文交換,維持低數量的線程數。同時為了充分利用CPU,理想的應該維持每個CPU處理一個活動線程。
mariadb 5.1線程池是一個靜態的線程數。 mariadb 5.5實現以下情況: 1、動態池,隨需求增加和減少; 2、 維護線程池本身只需 最小的開銷; 3、充分利用底層操作系統的能力,如果系統支持,使用原生的OS線程池,使用更好的I/O復用方法; 4、限制線程資源利用(thread_pool_max_threads);
什么時候使用線程池: 查詢相對短,CPU負載型(如OLTP)。
以下情況使用線程池效益不太好: 1、非常突發的工作負載(長期不活躍混合許多 短期 高活動的 用戶 ),同時不能忍受延時; 2、許多并發,長,不屈服的查詢,如數據倉庫; 3、總是依賴簡單查詢很快;
啟用線程池: 添加thread_handling=pool-of-threads到my.cnf文件,windows默認開啟
線程池變量: thread_pool_size:多少個線程組,默認為處理器個數。意味著能同時運行的線程數。劃分所有客戶端連接到組,每個組一個運行線程。 thread_pool_stall_limit:一個運行線程被認為是失速的毫秒數。默認是500,如果到達時間,線程池將喚醒或建立一個另外的線程。如果線程數到達thread_pool_max_threads,將不再創建進程。 thread_pool_max_threads:線程池中最大線程數,如果到達該值,將不創建新線程,默認為500; thread_pool_idle_timeout:一個空閑工作線程退出之前等待秒數,默認為60, thread_pool_oversubscribe:內部參數,默認3。高的值,更多線程能同時運行。低的值將導致更多的睡眠和喚醒。
監控線程池活動: threadpool_threads:池中的線程數; threadpool_idle_threads:池中不活躍線程數量,空閑可能是等待新的工作,或者因磁盤io、行或表鎖等。
Mariadb線程池與Mysql企業版線程池: 相似之處: 1、劃分客戶端連接到組,thread_pool_size控制線程池組的大小; 2、使用相同的方式檢測線程是否變速,使用同樣的參數thread_pool_stall_limit進行控制,mariadb單位為毫秒,mysql企業版為10ms單位。
不同之處: 1、windows實現完全不同,mariadb使用原生windows線程池; 2、mariadb使用每個操作系統更有效的I/O復用功能,如linux使用epoll; 3、mariadb沒有限制并發事務; 4、mariadb線程池是內建功能,而不是插件;
為了避免所有工作線程都在忙,因行/表鎖,新的連接不能創建,不能登錄到mysql服務,找出問題所在,并kill掉查詢,mysqld提供兩個新的選項: --extra-port:默認為0,不為0時,能連接max_connections數量的正常線程和1個額外的SUPER用戶通過extra-port TCP/IP端口,使用傳統的一個連接對應一個線程方式。 --extra-max-connections:默認1,支持一個額外的連接。
連接方式:mysql --port='number-of-extra-port' --protocol=tcp
當使用線程池時,thread_cache_size變量不使用,Threads_cached狀態變量將為0。
二、"Thread Pool" 從5.5.29-30.0開始支持線程池,percona線程池也是內建版本,非插件,參考mariadb線程池實現方式,以及進行了優化,添加了優先級隊列,與mysql官方不同的是沒有限制并發事務。
優先連接調度: 雖然線程池限制了并發查詢數量,而打開的事務可能很高,大量的打開事務將影響當前運行的查詢, 使用thread_pool_high_prio_tickets控制高優先級隊列,給每個連接分配多少票,以進入到高優先級隊列。每次從高優先級隊列取新連接處理,如果高優先級隊列為空時,才從普通隊列取。
可以減少打開的事務,有益于短事務快速提交,默認線程池總是將已經開始的事務放到高優先級隊列。如果值為0,所有連接將總是放到普通隊列。
低優先級隊列限制: 通過thread_pool_max_threads限制線程池中活動和等待線程的數量,不啟動新事務和創建新線程,直到已經開始處理事務,以免過多的活動線程達到超額,影響服務器性能。
特殊變量: thread_pool_high_prio_mode:提供細粒度的控制高優先級隊列,支持全局和每個連接。默認值 transactions,僅當語句從已經開始的事務可能進入到高優先級隊列,并依賴于當前連接擁有的高優先級票。statements,所有獨立的語句進入到高優先級隊列,不管連接事務狀態和 擁有的高優先級票;none,關閉高優先級隊列,如監控連接,以免影響其他連接的性能。 thread_pool_high_prio_tickets:控制高優先級隊列行為,每個新連接分配這么多的高優先級票,設置為0關閉高優先級隊列。
參考: 1、"Thread pool in MariaDB 5.5": https://mariadb.com/kb/en/mariadb/mariadb-documentation/optimization-and-tuning/buffers-caches-and-threads/thread-pool/threadpool-in-55/ 2、"Thread Pool": http://www.percona.com/doc/percona-server/5.5/performance/threadpool.html
來自為知筆記(Wiz)
轉載于:https://my.oschina.net/anthonyyau/blog/287342
總結
以上是生活随笔為你收集整理的线程池的开源实现(mariadb和percona版本)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity3D视图介绍
- 下一篇: 互联网大厂与编程语言