将Node.js应用程序扩展到1000个同时连接中的10个

Scaling a Node.js application to 10s of 1000s of simultaneous connections

本文关键字:连接 10个 1000个 Node js 应用程序 扩展到      更新时间:2023-09-26

我们开发了一款应用程序,让人们可以在互联网上发射棒球。

它完全生活在亚马逊的AWS生态系统中,我们正在为一个新项目构建它。堆栈包括:

-专用MongoDB和Redis服务器-三组不同的nodejs服务器-此外,我们正在使用亚马逊的API进行服务器配置和自动缩放

我们面临的问题是,我们无法模拟每个实例超过15000个并发用户(websocket连接)。我们应该得到更多;我们认为成千上万。服务器CPU使用率仅为40%。

关于如何扩展node.js应用程序,使其能够同时连接到单个服务器,有什么想法吗?

每个tcp连接都有一个在文件操作系统中打开的文件描述符。重要的是要将限制设置为高于所需的数字。

例如,在ubuntu中,你可以通过命令看到这个限制:

$ulimit -a
$ulimit -n

要在Ubuntu中永久设置此限制,您需要更改文件/etc/security/limits.conf,并添加以下行所需的编号:

* soft nofile 100000
* hard nofile 100000

然后重新启动:

$sudo reboot

网络套接字是TCP连接,不是吗?您的客户会将您的连接保持多久?

服务器将限制您可以拥有的打开TCP连接的数量。您的操作系统还将限制进程在任何时候可能具有的打开文件句柄的数量。

因此:

  • 服务器上的TCP开放套接字限制是多少,以及
  • 服务器上的打开文件句柄限制是多少

我假设您开始在tcp堆栈/文件描述符上达到内核的一些默认限制。您尝试过任何系统级优化吗?如果是,哪个?

  1. Redis是否正在复制运行?Redis可能有问题——确实如此单螺纹。引用他们的文档:Redis使用的大多是单个螺纹设计。这意味着一个单独的过程服务于所有客户端请求,使用一种称为多路复用的技术。这意味着Redis可以在每个给定的时刻提供一个请求,因此所有请求都按顺序提供。因此进程可以在Redis队列中等待轮到它们的

  2. mongodb端是否使用了锁?我在使用mysql锁的代码中观察到了这种性能问题:进程正在等待锁。