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 载荷编解码:jsonmsgpack 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_totalzhenyi_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 本节要点

  1. 压测工具im_multi_client_load,参数含 codecbenchMode、可覆写 msgId。
  2. 读数方式:结合业务是单播还是房内广播解释 sent/recv;延迟需另建观测。
  3. 调优ActorConfig.WorkSizezmodel.FrameworkTuningzmetrics(见 6.2)与 OS/网络参数。

本章(7.1–7.5)与 第 6 章 可观测性、examples/im_* 示例保持对齐阅读。

results matching ""

    No results matching ""