一顆cpu核心同一時刻只能執行乙個執行緒,然後作業系統切換上下文,核心開始執行另乙個執行緒的**。給定一顆cpu核心,其順序執行a和b永遠比通過時間分片「同時」執行a和b要快。一旦執行緒的數量超過了cpu核心的數量,再增加執行緒數系統只會更慢,而不是更快。
連線數 = ((核心數 * 2) + 有效磁碟數)
公理:你需要乙個小連線池,和乙個充滿了等待連線的執行緒的佇列。
為什麼核心數 * 2?
因為執行緒總是在i/o上阻塞,我們可以讓執行緒/連線數比cpu核心多一些,這樣就能夠在同樣的時間內完成更多的工作。
為什麼執行緒會在i/o上阻塞?
磁碟讀寫操作的定址耗時和旋迴耗時,讀寫頭需要等待碟片上的目標資料「旋轉到位」才能進行操作。在這一時間段(「i/o等待」)內,執行緒是在 「阻塞」 著等待磁碟。
固態硬碟(ssd)和 機械硬碟(hdd) 執行緒/連線數的設定區別
ssd不需要定址,也沒有旋轉的碟片,所以更少的執行緒【更接近於cpu核心數】會發揮出更高的效能。只有當阻塞創造了更多的執行機會時,更多的執行緒數才能發揮出更好的效能。
連線池的大小最終與系統特性相關
比如乙個混合了長事務和短事務的系統,通常是任何連線池都難以進行調優的。最好的辦法是建立兩個連線池,乙個服務於長事務,乙個服務於短事務。
再例如乙個系統執行乙個任務佇列,只允許一定數量的任務同時執行,此時併發任務數應該去適應連線池連線數,而不是反過來。
資料庫連線池的大小
基本上來說,大部分專案都需要跟資料庫做互動,那麼資料庫連線池的大小設定成多大合適呢?一些同學可能會很隨意的告訴你 沒關係,盡量設定的大些,比如設定成200,這樣資料庫效能會高寫,吞吐量也會大些。真的是這樣嗎?關於資料庫連線池大小的設定,每乙個開發都有可能在這一環節掉進坑里。事實上大部分程式設計師可能...
資料庫連線池 Redis連線池
基本原理 在內部物件池中,維護一定數量的資料庫連線,並對外暴露資料庫連線的獲取和返回方法。如外部使用者可通過getconnection方法獲取資料庫連線,使用完畢後再通過releaseconnection方法將連線返回,注意此時的連線並沒有關閉,而是由連線池管理器 並為下一次使用做好準備。2.作用 ...
資料庫連線池
實現資料連線池,讓系統有更高有執行效率 using system using system.data using system.data.sqlclient using system.collections using system.threading public class dataaccess...