跳到主要内容

Benchmarks

本文件给出 Realtime 和 PG 服务在单实例部署下的可扩展性基准测试结果,覆盖 Broadcast(公共与私有频道)、Payload 大小、连接与授权速率、Presence 与 Postgres Changes 五个方面,并给出生产环境推荐容量与配置参数。

测试对象为单实例 Realtime Server,建议业务使用中按自身场景复测。


Methodology​

测试环境​

项目配置
Realtime Server2 vCPU / 4 GB × 1 实例
PostgreSQL1 vCPU / 2 GB

租户配额(测试期间)​

配额项取值备注
max_concurrent_users30,000单个租户可同时保持的活跃 WebSocket 连接总数上限,超出后新连接被拒绝(TooManyConnections)
max_joins_per_second3,000单个租户每秒可处理的频道加入(join)次数上限,超出后加入请求被拒绝(TooManyJoins)
max_events_per_second30,000按 60 秒均值判定
max_presence_events_per_second10,000按投递数计
max_bytes_per_second10 MB/s仅计入站流量,对高扇出无效
db_pool(授权连接池)10决定授权吞吐上限
subs_pool_size(订阅连接池)10决定 CDC 熔断阈值

测试方法​

项目说明
协议裸 WebSocket + Phoenix 协议,每连接独立 join
建连方式以 50/s 的速率阶梯爬坡,稳态持续发送
统计口径速率类指标按 60 秒滑动均值;延迟以「发送至首个客户端收到」计
观测指标连接成功率、投递率、每秒投递条数、p50/p95/p99 延迟、服务端 CPU 与内存

指标定义​

指标定义
每秒发送条数向频道发布一次消息计 1 条,与订阅人数无关
每秒投递条数服务端推送至客户端的消息条数 = 发送条数 × 订阅人数
频道加入速率客户端完成一次建连并加入频道计 1 次
投递率实际收到消息数 ÷ 应收到消息数

1. Broadcast over WebSocket(公共广播)​

公共频道不做授权校验,所有连接订阅同一topic,由单一发送端按速率广播,用于测定纯扇发路径的容量。

1.1 连接数维度​

连接数服务端内存投递率结果
20,00082%100%稳定
24,00091.6%100%接近上限
25,000拐点100%不可用

内存随连接数线性增长,拟合式为 内存 ≈ 35% + 4 个百分点 × (连接数 ÷ 1000)。单实例内存是连接数的第一道限制,20,000 为推荐上限,25,000 时内存耗尽。

1.2 投递量维度​

每秒投递条数服务端 CPU延迟结果
5,00018%低稳定
19,59152%低稳定
27,00070%正常安全线
33,98888%开始抬升接近上限
40,000约 95%秒级劣化
45,80094.8% 平台期p50 21 s / p95 52 s容量上限,零丢弃

CPU 与投递量线性相关,与连接数无关:CPU ≈ 6.5% + 2.35% × (每秒投递条数 ÷ 1000)。该维度达到 45,800/s 时功能仍完整、无丢弃,但延迟已不可接受,属于「先坏体验、后坏功能」的失效形态。


2. Broadcast over Private Channels(私有广播)​

私有频道每次发布需经 RLS 授权校验并写入消息表,且同一频道的扇发为单链串行。全部测试在 4,000 连接下进行,连接均成功加入,无断开。

2.1 发送与投递组合维度​

场景拓扑每秒发送条数每秒投递条数首报 p50投递率结果
高频稳态500 房 × 8 人,5 条/s2.5k17.2k77 ms100%稳定
低频稳态2,000 房 × 2 人,2.5 条/s5.0k4.9k64 ms100%稳定
高频过载500 房 × 8 人,10 条/s4.6k24.7k1,586 ms78%延迟劣化
中频过载2,000 房 × 2 人,5 条/s10.0k8.1k93 ms(p95 6.4 s)82%延迟劣化

表中「稳态」与「过载」用于对照同一负载模型下的容量边界;各档连接数均为 4,000,全部加入成功且无断开。

私有广播的容量由两个方向共同约束:每秒发送条数反映授权与分发开销,每秒投递条数反映扇出开销。上表中,发送 2.5k/s、投递 17.2k/s 与发送 5.0k/s、投递 4.9k/s 两档均在 100% 投递下保持数十毫秒延迟;投递升至 24.7k/s(发送 4.6k/s)时首报延迟升至 1.59 s;发送升至 10.0k/s 时 p95 延迟达 6.4 s、投递率降至 82%。据此,单实例私有广播建议同时满足:每秒发送条数 ≤ 6,000、每秒投递条数 ≤ 17,000。

2.2 连接数维度​

连接数服务端内存投递率结果
8,000—100%稳定
16,00072.8%100%稳定
20,00088.3%100%接近上限
24,000100%丢失 2.13%不可用

私有广播常驻内存高于公共广播(每个频道需保留授权与订阅状态),因此连接数上限低于公共广播。


3. Payload Size(消息大小)​

公共广播场景,8,000 连接,固定发送速率,仅改变单条消息体积。

