2

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

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

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

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

关于如何扩展 node.js 应用程序以使其能够同时连接到单个服务器的任何想法?

4

4 回答 4

1

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

例如,在 ubuntu 中,您可以通过命令查看此限制:

$ulimit -a
$ulimit -n

要在 Ubuntu 中永久设置此限制,您需要更改文件 /etc/security/limits.conf 并使用您想要的数字添加这些行:

* soft nofile 100000
* hard nofile 100000

然后重启:

$sudo reboot
于 2013-07-02T12:05:40.613 回答
0

websocket 是一个 TCP 连接,不是吗?您的客户将您的联系保持开放多长时间?

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

所以:

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

?

于 2013-07-02T11:36:09.650 回答
0
  1. Redis 是否运行复制?问题可能出在 Redis 上——它是单线程的。引用他们的文档:Redis 主要使用单线程设计。这意味着单个进程使用称为多路复用的技术为所有客户端请求提供服务。这意味着 Redis 可以在每个给定时刻服务单个请求,因此 所有请求都是按顺序服务的。所以进程可以在 Redis 队列中等待轮到它们

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

于 2013-07-02T15:35:34.623 回答
0

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

于 2013-07-02T11:48:48.047 回答