WebSocket 连接数上限突破:Node.js 服务中调整文件描述符限制的方法

WebSocket 连接数受限于操作系统的文件描述符(File Descriptor)限制。在 Linux 系统中,每个网络连接(包括 WebSocket)都会占用一个文件描述符。突破此限制需从三个层面调整:

1. 检查当前限制
# 查看系统全局限制
cat /proc/sys/fs/file-max

# 查看用户级限制
ulimit -n

# Node.js 进程实时占用
ls -l /proc/$(pgrep node)/fd | wc -l

2. 调整系统级限制

修改 /etc/sysctl.conf

# 增加系统总文件描述符上限
fs.file-max = 1000000

# 应用配置
sysctl -p

3. 调整用户级限制

修改 /etc/security/limits.conf

* soft nofile 100000
* hard nofile 1000000

重启后生效,或通过 ulimit -n 100000 临时生效。

4. Node.js 应用层优化

启动脚本设置

# 启动时显式设置描述符限制
ulimit -n 100000 && node app.js

使用 cluster 模块负载均衡

const cluster = require('cluster');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  require('./websocket-server'); // 你的 WebSocket 服务
}

5. 内核参数调优

修改 /etc/sysctl.conf

# 增加 TCP 连接队列
net.core.somaxconn = 65535

# 加快 TIME-WAIT 回收
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

6. 验证调整结果
// 在 Node.js 中输出当前限制
const process = require('process');
console.log(`文件描述符限制: ${process.getrlimit().rlim_cur}`);

注意事项

  1. 调整后需重启 Node.js 服务
  2. 物理内存限制:每 1,000 连接约需 1MB 内存
  3. 使用 PM2 时,需在配置中设置 max_memory_restartulimit
  4. 监控工具推荐:htop, ss -s, netstat

通过上述步骤,可将单机 WebSocket 连接数从默认的 1024 提升至 10 万级以上,具体数值取决于服务器配置。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