payload投递率扇出跨度 p50出口带宽结果
64 B100%387 ms—稳定
1 KB100%387 ms—稳定
10 KB100%——稳定
100 KB仅发出 3/5 条5,222 ms114 MiB/s ≈ 1 Gbps不可用

单实例出口带宽约 150 MB/s(约 1.2 Gbps),拐点位于 10 KB 至 100 KB 之间。带宽瓶颈的表现为发送端发不出去,而非接收端丢包。


4. Connection and Authorization Rate(连接与授权速率)​

私有频道加入需执行一次 RLS 授权查询,该查询占用授权连接池,因此建连速率存在硬上限。

建连速率加入成功率结果
50/s100%稳定
100/s15,998 / 16,000稳定
120/s100%上限附近
130/s投递 0熔断
200/s58.3% 被拒(9,330 次失败)熔断

机制为 授权连接池 ÷ 单次授权耗时 ≈ 10 ÷ 80 ms ≈ 125/s。超限时返回 IncreaseConnectionPool 错误,30 秒窗口后自愈。该限制为全拒而非降级,因此客户端必须配置重连退避与抖动,避免集体重连造成二次熔断。


5. Presence(在线状态)​

Presence 的每次状态变更需广播给频道内全部成员,成本随成员数呈平方增长。

单 topic 成员数场景结果
816,000 连接,10% 更新12,670/s,p50 85 ms,零错误
825% 更新23,497/s,p50 796 ms,零错误
870% 更新约 78,000/s,p50 3,444 ms,内存 97.5%
10,000单热 topicCPU 99.6% / 内存 100%,快照 174 KB/人,4,228 连接被断开

配额需求按下式核算:

所需配额 = 成员数² × 更新频率
单 topic 更新频率上限 = 配额 ÷ 成员数

在配额 1,000/s 下:

成员数允许更新频率
8125 次/s
2005 次/s
1,0001 次/s
10,0000.1 次/s(不可用)

结论:单 topic 成员数应控制在 200 以内。大厅类场景不建议使用 Presence。


6. Postgres Changes(数据库变更订阅)​

每条变更需按订阅数逐个投递,且 Postgres Changes 由单线程轮询器处理以保证顺序。

订阅数订阅对账投递(4 轮)轮询峰值结果
16,000100%4 × 16,000,缺失 0390.8 ms稳定
17,000100%4 × 17,000,缺失 0612.2 ms稳定
18,00017,743(差 257)劣化840.7 ms熔断
18,000(复现)17,774(差 226)劣化430.8 ms熔断

16,000 档的端到端延迟为 p50 1,317 ms、p95 ≤ 1,694 ms、p99 ≤ 1,710 ms。持续变更速率实测为 3,000 ~ 5,000/s;在与广播、Presence 并发的混合负载下,CDC 延迟劣化约 5.8 倍(由 2.6 s 升至 15 s)。

熔断根因为轮询器失败导致订阅被清除,客户端重新注册时撞上订阅池上限。调大订阅池只能推后熔断,不能解决根因。


7. Capacity Summary(推荐容量)​

序号维度推荐值(生产)
1公共广播 — 并发连接数≤ 20,000
2私有广播 — 并发连接数≤ 18,000
3公共广播 — 每秒投递条数≤ 27,000/s(CPU 70%)
4私有广播 — 每秒发送条数≤ 6,000/s
5私有广播 — 每秒投递条数≤ 17,000/s
6纯写入(无接收者)无限制(≥ 28,600/s 未触及瓶颈)
7建连 / 频道加入速率≤ 60/s
8单条消息大小≤ 4 KB
9CDC 订阅数 / 租户≤ 14,000 ~ 15,000
10CDC — 每秒变更条数≤ 3,000/s
11Presence 单 topic 成员数≤ 200
12Presence — 每秒投递条数≤ 23,000/s

上表数值为单实例安全线。超出后先表现为延迟升高,持续加压才出现投递率下降或连接被断开,不会静默丢数据。业务规模超出推荐值时,应增加实例并实施房间或租户分片;仅提升内存无效,此时瓶颈位于 CPU。


8. Configuration Recommendations(配置建议)​

以下参数均为标准设置项,可在平台侧调整,无需修改代码或重启服务。

设置项(配置键)建议值依据收益
Database connection pool size(db_pool)10私有频道加入与 REST 发布各需一次 RLS 校验;吞吐约为「池大小 ÷ 单次 80 ms」加入吞吐由 125/s 提升至约 375/s,红线由 60/s 提升至 180/s
Postgres Changes connection pool size(subs_pool_size)20该池仅用于创建订阅;CDC 熔断阈值等于池大小延后 CDC 熔断,属缓解措施
Max events per second(max_events_per_second)25,000按投递口径计数;实测安全线 27,000/s(CPU 70%)与实际容量对齐,避免误限流
Max presence events per second(max_presence_events_per_second)10,000每次状态变更广播给频道内全部客户端,并计入 Max events per second支撑 200 人 topic 及秒级更新