压测背景
测试分很多种,网上很多文章[1]会玩弄概念,搬出来3个名词:压力测试(Stress Testing)、性能测试(Performance Testing)、负载测试(Load Testing)。一般情况下并不需要做这么细粒度的概念区分,这3个概念我觉得是没办法完整区分各自边界的,至少在程序逻辑上难以做得到,更多差异只是来自于不同的压测策略,所以尽管忽略这几个概念的区别,都叫它压测或者性能测试即可。
为什么
全链路压测方案:一方面可让链路的各个系统知道自己的承压极限;另一方面可让各个系统有个明确的优化目标,了解到整个链路的瓶颈并评估资源情况。
压测指标
列举一些常用指标,并不一定都需要关注,根据业务考虑指标的细化粒度。
- QPS:Query Per Second,每秒处理的请求个数
- TPS:Transactions Per Second,每秒处理的事务数,TPS <= QPS
- RT: Response Time,响应时间,等价于Latency RT分平均延时,Pct延时(Percentile分位数)。平均值不能反映服务真实响应延时,实际压测中一般参考Pct90,Pct99等指标
- CPU使用率:出于节点宕机后负载均衡的考虑,一般 CPU使用率 < 75% 比较合适
- 内存使用率:内存占用情况,一般观察内存是否有尖刺或泄露
- Load指标:CPU的负载,不是指CPU的使用率,而是在一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息,表示CPU的负载情况,一般情况下 Load < CPU的核数*2,更多参考链接1和链接2
- 缓存命中率:多少流量能命中缓存层(redis、memcached等)
- 数据库耗时:数据库就是业务的生命,很多时候业务崩掉是因为数据库挂了
- 网络带宽:带宽是否瓶颈
- 接口响应错误率 or 错误日志量
平均值和分位值
性能测试中,平均值的作用是十分有限的,平均值代表前后各有50%的量,对于一个敏感的性能指标,我们取平均值到底意味着什么?是让50%的用户对响应时间happy,但是50%的用户感知到响应延迟?还是说50%的时间系统能保证稳定,而50%的时间系统则是一个不可控状态?平均值只是一个特殊的分位值,而且这个分位值在这里意义不大。
所以就有了 tp99, pct延迟等。