如何提高 SocketIO 的性能表现?

7

在Etherpad中,我们广泛使用SocketIO(自从很早以前),非常感谢团队提供了这样一个有用的东西 :)

Etherpad是一个nodejs项目。

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

Etherpad最新模拟负载测试

在线阅读的信息显示,切换到ws可能更高效,但在我们的情况下,瓶颈不是协商(最终成为websockets),而是服务器处理的每秒消息数量。

我不愿意尝试其他软件包,所以我想来这里寻求一些见解或要尝试的事情,看看是否可以通过一些方法显著提高性能。通常的node技巧(访问更多硬件[ram / cpu])会有所帮助,但仍然感觉像是获得了微小的增益,而不是其他模块基准测试中看到的巨大数字。

这个问题的梦幻结果是有人查看Etherpad代码并告诉我为什么我是个白痴,希望我们能让Etherpad达到每秒竞争性100k次更改,但我可能对其他模块产生了不切实际的想法,如果有人有与ws相矛盾的基准测试数据,那么请与我联系。
我觉得我应该补充一点,我们测试了一下是否是内部Etherpad逻辑造成的问题,但事实并非如此,真正造成操作转换算法瓶颈的是通信层,我们99.95%确定......
解决这个问题的方法并不是把更多硬件扔进去,也不是任何形式的反向代理/传递问题。

我不知道你是否在使用Node作为后端,但如果是的话,net模块可能会对此有所帮助。 - WLGfx
@wlgfx 怎么做?我没看出与我的查询有什么关系。 - John McLear
@Barthy 这里是我们的负载测试工具:https://github.com/ether/etherpad-load-test我们尝试增加了nodejs的堆大小,分配更多的内存/CPU等。我们还没有尝试改变socket-io的操作方式,即从上游进行分叉。 - John McLear
通信层使用的是socket.io。OT并不是最大的瓶颈,我们通过进行节点分析和创建一个不执行OT部分的类似通信堆栈来证明了这一点,并且我可以复现这个瓶颈问题。 - John McLear
我强烈建议尝试使用uWebsockets作为替代方案。你会发现瓶颈很可能是socket.io本身。我目前在服务器上运行5k个客户端,我们几乎没有超过400MB的RAM和单个核心。当使用ws时,我们达到了7GB的RAM和4个以上的核心最大化,我猜你也有类似的情况。 - Alexis Tyler
显示剩余4条评论
1个回答

1
如果你对“问题”所在一无所知,那么你的选择就不多。你可能会寻找一个不存在的“错误配置”,这可能会浪费你很多时间和金钱,最终你可能仍然不得不切换。
“成熟,是发现接受‘不知道’的一切。”
重写与负载测试相关的代码片段,以测试使用例如uWebSockets是否有助于推动边界。有多个来源表明uWebSockets服务器速度非常快。我敢打赌,这不需要太多时间,你将获得非常重要的信息,帮助你决定是否值得转换。新的网络技术正在以极快的速度向前发展,如果你想为产品的未来做出正确的选择,你必须愿意尝试它。Alex Hultman撰写了一篇文章 how-µwebsockets-achieves-efficient-pub-sub 他鼓励转换并解释了为什么值得一试。

我认为这不是我要找的答案。 - John McLear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接