将Node.js应用程序扩展为数千个同时连接

我们在一个应用程序上做了一些工作,可以让人们通过互联网来打棒球。

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

– 专用的MongoDB和Redis服务器 – 三组不同的nodejs服务器 – 我们正在利用Amazon的API来进行服务器configuration和自动调节

我们面临的问题是,我们还没有能够模拟每个实例超过约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 

WebSocket是TCP连接,不是吗? 你的客户能保持连接多长时间?

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

所以:

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

我会假设你开始打击一些内核的tcp堆栈/文件描述符的默认限制。 你有没有尝试过任何系统级的优化? 如果是这样,哪个?

  1. Redis是否正在复制? Redis有问题 – 它是单线程的。 从他们的文档引用:Redis使用大多数单线程devise。 这意味着一个进程服务于所有的客户端请求,使用一种称为多路复用的技术。 这意味着Redis可以在每个特定时刻提供单个请求, 所有请求都会按顺序提供 。 所以进程可以在Redis队列中等待轮到他们

  2. 在mongodb方面使用锁吗? 我已经观察到使用mysql锁的代码的这种性能问题:进程正在等待锁。