首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何修复ws和socket.io内存泄漏?

如何修复ws和socket.io内存泄漏?
EN

Server Fault用户
提问于 2021-06-08 05:02:03
回答 1查看 5.1K关注 0票数 2

我已经读到,node.js websocket模块ws和socket.io中都出现了内存泄漏。它已经存在多年了,我想知道如何修复它。

在以下几个例子中提到了这一点:

考虑到现在是2021年,是否将perMessageDeflate键设置为false,并可能预装jemalloc仍然是最好的解决方案?

EN

回答 1

Server Fault用户

发布于 2021-06-08 10:59:14

我对这个问题的基本理解如下(不要引用我的话):

  • ws node.js模块(即websockets模块)和socket.io node.js模块都使用另一个名为zlib的模块。这个模块负责压缩任何通过websocket发送的消息。
  • 在过去,zlib模块有一个与内存碎片有关的问题,它模仿内存泄漏(也就是说,它实际上不是内存泄漏,而是内存碎片)。
  • 默认情况下,在服务器上禁用消息压缩,但在客户端(例如浏览器)默认启用。如果禁用它,则不使用zlib模块,这将消除内存碎片问题。
  • 为了禁用客户端(例如浏览器)上的压缩,我们将服务器代码中的perMessageDeflate键赋予值false。这就是:

const wss = new WebSocket.Server({ server:httpsServer, perMessageDeflate: false });

显然,对于那些想压缩他们的信息的人来说,这不是一个解决方案。但值得一提的是:

  • 显然,https://github.com/websockets/ws/pull/1204已经部分修复了zlib的内存碎片问题,但它似乎仍然是一个问题;
  • 压缩小消息的好处,就像小文本一样,已经引起了争论。有些人甚至说压缩小消息会使事情变慢。如果您正在处理更大的数据,比如图像或视频,那么在通过websocket发送之前,您可以通过自己压缩它(即没有ws/socket.io/zlib)来获得成功。

另外,一些人已经注意到,设置perMessageDeflate: false只会减少问题,但并不能完全解决问题。我将提请您注意这一讨论,据说打开和关闭websockets时使用的一些剩余和常量(即不增加)内存是正常的(顺便说一句,我不一定说这是正确的):https://github.com/websockets/ws/issues/804#issuecomment-302612661

至于预压Jemalloc,似乎并不能解决这个问题。尽管上面的代码不起作用,但肯定值得研究(或尝试)。

那么,preMessageDeflate: false是目前最好的解决方案吗?据我理解,我会说是的。

如果任何人对此有更正或更多信息,请添加。

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1066025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档