简单谈谈我们最近是如何给GS做压测的。
1. 压测机器人
压测机器人需要满足如下几个条件:
- 异步请求: 异步才能模拟真实的客户端请求和压力
- 数据同步: 像客户端一样缓存和处理服务器响应数据,这样才能做好有效请求和可重入
- 可重入: 机器人应该可以在任何时候关闭/重启,而不应该假设初始状态(比如只有注册的时候能跑)
- 随机性: 机器人行为尽可能随机分布,并且每次重启重新初始化随机种子
2. 压测用例
压测用例可以从这几个方面来考虑:
- 服务器比较耗时的API: 如寻路,战斗等
- 玩家越多越耗时的逻辑: 如视野同步,消息广播等
- 玩家日常操作频繁的行为: 如城建升级,联盟加入退出,以尽可能覆盖如任务,BUFF,排行榜等支撑系统
3. 压测统计
在做压测中,我们会从如下几个方面来获取性能指标:
- 函数级分析: go prof简单易用,参考go pprof性能分析
- 消息级统计: 统计每个逻辑Actor(如地图,玩家)对单次请求的处理时间(最大/平均/次数),消息是Actor之间交互的最小单位,每个消息处理过程是一条函数调用链
- 服务器请求统计: 统计每条客户端请求从网关层收到请求到网关层发出响应的时间差(最大/平均/次数),相比消息级统计,服务器请求统计包含了多个Actor处理请求相关若干消息的时间,以及Actor之间的路由和通信开销
- 客户端请求统计: 统计从请求发出到收到响应的处理时间(最大/平均/次数),相比服务器消息统计,多了网络层的时延和机器人本身的处理时间,这是最接近客户端实际体验的指标