簡體   English   中英

最大限度地利用可用的數據庫連接

[英]Maximising use of available database connections

我只是為 Postgres 升級了 Heroku 上的數據庫計划。 在新計划中,我們有更多的聯系,我正在努力確保我們能夠大規模地充分利用它們。

假設我們為 Puma 服務器配置了 40 個線程:

puma -t 40:40

...我將池大小設置為 60(只是為了一點緩沖區)。 我的理解是,因為我預先分配了 40 個 Puma 線程,每個線程都會保留一個連接,從而產生 40 個活動連接。 但是,如果我檢查活動連接,則只有 5 個。

我完全誤解了這是如何工作的嗎?

我遠不是 Puma 的專家,所以我只是分享我自己的知識。

首先,如果您將線程數設置為 40,那么您的 Puma worker 將擁有 40 個線程。 盡管要小心,但由於 GIL(或 GVL),您的 Puma 工作人員只能有一個線程同時執行 Ruby 任務。 剩下的 39 個線程只是閑置。 除非他們正在進行 I/O(訪問數據庫等)。

基本上常識是,在 5 個線程之后,您不再從增加線程數中獲得更多收益 如果您的應用程序真的是面向 I/O 的,也許這可以推到 10,但我不會進一步 go ..

真正的並發由 Puma 工作人員的數量設置(如果您以集群模式啟動 Puma)。 如果您將 Puma 工作人員的數量設置為 40,那么您的應用程序一次至少可以處理 40 個用戶。

但是 40 名工人需要一個巨大的 Heroku Dyno 和相當多的 RAM。 此外,如果您為每個 Puma 工作人員添加 5 個線程,那么您需要 200 個數據庫連接!

實時數據庫連接怎么樣

由於上述原因,很難讓一個擁有 40 個線程的工作人員同時訪問數據庫。 這可能就是您的實時數據庫連接只有 5 個的原因(除非您在更改后沒有重新部署您的應用程序)。 我有一個小應用程序,並且隨着時間的推移也看到了不同數量的實時數據庫連接。

緩沖區

永遠不要做緩沖。 您只是在阻止您的應用無法訪問的連接。 線程池應該等於最大線程數。

我的問題:為什么有這么多數據庫連接?

您增加數據庫連接的目標是什么? 更多並發? 如果你有一個小的應用程序,帶有一個小的 web 測功機,那么后面有一個大的數據庫計划是沒有意義的。

如果你想擴展你的應用程序。 獲得更大的 web 測功機。 添加更多 Puma 工人,同時堅持將線程數增加到 5。

當工作線程數乘以線程數超過允許的數據庫連接數時,就該升級數據庫了。

Nota Bene:Rails 內部可能會使用一些連接。 因此,如果您有一個具有 20 個連接的數據庫,那么一個具有 3 個工作人員和 5 個線程的 Puma 配置。 最好在添加第四個工人之前升級。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM