MySQL線程池

来源:http://www.cnblogs.com/ivictor/archive/2016/08/03/5733329.html
-Advertisement-
Play Games

MySQL線程池只在Percona,MariaDB,Oracle MySQL企業版中提供。Oracle MySQL社區版並不提供。 在傳統方式下,MySQL線程調度方式有兩種:每個連接一個線程(one-thread-per-connection)和所有連接一個線程(no-threads)。在實際生產 ...


MySQL線程池只在Percona,MariaDB,Oracle MySQL企業版中提供。Oracle MySQL社區版並不提供。

在傳統方式下,MySQL線程調度方式有兩種:每個連接一個線程(one-thread-per-connection)和所有連接一個線程(no-threads)。在實際生產中,一般用的是前者。即每當有一個客戶端連接到MySQL伺服器,MySQL伺服器都會為該客戶端創建一個單獨的線程。連接數越多,則相應的線程會越多。

如果大部分線程處於空閑狀態,則不會對伺服器的性能造成很大的影響。但如果同時執行的線程太多,會導致操作系統頻繁的上下文切換。

引入線程池的目的,就是為了減少同時運行的線程的數量,降低上下文切換的次數。

線程池是MariaDB最先實現的,有兩種實現方式,分別對應Windows和Unix操作系統。其中,Windows系統上是直接利用操作系統的本地緩衝池功能,Unix系統上則是自己實現的。這導致兩個操作系統上的系統變數有所不同。

 

下麵,基於Percona 5.6.31版本看看線程池的相關參數

thread_handling

預設是one-thread-per-connection,如果要使用連接池功能,則必須設置為pool-of-threads。

 

thread_pool_size

用於設置線程池中線程組的個數,預設為伺服器CPU的核心數。實現分組的目的是為了把每個分組對應到每個CPU核心上,這樣在同一時間點,每個分組可調用1個線程進行執行。

 

thread_pool_max_threads

控制線程池的最大線程數,若該值為1000,代表線程池中所能創建的最大線程數不能超過1000。

This variable can be used to limit the maximum number of threads in the pool. Once this number is reached no new threads will be created.

 

thread_pool_oversubscribe

用於控制單個CPU核心在同一時間活躍的線程數。類似於一種“超頻”的概念

The higher the value of this parameter the more threads can be run at the same time, if the values is lower than 3 it could lead to more sleeps and wake-ups

 

thread_pool_stall_limit

線程池中無可用線程時,thread_pool_stall_limit決定等待多久後創建新線程,單位為毫秒。預設是500。

在合適範圍內,該值越大,MySQL伺服器的整體處理性能就越好,因為較少數量的線程,會降低對於系統資源的徵用。但是,並不是越大越好,因為該值越大,新線程的創建將等待更長的時間,用戶的查詢延遲就會越明顯。

The number of milliseconds before a running thread is considered stalled. When this limit is reached thread pool will wake up or create another thread. This is being used to prevent a long-running query from monopolizing the pool.

 

thread_pool_idle_timeout

設置空閑線程銷毀前的等待時間,單位為秒,預設是60。

用戶可以根據自己的業務場景來調整該參數的值,如果設置得太短,會導致線程頻繁的銷毀與創建,如果設置的太長,則會導致線程池中的線程數長時間不會下降。

This variable can be used to limit the time an idle thread should wait before exiting.

 

extra_port

用於設置MySQL服務埠之外的埠,供管理員管理伺服器。

This variable can be used to specify additional port Percona Server will listen on. This can be used in case no new connections can be established due to all worker threads being busy or being locked when pool-of-threads feature is enabled.

 

extra_max_connections

用於設置extra_port埠允許的最大連接數,通過extra_port埠創建的連接,採用的是one-thread-per-connection的方式

This variable can be used to specify the maximum allowed number of connections plus one extra SUPER users connection on the extra_port. This can be used with the extra_port variable to access the server in case no new connections can be established due to all worker threads being busy or being locked when pool-of-threads feature is enabled。

 

除此之外,Percona還新增了兩個參數用於實現優先順序隊列。

