如何找到单个mongo nodejs驱动程序的最优连接池大小



我使用的是带有默认设置的mongo nodejs官方驱动程序,但是今天深入研究了一下选项,显然maxPoolSize有一个默认设置为100的选项。

我对此的理解是,单个nodejs进程可以建立多达100个连接,从而允许mongo同时并行处理100个读/写?

如果是这样的话,似乎将这个数字设置得更高只会对性能有利,但我不确定,因此决定在这里问。

假设默认设置没有索引,是否有一种方法来确定(基于cpu和数据库的内存)池的最佳连接数应该是什么?

我们也可以假设nodejs进程本身不是瓶颈(即可以横向扩展)。

好问题=)

似乎将这个数字设置得更高只会有利于性能

确实如此。我的意思是,似乎,这将是一个抽象的nodejs进程在真空中无限资源的情况。连接不是免费的,所以有一些事情需要考虑:

  • 限制服务器上的连接配额。特别是Atlas,但即使是自托管集群也只有65k个套接字。请记住,驱动程序保持它们打开以重用,并且每个游标的默认超时是30分钟不活动。
  • 单线程客户端。BSON序列化阻塞事件循环,并且相当昂贵,例如,参见此答案https://stackoverflow.com/a/72264469/1110423中的火焰图。阻塞循环会增加游标保持打开状态的时间,在最坏的情况下会导致性能下降。
  • 有限内存。每个连接需要1 MB的服务器端。

假设默认设置没有索引

你至少有_id,如果我们谈论性能,你应该有更多

是否有一种方法来确定池的最佳连接数应该是什么?

我也想知道。需要考虑的因素太多了,不仅是CPA/RAM,还有数据形状、查询模式等。这就是dops的作用。Mongo集群需要一些关注、监控和调整以实现最佳操作。在许多情况下,扩展集群比优化应用程序更具成本效益。

我们也可以假设nodejs进程本身不是瓶颈(即可以横向扩展)。

这是一个相当大胆的假设。进程不能横向扩展。这是在操作系统层面。一旦你有了一个进程描述符,它就会被锁定,直到死亡。你可以使用一个节点集群来利用所有的CPU内核,甚至可以让多个服务器运行相同的nodejs并平衡负载,但它们都不会共享池中的连接。

最新更新