【问题标题】:Socket.io: How to reduce emit delay with many concurrent connections?Socket.io:如何减少许多并发连接的发射延迟?
【发布时间】:2018-02-17 03:24:22
【问题描述】:

我正在运行一个 4 核 Amazon EC2 实例 (m3.xlarge),它有 200.000 个并发连接,没有资源问题(每个核心在 10-20%,内存在 2/14GB)。无论如何,如果我向所有首先连接到 cpu-core 的用户发出消息,则会在几毫秒内得到它,但最后一个连接的用户会延迟 1-3 秒,并且每个 CPU 内核会在 1-2 秒内达到 100% .即使在“仅”50k 并发用户(每个核心 12.5k)时,我也注意到了这个问题。

如何减少延迟?

我尝试将 redis-adapter 更改为 mongo-adapter,没有任何区别。

我正在使用此代码在多个 cpu 内核上获取粘性会话:

https://github.com/elad/node-cluster-socket.io

测试非常简单:客户端只进行连接,其他什么都不做。服务器只监听一条消息并发送给所有人。

编辑:我用 50k 客户端测试了没有任何集群/适配器逻辑的单核,结果相同。

我在一个包中发布了服务器、单核服务器、基准测试和 html-client:https://github.com/MickL/socket-io-benchmark-kit

【问题讨论】:

    标签: socket.io socket.io-redis


    【解决方案1】:

    好的,让我们稍微分解一下。四个核心上的 200,000 个用户。如果分布完美,则每个核心有 50,000 个用户。因此,如果向给定用户发送消息每个 CPU 时间需要 0.1 毫秒,那么将它们全部发送需要 50,000 * .1ms = 5 秒。

    如果您在此期间看到 CPU 利用率达到 100%,那么瓶颈可能是 CPU,并且您可能需要更多内核来解决这个问题。但是,也可能存在其他瓶颈,例如网络带宽、网络适配器或 redis 进程。因此,要立即确定的一件事是您的端到端时间是否与您拥有的集群/CPU 数量成正比?如果降到 2 个核心,端到端时间会翻倍吗?如果你去8,它会下降一半吗?如果两者都是,那是个好消息,因为这意味着您目前可能只遇到 CPU 瓶颈,而不是其他瓶颈。如果是这种情况,那么您需要通过检查 node-cluster-socket.io 代码并找到优化您的特定情况的方法来弄清楚如何使跨多个集群的 200,000 个发射更有效。

    最优化的代码可能是让每个 CPU 完成所有的内务管理以准确收集它需要发送给所有 50,000 个用户的内容,然后每个 CPU 很快执行一个紧密循环,在发送 50,000 个网络数据包之后立即发送 50,000 个网络数据包其他。我无法从 redis 适配器代码中判断这是否会发生。

    最糟糕的情况是,某个进程获取所有 200,000 个套接字 ID,然后进入一个循环以发送到每个套接字 ID,在该循环中,它必须在 redis 上查找哪个服务器包含该连接,然后发送一条消息到那个服务器告诉它发送到那个套接字。这将比指示每个服务器只向其所有连接的用户发送消息效率低很多。

    值得尝试(通过研究代码)找出 socket.io + redis 组合在这个范围内的哪个位置。

    哦,如果您为每个套接字使用 SSL 连接,那么您还需要在每个发送操作上投入一些 CPU 来进行加密。有多种方法可以从常规 CPU 中卸载 SSL 处理(使用额外的硬件)。

    【讨论】:

    • 感谢您的回答,好主意!我认为它是成比例的:当我在 50k 时需要 1-2 秒(我希望 { socket.emit('message', msg) } ) 但我很确定结果会是一样的。跨度>
    • 我没有测试,但让我害怕:如果每秒向所有用户发射 2,3,4,5 会怎样?我猜 CPU 会保持在 100%,口吃和 V8 不会大修。无论如何,每个用户 0.1 毫秒听起来相当快。但是,是的,这就是 5 秒 :(
    • @Mick - 我添加了一些想法。
    • 我将尝试 50k 的 1 个内核,不使用集群/套接字适配器,看看是否有变化。如果是,那么 redis/mongodb 就是问题所在。
    • 我在这里分享了我的工具包:github.com/MickL/socket-io-benchmark-kit - 它包含一个集群服务器、单核服务器、一个使用火炮的基准测试和一个 html 客户端
    猜你喜欢
    • 2016-10-25
    • 2018-12-29
    • 1970-01-01
    • 2011-11-03
    • 2011-01-01
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多