thread_pool_high_prio_mode

線程池分組內的待處理任務會放到任務隊列中,等待worker線程處理。

每個分組有兩個隊列:高優先順序隊列和普通隊列,worker線程先從高優先隊列取event處理,只有當高優先隊列為空時才從普通隊列取event處理。

通過優先順序隊列,可以讓已經開啟的事務或短事務得到優先處理,及時提交釋放鎖等資源。

該參數可設置三種模式:

transactions:預設的,只有一個已經開啟了事務的SQL,並且thread_pool_high_prio_tickets不為0,才會進入到高優先順序隊列中,每個連接在thread_pool_high_prio_tickets次被放到優先隊列中後,會移到普通隊列中。

statements:單獨的SQL總是進入高優先順序隊列

none:禁用高優先順序隊列功能,所有的連接都放到普通隊列中處理。

 

thread_pool_high_prio_tickets

給每個新的連接授予的tickets大小

This variable controls the high priority queue policy. Each new connection is assigned this many tickets to enter the high priority queue. Setting this variable to 0 will disable the high priority queue.預設為4294967295。

 

線程池的適用場景:

適用於有大量短查詢的業務場景

在該場景下,每個連接一個線程,過多的連接數很容易達到連接數的最大值,同時,過多的活躍線程會導致頻繁的上下文切換。此時,可使用線程池,因為是短查詢,不會有某個連接長時間占用線程池中的線程,所以幾乎不會影響客戶端請求的響應時間,並且,隨著連接數的增加,線程池中的線程數被控制都在一定範圍內,減輕了系統的壓力。

在有大量長查詢的業務場景下不適合使用線程池

在該場景下,長查詢可能會占據線程池的所有線程,導致線程池出現效率低效的情況,客戶端設置不能進行連接。

  

參考:

1. 深入理解MariaDB與MySQL

2. MariaDB原理與實現

3. http://www.tuicool.com/articles/7NveimQ

4. https://www.percona.com/blog/2013/03/16/simcity-outages-traffic-control-and-thread-pool-for-mysql/

5. http://mysql.taobao.org/monthly/2016/02/09/

6. http://www.cnblogs.com/cchust/p/4510039.html

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近項目中經常有遇到從伺服器請求的數據是null的情況,這種情況下如果用[dic objectForKey:@"key"]方法,程式會發生崩潰現象,因為項目是以前的老項目,而且有太多個這樣的方法,於是想起了前幾天的runtime知識,嘗試簡單的實現了一個交換方法。 1.首先實現了一個字典的分類。 2 ...
  • 1:iOS SEL的簡單總結 SEL就是對方法的一種包裝。包裝的SEL類型數據它對應相應的方法地址,找到方法地址就可以調用方法 a.方法的存儲位置 在記憶體中每個類的方法都存儲在類對象中 每個方法都有一個與之對應的SEL類型的數據 根據一個SEL數據就可以找到對應的方法地址,進而調用方法 SEL類型的 ...
  • Mobile What to Expect From Swift 3 Web A practical security guide for web developers Gulp Succinctly – free book Running Node.js on Linux With systemd... ...
  • 文件下載主要代碼也不多,使用原生的DownloadManage來實現該功能: AndroidManifest中添加許可權 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:na ...
  • 寫的例子比較簡單,是用xutils3.0來進行下載項目更新 1.先通過網路請求,判斷版本是否要更新 2.若要更新,則彈出一個彈窗,我用的是系統自帶的Dialog,將下載的版本號及下載的內容提示展示出來 3.當用戶點擊下載時,開始下載,下載時展示一個水平的進度條 4.下載完成後,進度條消失,調用系統安 ...
  • NSDate * senddate=[NSDate date]; NSDateFormatter *dateformatter=[[NSDateFormatter alloc] init]; [dateformatter setDateFormat:@"YYYYMMdd"]; NSString * ...
  • ...
  • 原來Activity和Fragment中實現同樣功能的上千行代碼竟然能簡化成100多行!!! 而且如果是Fragment,有一個XListView預設佈局,連layout都不再需要寫了!!! ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...