转到主要内容
Version: 4.x

性能优化

以下是一些提高 Socket.IO 服务器性能的技巧:

You might also be interested in scaling to multiple nodes.

通过Socket.IO调节

由于在大多数情况下,Socket.IO 连接将与 WebSocket 建立,因此 Socket.IO 服务器的性能将与底层 WebSocket 服务器的性能密切相关(ws默认情况下)。

安装 ws 本机插件

ws带有两个可选的二进制附加组件,可改进某些操作。预构建的二进制文件可用于最流行的平台,因此您不一定需要在计算机上安装 C++ 编译器。

  • bufferutil: Allows to efficiently perform operations such as masking and unmasking the data payload of the WebSocket frames.
  • utf-8-validate: Allows to efficiently check if a message contains valid UTF-8 as required by the spec.

要安装这些软件包:

$ npm install --save-optional bufferutil utf-8-validate

请注意,这些包是可选的,如果它们不可用,WebSocket 服务器将回退到 Javascript 实现。更多信息可以在这里找到。

使用另一个 WebSocket 服务器实现

例如,您可以使用eiows包,它是(现已弃用的)uws包的一个分支:

$ npm install eiows

然后使用wsEngine选项:

const { createServer } = require("http");
const { Server } = require("socket.io");

const httpServer = createServer();
const io = new Server(httpServer, {
wsEngine: require("eiows").Server
});

使用自定义解析器

如果您通过 Socket.IO 连接发送二进制数据,使用自定义解析器(如基于msgpack的解析器)可能会很有趣,因为默认情况下,每个缓冲区都将在其自己的 WebSocket 帧中发送。

用法:

服务器

const { createServer } = require("http");
const { Server } = require("socket.io");
const parser = require("socket.io-msgpack-parser");

const httpServer = createServer();
const io = new Server(httpServer, {
parser
});

客户端

const { io } = require("socket.io-client");
const parser = require("socket.io-msgpack-parser");

const socket = io("https://example.com", {
parser
});

通过系统调节

有很多关于如何调整操作系统以接受大量连接的好文章。例如,请看这个这个

在对 Socket.IO 服务器进行负载测试时,您可能会达到以下两个限制:

  • 最大打开文件数

如果您不能超过 1000 个并发连接(新客户端无法连接),那么您肯定已经达到了打开文件的最大数量:

$ ulimit -n
1024

要增加此数量,请创建一个/etc/security/limits.d/custom.conf包含以下内容的新文件(需要 root 权限):

* soft nofile 1048576
* hard nofile 1048576

然后重新加载您的会话。您的新限制现在应该已更新:

$ ulimit -n
1048576
  • 最大可用本地端口数

如果你不能超过 28000 个并发连接,你肯定已经达到了可用本地端口的最大数量:

$ cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999

要增加此数量,请创建一个/etc/sysctl.d/net.ipv4.ip_local_port_range.conf包含以下内容的新文件(同样,需要 root 权限):

net.ipv4.ip_local_port_range = 10000 65535

注意:我们用作10000下限,因此它不包括机器上服务使用的端口(例如5432PostgreSQL 服务器),但您完全可以使用较低的值(下至1024)。

重新启动机器后,您现在可以愉快地达到 55k 并发连接(每个传入 IP)。

也可以看看: