如何使 SocketIO 性能更高?

Posted

技术标签:

【中文标题】如何使 SocketIO 性能更高?【英文标题】:How can I make SocketIO more performant? 【发布时间】:2021-02-06 22:06:45 【问题描述】:

我们在 Etherpad 中非常广泛地使用了 SocketIO(从很早开始),我们非常感谢团队为提供如此有用的东西所做的所有努力:)

Etherpad 是一个 nodejs 项目。

我对 SocketIO 的问题可能是由于我配置错误或理解了某些东西,但是在生成了大量测试工具、调整内存设置等之后。我们仍然得到令人沮丧的每秒最大消息数,达到 10k 大关。

Etherpad latest simulated load test

在线阅读看起来切换到 ws 会更好,但我看不出在我们的瓶颈不是协商(最终是 websockets)而是服务器每秒处理的消息的场景中会出现这种情况.

我不愿意尝试其他软件包,所以我想我会来这里寻求一些见解或东西来尝试看看我们是否可以通过很多来提高性能。通常的节点技巧(访问更多硬件[ram/cpu]) 会有所帮助,但感觉我们仍然获得了非常小的收益,而不是您在其他模块基准测试中看到的巨大数字。

这个问题的理想结果是有人查看 Etherpad 代码并告诉我为什么我是个白痴,希望我们可以让 Etherpad 进入具有竞争力的每秒约 10 万次更改,但我也可能眼花缭乱关于其他模块,所以如果有人有与 ws 之类的基准相矛盾的基准,那么我会全力以赴。

我觉得我应该补充一下,我们测试了是否是内部 Etherpad 逻辑是原因,但不是,它确实是最终成为操作转换算法瓶颈的通信层,我们就像 99.95%当然……

在这个问题上投入更多的硬件不是解决方案,也不是任何反向代理/传递问题的方法。

【问题讨论】:

我不知道您是否使用 node 作为后端,但如果您是,那么 net 模块可能会对此有所帮助。 @wlgfx 怎么样?我看不到与我的查询的关系。 我找到了一些可能有帮助的资源。查看 this comment 了解 Trello 如何像您一样达到 10K 上限。然后this article 关于socket.io 基准测试。还有this github issue 有一些有趣的信息。您可能需要查看带有 redis(或其他 pub/sub 后端)的多服务器解决方案来支持您的需求,但对于您来说达到 100K msg/s 的成本可能太高了。 我在 512Mb 的服务器上遇到了 socket.io 的问题(非常低),不得不寻找不同的解决方案。 net 模块为我解决了这个问题,因为网络套接字(不是 socket.io)没有永久连接。通过net 发出请求,然后关闭连接,从而减少服务器的压力。您仍然可以从浏览器中获取 id 以确保真实性。我仍在处理我的项目,所以我没有任何概念证明可以添加作为答案。当我这样做时,我会很乐意这样做。 您好 John,您写道您尝试了“生成大量测试工具、调整内存设置等”。您能给我们列出您尝试解决问题的方法吗? 【参考方案1】:

如果您对“问题”在哪里视而不见,那么您将没有太多选择。您可能正在寻找不存在的“错误配置”。这可能会浪费您大量的时间和金钱,最终您可能仍需要转换。

人们发现,成熟与接受“不知道”有关。

重写与负载测试相关的代码片段,以测试是否使用例如uWebSockets 将有助于推动束缚。有多个消息来源表明 uWebSockets 服务器要快得多。我敢打赌,它不会花费太多时间,并且您将获得非常重要的信息,以帮助您决定是否值得转换。新的网络技术正在以极快的速度发展,如果您希望能够为产品的未来做出正确的选择,您必须愿意尝试它。 Alex Hultman 写了一篇文章

how-µwebsockets-achieves-efficient-pub-sub

他鼓励切换并解释为什么值得一试。

【讨论】:

我认为这不是我要寻找的答案。

以上是关于如何使 SocketIO 性能更高?的主要内容,如果未能解决你的问题,请参考以下文章

Linux 的 Socket IO 模型

React Native - iOS Real Device - Socket IO Web Sockets not working

Greenplum 简单性能测试与分析

如何通过 Express JS 服务器使 React JS 和 Socket IO 连接在一起?

如何使 UINavigationController 中的 UIToolbar 更高?

克隆如何比对象创建具有更高的性能