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 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: