跳转到正文

性能与扩展

2026年10月27日,单个 Go 服务器建立了 10,000 个经过认证的 WebSpace WebSocket 连接,并完成了全部 100,000 条预期事件投递。SQLite3 混合负载测试也在保持 10,000 个连接的同时,完成了 1,000 次写入和 10,000 次读取。

可下载验证结果与各轮测量数据(JSON)。测试使用 WebSpace 专用实时路径,与 Workspace 聊天分别验证。

测试环境与设置

项目测试条件
日期2026年10月27日,韩国标准时间
服务器Intel Core i9-14900K,32 个逻辑 CPU,约 62.6 GiB RAM,1 个 Go 进程
存储NVMe SSD(SHPP41-2000GM),WSL2 虚拟磁盘(ext4),Ubuntu 26.04
负载生成同一台机器上的 4 个 Node 进程、4 个回环源 IP、1 个认证账户
通信本地回环,不含外网、TLS 和生产代理
SQLite3WAL、synchronous=NORMAL、busy timeout 5 秒、最多 8 个读取连接、每个 DB 一个写入队列
WebSocket 上限服务器总量和每个 DB 均为 12,000 个连接,每 IP 10,000 个,每连接每秒 10,000 条消息
HTTP 上限读取、修改、握手各自为每 IP 每秒 20,000 次请求,突发容量 30,000 次

测试使用专用开发构建,绕过了许可证等级检查。认证、权限和 Origin 检查仍通过正常的 WebSpace 路径执行。数据库保存在磁盘上的 ext4 中,未使用内存文件系统(tmpfs)。负载生成器未限制读取请求速率或正在执行的写入数量。

HTTP 上限通过服务器配置中 webspace.rateLimits.read、webspace.rateLimits.mutation、webspace.rateLimits.handshake 下的 requestsPerSecond 和 burst 指定,重启后生效。这些测试值与默认值不同。实时连接上限在服务与容量中管理。

从 5,000 到 10,000 个连接的投递

每个连接接收 10 条事件,每种规模测量 3 轮。所有轮次的事件丢失、重复和跨房间误投均为 0。

认证连接每轮投递成功 / 预期全部连接就绪时间事件投递 p95
5,00050,000 / 50,0001.25 秒110 ms
7,50075,000 / 75,0001.77 秒183 ms
10,000100,000 / 100,0002.66 秒312 ms

时间为 3 轮测量值的中位数。连接就绪时间包括负载生成进程启动、分批建立连接、认证和订阅完成。投递 p95 是从发送事件到接收事件的耗时的第 95 百分位,表中列出各轮 p95 的中位数。9 月的测试按每个连接收完全部 10 条事件计时,两者的延迟定义不同,不能直接比较。

SQLite3 的 1,000 次写入与 10,000 次读取

保持 10,000 个认证连接,同时发起共享资源的 1,000 次状态变更和 10,000 次 HTTP 读取。写入通过每个 DB 的队列串行执行。

HTTP 读取并发请求设置轮数写入成功读取成功混合负载完成时间
1283每轮 1,000 / 1,000每轮 10,000 / 10,000中位数 2.69 秒
10,00011,000 / 1,00010,000 / 10,0003.11 秒

完成时间从连接就绪后开始读写时算起,到全部完成为止。并发请求设置为 10,000 描述的是客户端发出请求的条件,不表示 SQLite 同时执行 10,000 条查询。读取连接池最多只有 8 个连接。

所有读取均返回 HTTP 200,没有 HTTP 429 或写入错误。在并发请求设置为 10,000 的测试中,写入 p95 为 858 ms,读取 p95 约为 2.88 秒。4 个测试数据库均确认有 1,000 条唯一操作、资源值 100,000→99,000、版本 1,000 和奖励数量 1,000。SQLite integrity_check 全部返回 ok。

连接保持、房间隔离与重连

在 10,000 个连接上分 12 轮发送事件,每轮 10 条,轮间等待 5 秒。约 67.27 秒内完成全部 1,200,000 条投递,没有丢失或重复。强制关闭并重连 100 个连接后,也收到了全部 10,000 条后续事件。

另一项测试将连接分到 100 个房间,每个房间 100 个。初始 100,000 条事件全部投递,没有跨房间误投。等待 20 秒后及重连 100 个连接后的投递也均通过。全部 15 项测试中观测到的服务器 RSS 峰值约为 1.50 GiB。测试结束后剩余连接数为 0。

延迟与存储路径的影响

在连接保持测试中,与整个订阅命名空间的周期性令牌重新验证重叠的轮次,投递 p95 增至约 1.91~2.31 秒。因此,短时投递测试的 312 ms 不能视为持续延迟保证。

此前使用 WSL 的 Windows 共享文件系统(9p)进行测试时,1,000 次并发写入仅完成 414 次,其余未能在 5 秒的写入等待及事务时限内完成。上面的成功结果使用同一块 NVMe SSD 上的 WSL ext4 虚拟磁盘。存储访问方式不同,结果也可能不同。

使用默认读取限制(每 IP 每秒 500 次、突发容量 1,200 次)时,有 37 次读取返回 HTTP 429。最终测试提高了 HTTP 上限,未降低负载生成器的请求速率。

按负载选择配置

工作负载可评估的配置
单台服务器、内部工具、可排队处理的写入使用实际读写比例测试 SQLite3
多个房间或资源持续密集写入考虑 PostgreSQL 或 MySQL/MariaDB
多服务器与复制评估外部 DB 及服务器之间的事件投递机制
实时投递延迟检查房间大小、消息大小、扇出和认证重新验证的开销

队列可以确定并发写入的顺序,但吞吐量仍有上限。此处连接数为同一账户的认证套接字数,未验证 10,000 个不同用户的完整业务流程或长时间持续负载。请结合生产环境的 TLS、代理、外网和实际工作负载比例进一步测量。

运行期间,可在运行概况中查看请求、错误、响应时间和 DB 状态。完整用户流程可通过制作实时五子棋游戏的示例验证。