“server_lifetime”和“server_idle_timeout”有什麼區別?
我正在嘗試
pgbouncer.ini
在 Pgbouncer 中調整我的文件,並提出了server_lifetime
我server_idle_timeout
感覺相同的參數。在官方配置文件中它說:
server_lifetime
pooler 將關閉連接時間超過此時間的未使用的伺服器連接。將其設置為 0 意味著連接將只使用一次,然後關閉。
$$ seconds $$ 預設值:3600.0
server_idle_timeout
如果伺服器連接空閒超過這麼多秒,它將被丟棄。如果為 0,則禁用超時。
$$ seconds $$ 預設值:600.0
你能幫我簡單理解一下區別嗎?提前致謝!!!🙏
Pgbouncer 將
server_lifetime
根據pool_mode
. 想像一個恆定負載下的池。如果沒有server_lifetime
,pgbouncer 將打開 N 個伺服器連接並使用它們數月。這不是那麼糟糕,但並不總是可取的。在某些情況下,數據庫伺服器程序會隨著時間的推移佔用越來越多的記憶體(儲存過程的記憶體、準備好的語句等)。server_lifetime
將在應用程序不知道的情況下關閉舊的伺服器連接(如果需要,稍後將建立新的伺服器連接)。無論連接有多活躍,都會發生這種情況。另一方面,
server_idle_timeout
將關閉在此期間客戶端未使用的與伺服器的連接。案例:通常幾個到伺服器的連接對於這個池來說就足夠了。但有時我們有一個活動高峰,我們會打開 50 個連接。當我們處理這個峰值時,不再需要這些額外的連接,我們只需要其中的幾個。server_idle_timeout
允許您關閉超過指定時間未使用的伺服器連接。server_lifetime
也將關閉此類不需要的連接,但單獨的server_idle_timeout
選項將允許設置更短的間隔。Pgbouncer 認為
unused server connection
它與空閒連接有何不同?從 pgbouncer 的角度來看,未使用的連接是目前未連結到任何客戶端連接的連接。這與
pool_mode
以下內容有關:
- 在池模式
statement
中,伺服器連接僅在查詢執行期間與客戶端連結(並且“使用”)。- 在池模式
transaction
中,伺服器連接在事務進行時連結到某個客戶端。- 在池模式下
session
,客戶端連接連結到伺服器連接,直到客戶端斷開連接。因此,
idle
就 postgresql 視圖而言,連接pg_stat_activity
將unused
處於池模式statement
或transaction
. 但在池模式下未知session
- pgbouncer 可以等待來自客戶端的進一步命令(因此伺服器連接idle
用於 postgresql,但used
用於 pgbouncer)或者此連接目前未分配給任何人(unused
對於 pgbouncer,但idle
對於 postgresql 相同)嚴格來說,來自 pgbouncer 的伺服器連接可以處於以下狀態之一:
active
- 連結到客戶端的伺服器連接。idle
- 未使用且可立即用於客戶端查詢的伺服器連接。used
- 空閒時間超過 server_check_delay 的伺服器連接,因此需要在它們上執行 server_check_query 才能再次使用它們。tested
- 目前正在執行 server_reset_query 或 server_check_query 的伺服器連接。login
- 目前正在登錄的伺服器連接。(沒有很好的記錄,見
SHOW POOLS
描述)
used
中的連接tested
和idle
狀態在此處檢查server_lifetime
條件並在此處呼叫。這是對從active
/used
/tested
到idle
狀態的轉換的額外檢查。或狀態中used
的伺服器連接受到或超時。因此,這些超時不會影響客戶端。tested``idle``server_lifetime``server_idle_timeout