“server_lifetime”和“server_idle_timeout”有什么区别?

Era*_*han 2 postgresql pgbouncer

我正在尝试pgbouncer.ini在 Pgbouncer 中调整我的文件,并提出了我感觉相同的参数server_lifetimeserver_idle_timeout

官方配置文档中是这么说的:

服务器生命周期

池化器将关闭连接时间超过此时间的未使用的服务器连接。将其设置为 0 表示连接仅使用一次,然后关闭。[秒]

默认值:3600.0

服务器空闲超时

如果服务器连接空闲时间超过这么多秒,它将被丢弃。如果为 0,则禁用超时。[秒]

默认值:600.0

您能帮我简单地理解其中的区别吗?提前致谢!!!

Mel*_*kij 6

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客户端连接将链接到服务器连接,直到客户端断开连接。

因此,idlepostgresql 视图中的连接pg_stat_activity将处于unused池模式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说明

中的连接usedtested状态在此处idle检查并在此处调用这里是对从//到状态的转换的附加检查。、或状态下的服务器连接可能会超时。因此,这些超时不会影响客户端。server_lifetime activeusedtestedidleusedtestedidleserver_lifetimeserver_idle_timeout