我有一个多线程进程,36个线程随机写入db,每个平均每10秒一次,每个都有99%的空闲时间(休眠)。
我不确定这是否意味着我有36个活动连接,或者因为每个线程中的睡眠而实际只有一个或两个。可能不相关,但他们都使用相同的用户名。
我应该将配置文件中的max-connections选项减少到36还是减少到像4这样的东西(以反映在任何时刻,几乎肯定不会超过4个同时写入的概率)?
编辑:它的实现是否可能依赖,即我是否编写了我的python代码,无论是否在睡眠时删除连接?
答案 0 :(得分:2)
这里最好的设置是使用pgbouncer进行连接池: https://pgbouncer.github.io/config.html
default_pool_size = 4
将保留与postgres的4个永久连接,在会话完成时将36个池连接到四个中使用其中一个。
我建议使用pooler,因为服务器上的连接是否仍然存在取决于您是否断开连接。僵尸会保持连接,而你的代码会启动新的会话。
简而言之 - 要运行查询,您必须以用户身份连接到数据库。如果您在同一会话上运行另一个事务,则重用该连接(如果您没有断开连接)。您必须明确断开连接以关闭会话。如果您没有这样做,连接将保留在服务器上(使用max_connections
个插槽之一。
也是从9.6开始我们有idle_in_transaction_session_timeout
,如果它的idla超过n个时段就会杀死交易,这将有助于对抗僵尸。