首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不处理更多的连接或共享内存

不处理更多的连接或共享内存
EN

Database Administration用户
提问于 2020-02-23 08:58:44
回答 1查看 302关注 0票数 0

我有一个golang程序,它同时对多个线程中的数据进行计算,所有这些线程都从Postgres中提取数据。线程数取决于先前的结果。因此,可以有数百个线程试图同时从Postgres中提取数据。

golang库允许指定连接限制,从而防止postgres耗尽共享内存或空闲连接。

如果我硬编码连接的最大数量,当其他连接时,我将耗尽连接。另一方面,如果我硬编码的数量太少,允许的连接从高丽程序的性能将是不必要的限制。

什么是最好的方式,让围棋程序使用尽可能多的连接,而不是运行到极限。我认为这个数字是一个变量,取决于当时连接到数据库的其他服务的数量。

我正在考虑在数据库和golang程序之间运行PgBouncer,希望能够接受来自golang程序的所有连接,允许尽可能多地通过,但阻塞其余的连接,直到连接空闲为止。不过,我不确定PgBouncer是否会这样做,但我将在接下来进行测试。

在没有真正的连接可用的情况下,是否有另一种方法可以阻止连接池?阻塞,而不是拒绝,因为拒绝连接将意味着我必须添加重试逻辑到我的戈朗程序。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2020-02-23 20:32:49

线程数取决于先前的结果。

您能重写它以减少每一行返回更多行的查询吗?如果要返回的每一行启动一个线程,则可能会带来比要删除的开销更多的开销。

如果我硬编码连接的最大数量,当其他连接时,我将耗尽连接。

除非那个“其他东西”是另一个doing程序,它与第一个程序做的很一样,或者类似的东西,否则您可以使max_connections只比golang中的最大池大小稍大一些,并且您应该没有问题。它确实要求你对其他事物有一个相当好的了解。

另一方面,如果我硬编码的数量太少,允许的连接从高丽程序的性能将是不必要的限制。

你核实过了吗?拥有300个连接,争夺16个CPU和4个硬盘驱动器并不能提高生产力。只有这么多的硬件,现在你不得不为旋转锁(例如)进行非生产性的斗争,同时也要做真正的工作。

我正在考虑在数据库和golang程序之间运行PgBouncer,希望能够接受来自golang程序的所有连接,允许尽可能多地通过,但阻塞其余的连接,直到连接空闲为止。

它可以做到这一点,但为什么它会比让戈朗自己做更好呢?如果你能通过保镖来推动你的“其他联系”,但又不能通过高丽来推动它们,这可能是有意义的。那你就可以有一个能看到一切的泳池。另一方面,它在每次网络往返中引入另一层延迟。再加上另一层复杂性。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/260349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档