跳至主要内容
版本:4.x

内存使用

Socket.IO 服务器消耗的资源主要取决于

信息

Socket.IO 服务器的内存使用量应与连接的客户端数量成线性关系。

提示

默认情况下,每个会话的第一个 HTTP 请求的引用将保存在内存中。例如,在使用 express-session 时需要此引用(参见 此处),但可以将其丢弃以节省内存。

io.engine.on("connection", (rawSocket) => {
rawSocket.request = null;
});

用于重现本页中显示的结果的源代码可以在 此处 找到。

另请参阅

每个 WebSocket 服务器实现的内存使用量

Socket.IO 服务器的内存使用量在很大程度上取决于底层 WebSocket 服务器实现的内存使用量。

下图显示了 Socket.IO 服务器的内存使用量,从 0 到 10 000 个连接的客户端,以及

  • 基于 ws 包(默认使用)的 Socket.IO 服务器
  • 基于 eiows 包的 Socket.IO 服务器,一个 C++ WebSocket 服务器实现(参见 安装步骤
  • 基于 µWebSockets.js 包的 Socket.IO 服务器,一个 C++ 替代 Node.js 原生 HTTP 服务器(参见 安装步骤
  • 基于 ws 包的纯 WebSocket 服务器

Chart of the memory usage per WebSocket server implementation

Ubuntu 22.04 LTS 上使用 Node.js v20.3.0 测试,使用以下包版本

  • socket.io@4.7.2
  • eiows@6.7.2
  • uWebSockets.js@20.33.0
  • ws@8.11.0

内存使用量随时间变化

下图显示了 Socket.IO 服务器的内存使用量随时间变化,从 0 到 10 000 个连接的客户端。

Chart of the memory usage over time

注意

为了演示目的,我们在每次客户端浪潮结束时手动调用垃圾收集器。

io.on("connection", (socket) => {
socket.on("disconnect", () => {
const lastToDisconnect = io.of("/").sockets.size === 0;
if (lastToDisconnect) {
gc();
}
});
});

这解释了最后一个客户端断开连接时内存使用量的干净下降。在您的应用程序中不需要这样做,垃圾收集将在必要时自动触发。