<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 數據庫連接池數量設置為多少合適? 當我們在尋找數據庫的性能瓶頸時,大致可歸為三類: * CPU * 磁盤 IO * 網絡 IO 也許你會說,還有內存這一因素?內存的確是需要考慮的,但是比起磁盤IO和網絡IO,稍顯微不足道,這里就不加了。 假設我們不考慮磁盤 IO 和網絡 IO,就很好定論了,在一個 8 核的服務器上,數據庫連接數/線程數設置為 8 能夠提供最優的性能,如果再增加連接數,反而會因為上下文切換導致性能下降。 大家都知道,數據庫通常把數據存儲在磁盤上,而磁盤呢,通常是由一些旋轉著的金屬碟片和一個裝在步進馬達上的讀寫頭組成的。讀/寫頭同一時刻只能出現在一個位置,當它需要再次執行讀寫操作時,它必須“尋址”到另外一個位置才能完成任務。所以呢?這里就有了尋址的耗時,此外還有旋轉耗時,讀寫頭需要等待磁盤碟片上的目標數據“旋轉到位”才能進行讀寫操作。使用緩存當然是能夠提升性能的,但上述原理仍然適用。 在這段("I/O等待")時間內,線程是處于“阻塞”等待狀態,也就是說沒干啥正事!此時操作系統可以將這個空閑的CPU 核心用于服務其他線程。 當你的線程處理的是 I/O 密集型業務時,便可以讓線程/連接數設置的比 CPU核心大一些,這樣就能夠在同樣的時間內,完成更多的工作,提升吞吐量 大小設置成多少合適呢? 這要取決于磁盤,如果你使用的是 SSD 固態硬盤,它不需要尋址,也不需要旋轉碟片。打住打住!!!你千萬可別理所當然的認為:“既然SSD速度更快,我們把線程數的大小設置的大些吧!!” 結論正好相反!無需尋址和沒有旋回耗時的確意味著更少的阻塞,所以更少的線程(更接近于CPU核心數)會發揮出更高的性能。只有當阻塞密集時,更多的線程數才能發揮出更好的性能。 上面我們已經說過了磁盤 IO, 接下來我們談談網絡 IO! 網絡 IO 其實也是非常相似的。通過以太網接口讀寫數據時也會造成阻塞,10G帶寬會比1G帶寬的阻塞耗時少一些,而 1G 帶寬又會比 100M 帶寬的阻塞少一些。通常情況下,我們把網絡 IO 放在第三順位來考慮,然而有些人會在性能計算中忽略網絡 IO 帶來的影響。 上圖是 PostgreSQL 的基準性能測試數據,從圖中我們可以看到,TPS 在連接數達到 50 時開始變緩。回過頭來想下,在上面 Oracle 的性能測試視頻中,測試人員們將連接數從 2048 降到了 96,實際上 96 還是太高了,除非你的服務器 CPU 核心數有 16 或 32。 ## 六、連接數計算公式 下面公式由 PostgreSQL 提供,不過底層原理是不變的,它適用于市面上絕大部分數據庫產品。還有,你應該模擬預期的訪問量,并通過下面的公式先設置一個偏合理的值,然后在實際的測試中,通過微調,來尋找最合適的連接數大小。 連接數 = ((核心數 \* 2) + 有效磁盤數) > 核心數不應包含超線程(hyper thread),即使打開了超線程也是如此,如果熱點數據全被緩存了,那么有效磁盤數實際是0,隨著緩存命中率的下降,有效磁盤數也逐漸趨近于實際的磁盤數。另外需要注意,這一公式作用于SSD 的效果如何,尚未明了。 好了,按照這個公式,如果說你的服務器 CPU 是 4核 i7 的,連接池大小應該為 `((4*2)+1)=9`。 取個整, 我們就設置為 10 吧。你這個行不行啊?10 也太小了吧! 你要是覺得不太行的話,可以跑個性能測試看看,我們可以保證,它能輕松支撐 3000 用戶以 6000 TPS 的速率并發執行簡單查詢的場景。你還可以將連接池大小超過 10,那時,你會看到響應時長開始增加,TPS 開始下降。 ## 七、結論:你需要的是一個小連接池,和一個等待連接的線程隊列 假設說你有 10000 個并發訪問,而你設置了連接池大小為 10000,你怕是石樂志哦。 改成 1000,太高?改成 100?還是太多了。 你僅僅需要一個大小為 10 數據庫連接池,然后讓剩下的業務線程都在隊列里等待就可以了。 > 連接池中的連接數量大小應該設置成:數據庫能夠有效同時進行的查詢任務數(通常情況下來說不會高于 2\*CPU核心數)。 你應該經常會看到一些用戶量不是很大的 web 應用中,為應付大約十來個的并發,卻將數據庫連接池設置成 100, 200 的情況。請不要過度配置您的數據庫連接池的大小。 ## 八、額外需要注意的點 實際上,連接池的大小的設置還是要結合實際的業務場景來說事。 比如說,你的系統同時混合了長事務和短事務,這時,根據上面的公式來計算就很難辦了。正確的做法應該是創建兩個連接池,一個服務于長事務,一個服務于"實時"查詢,也就是短事務。 還有一種情況,比方說一個系統執行一個任務隊列,業務上要求同一時間內只允許執行一定數量的任務,這時,我們就應該讓并發任務數去適配連接池連接數,而不是連接數大小去適配并發任務數。 **結論:連接池數量 = ((核心數 \* 2) + 有效磁盤數)**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看