1. 7.5 压测与性能调优
完成了 IM 系统的实现,本节我们进行压测,验证系统的性能表现。
1.1. 7.5.1 压测工具
zhenyi 提供了一个专门的压测客户端 im_multi_client_load,用于模拟大量客户端并发连接。
go run ./examples/im_multi_client_load
主要参数(与 examples/im_multi_client_load/main.go 一致):
| 参数 | 说明 | 默认值 |
|---|---|---|
addr |
Gateway 地址 | 127.0.0.1:8001 |
clients |
并发客户端数量 | 20 |
intervalMs |
每个客户端发送间隔(毫秒) | 1000 |
durationS |
压测持续时间(秒) | 30 |
room |
测试房间 | lobby |
prefix |
机器人昵称前缀 | bot |
msgLogin / msgJoin / msgSend |
与示例服务端 msgId 对齐 | 1 / 2 / 4 |
codec |
载荷编解码:json 或 msgpack |
json |
benchMode |
business:走登陆/进房/聊天;framework:压框架路径(须与服务端行为一致) |
business |
1.2. 7.5.2 单进程压测
启动服务器:
go run ./examples/im_single_demo
启动压测客户端:
go run ./examples/im_multi_client_load -clients=100 -intervalMs=100 -durationS=30
预期输出:
start load test addr=127.0.0.1:8001 room=lobby clients=100 intervalMs=100 durationS=30
progress elapsed=2.1s sent=1980 recv=1980 avg_send_qps=942.86
progress elapsed=4.1s sent=3960 recv=3960 avg_send_qps=965.85
progress elapsed=6.1s sent=5940 recv=5940 avg_send_qps=973.44
done elapsed=30.1s sent=9980 recv=9980 avg_send_qps=331.93
1.3. 7.5.3 多进程压测
启动 Etcd 和 NATS:
etcd
nats-server
启动 Gate 进程:
go run ./examples/im_multi_demo -process=1 -addr=127.0.0.1:8001
当前 im_multi_demo 仅支持单 Gate + 单 IM 两进程(见上一节 buildActors)。多 IM 压测需先扩展示例部署,再运行压测客户端。
启动压测:
go run ./examples/im_multi_client_load -clients=500 -intervalMs=100 -durationS=60
1.4. 7.5.4 性能指标
压测过程中关注以下指标:
| 指标 | 说明 | 解读 |
|---|---|---|
sent |
发送消息总数 | 随时间递增 |
recv |
接收消息总数 | 健康时与 sent 接近(房内广播会使每发一条对应多收,需结合业务模式看) |
avg_send_qps |
平均发送侧 QPS | 用于横向对比配置,不单独代表业务成功语义 |
| 延迟 | 端到端延迟 | 强依赖机器、网络、benchMode 与服务端实现;本工具输出以 QPS 摘要为主,若要 P50/P99 需在负载中带时间戳或接 第 6 章 的追踪/指标 |
1.5. 7.5.5 性能调优建议
如果压测中发现性能问题,可以从以下方面优化:
1.5.1. 1. 调整 Actor 协程池大小
cfg := zmodel.ActorConfig{
Id: 2,
Name: "im",
ActorType: ActorTypeIM,
WorkSize: 20, // 增加协程池大小
}
1.5.2. 2. 批处理与自适应批量
Actor Run 内从邮箱批量 Dequeue 的行为由 zmodel.FrameworkTuning 控制(ActorBatchMin / ActorBatchMax / ActorBatchTargetP99),在进程启动期通过 zmodel.SetFrameworkTuning 调整即可;ActorConfig 上没有 BatchEnabled 等字段(勿与并发模式的 ActorModeConfig 混淆)。
1.5.3. 3. 网络读缓冲
读路径缓冲由 zhenyi-base/znet 的连接与 BaseChannel 实现管理(含默认容量、TCP SetReadBuffer 等),不存在书中早先示意用的独立 ConnConfig{ReadBuffer: ...} 类型。若要做 OS 级 TCP 缓冲调优,需在连接建立路径或部署参数侧处理,并对照 znet 当前 API。
1.5.4. 4. 监控指标
暴露 Prometheus 抓取端点(需传入 context,便于与进程生命周期绑定):
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
srv := zmetrics.Enable(ctx, ":9090")
defer srv.Shutdown(context.Background())
抓取路径一般为 http://localhost:9090/metrics。常用指标名可参考 第 6 章 6.2 节(如 zhenyi_actor_msg_recv_total、zhenyi_gate_route_*、zhenyi_rpc_* 等)。
1.6. 7.5.6 典型性能数据
以下为留空台账:真实数字需在目标硬件与部署上跑 im_multi_client_load(及配套服务端)后自行填入。建议关注以下维度:
| 维度 | 说明 |
|---|---|
| 场景 | 单进程 / 多进程 |
| 客户端数 | 100 / 500 / 1000 |
| 消息大小 | ~100B / ~1KB |
| QPS | 消息处理吞吐量 |
| 延迟 | P50 / P99 延迟 |
1.7. 7.5.7 本节要点
- 压测工具:
im_multi_client_load,参数含codec、benchMode、可覆写 msgId。 - 读数方式:结合业务是单播还是房内广播解释
sent/recv;延迟需另建观测。 - 调优:
ActorConfig.WorkSize、zmodel.FrameworkTuning、zmetrics(见 6.2)与 OS/网络参数。
本章(7.1–7.5)与 第 6 章 可观测性、examples/im_* 示例保持对齐阅读。