我使用的是默认设置的官方Mongo NodeJS驱动程序,但今天我更深入地研究了各种选项,显然有一个默认设置为maxPoolSize的选项.

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

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

假设默认设置没有索引,有没有办法(根据数据库的CPU和内存)确定池的最佳连接数?

我们还可以假设NodeJS流程本身不是一个瓶颈(即可以水平扩展).

推荐答案

好问题=)

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

的确如此.我的意思是看起来是这样的,对于抽象的NodeJS进程来说,情况就是这样,在真空中拥有无限的资源.连接不是免费的,所以有一些事情需要考虑:

  • 服务器上的连接配额有限.尤其是Atlas,但即使是自托管集群也只有65K插槽.请记住,驱动程序会将它们打开以供重复使用,每个光标的默认超时是30分钟不活动.
  • 单线程客户端.BSON串行化阻塞了事件循环,并且非常昂贵,例如,见答案https://stackoverflow.com/a/72264469/1110423中的火焰图表.阻塞循环会增加前一点的游标保持打开的时间,在最坏的情况下会导致性能下降.
  • 内存有限.每个连接需要大约1 MB的服务器端空间.

假设默认设置没有索引

您至少有_id,如果我们谈论的是性能,您应该有更多的id

有没有办法确定池的最佳连接数应该是多少?

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

我们还可以假设NodeJS流程本身不是一个瓶颈(即可以水平扩展).

这是一个相当大胆的假设.这一过程不能按比例进行调整.它是在操作系统层面上的.一旦有了流程描述符,它就会一直锁定到死.您可以使用 node 集群来利用所有CPU核心,甚至可以让多个服务器运行相同的NodeJS并平衡负载,但它们都不会共享池中的连接.该池是NodeJS进程的本地池.

Node.js相关问答推荐

如何在RavenDB中执行JS索引?

聚合操作不返回任何具有mongoose模式的内容

Nestjs重写子类dto nodejs中的属性

有没有办法判断 UUID 是否是使用 node.js 中的特定命名空间生成的?

$not 的聚合版本是什么?

如何使用对象中的常量值验证字符串字段?

yarn 安装失败,因为 node-gyp 正在寻找过时的 node 版本标头

在 .htaccess 中从非 www 切换到 www 后如何解决无法访问该站点?

如何在 Docker 容器中 SSO 登录 AWS(使用 aws-sdk v3)

在 linux mint 上部署 node 应用程序的最简单方法是什么?

当其中一个端点不工作时,如何使用 axios.all() 调用多个 API?

如何在 cypress 测试中进行计算

如何在 node.js 环境中从 WebAssembly (Rust) 调用异步 JavaScript 导入函数?

使用加密模块的流功能获取文件的哈希(即:没有 hash.update 和 hash.digest)

判断一个数组中的每个元素是否都在第二个数组中

运行摩卡+伊斯坦布尔+通天塔

使用 pg-promise 进行多行插入

如何使用 Node.js、Express 和 Mongoose 进行身份验证?

如何让 Mocha 加载定义全局挂钩或实用程序的 helper.js 文件?

AWS Lambda 函数写入 S3