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