性能优化
以下是一些提高 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
下限,因此它不包括机器上服务使用的端口(例如5432
PostgreSQL 服务器),但您完全可以使用较低的值(下至1024
)。
重新启动机器后,您现在可以愉快地达到 55k 并发连接(每个传入 IP)。
也可以看看: