压测的一些思考
压测的目的,在于保证系统达到某个量级的情况下不会死掉,在岗位划分上,专门做这件事的人可以被称作 性能工程师 , 主要的工作就是做压测、性能分析、性能优化、服务可靠性提升。我们做压测,同样要向这些目标看齐,把整个系统的抗压能力提升起来。
整体来看,性能是一个系统工程,需要整个体系做配合,因此,性能可以提升到很高的高度,作为一个十分重要的事。当然,对于具体模块的性能优化,也可以是一个独立的模块,例如,对于部分 http 请求的性能优化、对于数据合并方式的性能优化。
站在类架构的角度考虑问题,可以考虑这些问题:
1 |
|
上面罗列的这些,只是一些可优化的方向,对于具体模块的优化,需要有针对性的分析。
从整个性能测试的流程上来看,可以分成以下部分:
性能需求指标
要有清晰明确的压测目标,目标需要根据场景进行划分。压测场景与模型
要有明确的模型知道真实业务场景如何,并据此构建性能测试时的模型。一般来说,可以有: ① 基准场景 ② 容量场景 ③ 稳定性场景 ④ 异常场景。我们当前的压测场景,主要是基于 基准场景 和 容量场景 两类做具体的压测。压测环境准备
需要尽量保证和线上近乎一样的数据量,近乎一样的基础设施。压测数据准备
需要尽量保证和线上近乎一样的数据。压测脚本尽量和真实业务场景一致。压测实施与监控
完善的监控体系,最好有压测时的监控大盘,主要的目的是能近实时地发现性能瓶颈点。压测数据收集
指标有哪些,如何收集。常见的指标,类似于: ① TPS 平均值 ② TPS 95分位值 ③ 系统资源使用(CPU、MEM、load average、net、disk iops) ④ 中间件状态(mongo、redis、kafka、db)性能分析与证据收集
压测报告与优化方案
优化实施控制
需要建立优化的反馈机制,保证优化方案得到落实,并且优化结果证明优化确实有效。
整个性能测试的体系,可以参考:
要关注的内容:
资源层面:
- 网关的网络流量
- ingress的网络流量
- node的网络情况
- node的socket连接情况
- node的CPU使用情况
- node的mem使用情况
- pod的网络情况
- pod的socket连接情况
- pod的cpu使用情况
- pod的mem使用情况
中间件层面:
- mongodb的cpu和内存消耗
- mongodb的平均响应时长
- mongodb的缓冲队列
- mongodb的iops
- mongodb的ops
- redis的平均响应时间
- redis的慢响应
- redis的qps
- redis的内存耗用情况
- redis的命中率等
- pg的平均响应时间
- pg的慢响应
- pg的qps
- pg的内存使用情况
- kafka的情况?[待补充]
业务指标层面:
- api 的接口响应时长
- api 的错误率
- task 的数量
- task 的平均处理时长
- messenger的ws握手时长
- messenger的消息吞吐量
- messenger的消息送达率
- messenger的消息顺序性
- messenger的报错情况
- merger的消息吞吐量
- merger的消息平均处理时长
- merger的报错情况
- 单个文件的消息处理能力(从客户端角度)
目标:
- 从基础设施的角度,弄清楚一些基础基准测试。
- 从业务的角度,弄清楚不同量级下,我们的瓶颈将会是什么,如何证明。
执行记录:
- 当前 【所有】 配置情况
- 执行操作计划 (何时开始,何时停止)
要做的事:
- 对各个模块做 bench,例如,网络、磁盘、中间件,得到基准值。 各个模块要做的基准测试
- 对 lancer-service 的相关模块抽取出来,作为独立的压测工具,增加对每条消息的统计,增加分析查询接口。
- 针对需要覆盖的性能测试场景,做好数据准备。
其他的一个想法:
如何让想法得到落地,以达到真正促进业务发展的目的? => 成为一个对性能负责的人。
一些问题:
- 是否需要线上全链路压测?
没必要。压测的目的,是尽量还原真实业务场景下,为了达到既定的性能需求指标,找到性能瓶颈并优化,同时保证在既定水位线以内系统不崩溃。那么,我们只要能尽量还原真实业务场景即可,通过增加一定的冗余来解决模型偏差带来的不准确即可。线上压测有两大问题: 1. 开发成本高,人员精力分配上存在问题。2. 需要对系统掌控能力很强,几乎不能出错误,否则影响面将非常广。
要做的一些事:
- 梳理当前要做的压测目标,使用更专业的流程框架,赶紧做出第一版压测。
- 建立整个性能测试过程的控制文档,将性能测试标准化。
- 和他人协作、交流、培训,让其他人也能很快上手性能测试。
文档直通车:
How many cares one loses when one decides not to be something but to be someone.
— Coco Chanel
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!