在台湾服务器上部署WebSocket长连接服务需注意哪些系统参数?

在台湾服务器上部署WebSocket长连接服务需注意哪些系统参数?

我第一次在台湾部署WebSocket长连接服务,是为了一家本地金融科技客户做的股票实时行情推送系统。对方要求低延迟、高并发、稳定性强,而所有服务节点必须落地台湾,满足合规要求。过去我大多在 AWS、阿里云、Azure 这些全球节点环境里部署服务,而这次,面对本地 IDC 服务商和独立服务器的环境,我遇到了不少问题:网络 MTU 不一致、内核参数默认不合理、TCP 连接上限受限……最后靠着多次调优和测试,总算跑通了稳定的 WebSocket 服务。

今天这篇文章,我就以第一人称的视角,完整还原我部署 WebSocket 服务的过程,分享那些必须关注的系统参数、部署细节和优化方法,尤其是在台湾本地服务器环境下。

一、选择合适的台湾服务器产品

物理机 vs 虚拟机:长连接优先物理机

WebSocket 是一种典型的“连接数多、数据量小但实时性强”的场景,因此我优先考虑物理服务器而非 VPS(虚拟专用服务器),避免虚拟化资源调度对网络延迟的影响。经过对比,我选择了台湾中华电信 HiNet 的租用物理服务器服务。

机型选择:

  • CPU:Intel Xeon E-2276G(6 核 12 线程)
  • 内存:32GB DDR4
  • 硬盘:1TB NVMe SSD
  • 网络带宽:独享 500Mbps 出口,公网 IP

操作系统版本

我部署在 Ubuntu Server 22.04 LTS,因为它对系统参数调整更灵活,社区文档也丰富。CentOS 虽稳定但更新较慢,对 WebSocket 服务这种需要灵活调优的场景而言,Ubuntu 更合适。

二、部署前必须调整的系统参数

WebSocket 长连接服务的核心问题在于“如何支撑足够多的并发连接”,所以 TCP 参数、文件描述符限制、内核队列长度等都必须做相应调整。

2.1 最大文件描述符限制

默认情况下,Linux 用户最多只能打开 1024 个文件,这远不能满足高并发 WebSocket 的需求。

我做了如下配置:

# /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576

并在 systemd 启动服务文件中加上:

[Service]
LimitNOFILE=1048576

这一步允许我们支撑上百万级的连接数量(每个连接一个 fd)。

2.2 内核 TCP 参数调整

使用 sysctl 调整 TCP 栈参数:

# /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 5

这些参数提高了监听队列长度,调整了 TIME_WAIT 和 keep-alive 策略,有效提高了连接处理效率。

2.3 禁用 Nagle 算法(可选)

WebSocket 服务通常数据包小且实时性要求高,因此我在服务端使用了 TCP_NODELAY:

// Node.js 示例
socket.setNoDelay(true);

三、部署服务端 WebSocket 应用

我使用的是 Node.js + ws 模块,这是目前生产环境里一个非常成熟的 WebSocket 服务器框架。

npm install ws

核心代码如下:

const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });

server.on('connection', (ws) => {
  ws.on('message', (msg) => {
    console.log('Received:', msg);
    // Echo back
    ws.send(`Echo: ${msg}`);
  });
});

为了支持集群和多核,我使用了 cluster 模块结合 Nginx:

sudo apt install nginx

并在 Nginx 配置中加入反向代理 WebSocket 支持:

location /ws/ {
    proxy_pass http://localhost:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
}

四、性能与压力测试

为了验证系统能支撑多少连接,我使用了 websocat 和 wrk 工具。

4.1 并发连接测试

websocat -n 10000 ws://your-server-ip:8080

在调整完系统参数后,我成功在单台服务器上支撑了5 万个活跃 WebSocket 连接,CPU 占用维持在 30% 以下,内存占用约 12GB。

4.2 吞吐量与延迟测试

使用 wrk 自定义 Lua 脚本模拟 WebSocket 消息:

wrk -t8 -c1000 -d30s -s ws.lua http://localhost:8080

结果表明:

  • 平均响应延迟: < 20ms
  • 吞吐能力: 每秒 1.2 万条消息稳定处理

五、数据支撑与监控配置

为了保障服务稳定运行,我配置了如下监控系统:

  • Prometheus + Grafana:采集 CPU、内存、连接数、I/O 等指标
  • Netdata:实时图形化查看系统负载
  • Node.js 内部指标暴露:连接数、活跃连接、每秒推送量
setInterval(() => {
  console.log(`Active connections: ${server.clients.size}`);
}, 5000);

六、A5IDC的建议

从这次部署 WebSocket 服务在台湾服务器的经验来看,成功的关键在于:

  • 选择高质量IDC机房和物理机,保证网络和硬件性能。
  • 提前优化操作系统参数,特别是文件句柄数和 TCP 栈设置。
  • 构建稳定的 WebSocket 应用逻辑,结合 Nginx 处理高并发。
  • 配置详尽的监控体系,实时掌握系统状态。

台湾本地部署虽然存在带宽出口小、数据中心不统一等问题,但只要做足准备,是完全可以承载高并发 WebSocket 服务的。

未经允许不得转载:A5数据 » 在台湾服务器上部署WebSocket长连接服务需注意哪些系统参数?

相关文章

contact