Postgresql

“server_lifetime”和“server_idle_timeout”有什麼區別?

  • August 16, 2021

我正在嘗試pgbouncer.ini在 Pgbouncer 中調整我的文件,並提出了server_lifetimeserver_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_activityunused處於池模式statementtransaction. 但在池模式下未知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中的連接testedidle狀態在此處檢查server_lifetime 條件並在此處呼叫是對從active/ used/testedidle狀態的轉換的額外檢查。或狀態中used的伺服器連接受到或超時。因此,這些超時不會影響客戶端。tested``idle``server_lifetime``server_idle_timeout

引用自:https://dba.stackexchange.com/questions/298083