websocket服务器测试

代码地址:github.com/buexplain/netsvr

  • netsvr网关进程,是websocket服务器
  • business业务进程,是模拟业务逻辑的
  • stress压测进程,是模拟客户端的

压测

场景:

  • 40个群,每个群2500连接,目标连接数是100000
  • 每个连接都是登录状态,绑定:1个userId、2KiB的session
  • 每个群每秒发送3条100B(纯文本内容、不含协议/元数据)的群消息

以上场景要求对应stress.toml中的配置如下:

# 群聊,登录、订阅、发消息
[GroupChat]
Enable = true
# 模拟登录后存储的session长度
SessionLen = 2048
# 群数量
GroupNum = 10
# 发送的消息大小
MessageLen = 100
# 每秒发消息条数
SendSpeed = 3
# 每个群的人数
Step = [
 { ConnNum = 2500, ConnectNum = 100, Suspend = 1 },]

机器配置:

配置项 规格值
实例类型 腾讯云CVM服务器:X86计算、标准型、SA9
规格代码 SA9.LARGE8
vCPU 4 核
内存 8 GiB
处理器主频/睿频 - / 3.4 GHz
处理器型号 AMD EPYC Turin-D (-/3.4GHz)
内网带宽 2 Gbps
内网每秒包转发数量 30 万 PPS

部署情况:
1台部署netsvr程序,2台机器部署business程序,4台机器部署stress程序

程序运行后,实际压测结果如下:

实际连接数 99999
绑定userId数 99998
群数 40
netsvr程序接收消息并发数平均值(1分钟) 120 msg/s
netsvr程序下发消息并发数平均值(1分钟) 301302 msg/s

系统监控信息 (top):

  • 系统概况
指标 数值
时间 21:58:40
运行时间 up 1:21
用户数 0 user
负载平均值 (1分钟) 4.05
负载平均值 (5分钟) 4.75
负载平均值 (15分钟) 4.55
  • 任务统计
总计 运行中 睡眠 停止 僵尸进程
1 0 1 0 0
  • CPU 使用率
用户态(us) 系统态(sy) 优化(ni) 空闲(id) 等待(wa) 硬件中断(hi) 软件中断(si) 窃取(st)
17.6% 37.7% 0.0% 7.2% 0.1% 0.0% 37.5% 0.0%
  • 内存使用 (MiB)
类型 总计 空闲 已用 缓冲/缓存 可用
内存 7555.2 5475.9 1842.5 543.4 5712.8
Swap 0.0 0.0 0.0 - -
  • netsvr程序进程详情
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8516 root 20 0 4702028 973320 5880 S 324.7 12.6 134:43.59 netsvr-linux-am

关键指标分析:

  • CPU 负载极高:
    • 1分钟负载高达 4.05
    • 关键问题: %Cpu(s)si (软中断) 高达 37.5%sy (内核态) 高达 37.7%
    • 这意味着 CPU 大量时间花在处理网络包中断和内核处理上,而非实际的用户程序计算 (us 仅为 17.6%)。
    • 这非常符合网络密集型应用的特征。
  • 进程占用:
    • netsvr-linux-am 进程占用了 324.7% 的 CPU(约占用 3-4 个核心)。
  • 内存状态:
    • 内存使用正常,主要进程占用 950MB (12.6%),剩余可用内存充足 (5712.8 MB)。

压测场景分析:

  • websocket服务器几乎不接收消息
  • websocket服务器只下发消息
  • websocket服务器下发消息速度是:每个连接每秒下发3条消息
  • 4核8GiB配置的机器,承受100000个连接,每个连接每秒下发3条消息,在此场景下是处于极限负载状态
  • websocket服务器对内存的需求不高,对cpu算力网卡性能要求高

负载估算:

机器配置 极限负载下连接数 峰值负载下连接数 安全生产下连接数
4核8GiB 10万 8万 7万
8核16GiB 20万 16万 14万
16核16GiB 40万 32万 28万
32核64GiB 80万 64万 56万
本作品采用《CC 协议》,转载必须注明作者和本文链接
梦想星辰大海
讨论数量: 20

websocket 怎么压测

2年前 评论
梦想星辰大海 (楼主) 2年前

可以在生产环境使用该项目吗?

2年前 评论
梦想星辰大海 (楼主) 2年前
kureCC (作者) 2年前
梦想星辰大海 (楼主) 2年前
kureCC (作者) 2年前
梦想星辰大海 (楼主) 2年前

我比较好奇,怎么快速给一万客户端发消息

2年前 评论
梦想星辰大海 (楼主) 2年前
kureCC 2年前
梦想星辰大海 (楼主) 2年前
kureCC 2年前
梦想星辰大海 (楼主) 2年前
kureCC 2年前
lxzan 2年前

我们生产有个场景,客户会导入excel我们作为任务来处理,但是处理的时间会有一点长,目前是通过轮询来查看任务,请问可以用你的项目吗?我的想法是完成任务以后发个消息后续通过websocket来告诉前端。

2年前 评论
梦想星辰大海 (楼主) 2年前

大佬 请教下有什么比较简单的方式吗 是可以引入现成的包吗

2年前 评论
梦想星辰大海 (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!