首页 > 技术文章 > 服务端压测怎么做

zingphoy 2020-05-03 22:58 原文

本文始发自博客:[服务端压测怎么做](https://zingpho y.github.io/2020/04/26/%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%8E%8B%E6%B5%8B%E6%80%8E%E4%B9%88%E5%81%9A/)

博文的内容并不都是我原创的,行文思路来源于一次内部分享,再结合网上众多参考资料总结出来的,算是一个学习笔记。

可能很多QA、RD同学跟我都一样,对服务端压测一直没有系统的认知,印象停留在使用压测工具如Jmeter对单接口发压,调整线程数和循环数来制造不同压力,最后计算一下TPS和成功率等就完事了?网上虽然有不少压测相关的文章,但多数是压测工具的入门级使用,有的是压测流程和指标的简单解释,或者就是几个大厂牛逼的全链路压测能力和压测平台的介绍。这些文章要不缺少系统性阐述,要不过于抽象不好理解,对没怎么接触过压测的同学不太友好。

我裂开了

本文尝试在QA角度梳理一次完整的压测过程,尝试总结更为普适的压测思路,给大家提供更有意义的参考。


压测背景

测试分很多种,网上很多文章[1]会玩弄概念,搬出来3个名词:压力测试(Stress Testing)、性能测试(Performance Testing)、负载测试(Load Testing)。一般情况下并不需要做这么细粒度的概念区分,这3个概念我觉得是没办法完整区分各自边界的,至少在程序逻辑上难以做得到,更多差异只是来自于不同的压测策略,所以尽管忽略这几个概念的区别,都叫它压测或者性能测试即可。

为什么需要压测

拿技术人熟知的阿里举例,应该是国内做压测最好的一个大厂。外界熟知的阿里2012双11活动,2012年11月11日零点,阿里各种系统报错、立刻下单报错、购物车支付报错、支付系统报错、购物车的东西丢失,系统显示交易成功率不到50%,产生了大量超卖,给阿里带来很大的损失。那一年的双11后,库存、商品、退款和相应数据库的同学,为了处理超卖导致的问题,没日没夜加了两周的班,同时给了用户不少糟糕购物体验。

为什么出现这么严重的问题?因为对整个全交易链路上的各个子系统的承受能力不清楚,并且错误预估了可能会达到的流量,也没有完善的预案,兵败如山倒。

2013年阿里首次提出了全链路压测方案:一方面可让链路的各个系统知道自己的承压极限;另一方面可让各个系统有个明确的优化目标,了解到整个链路的瓶颈并评估资源情况。

单系统压测与全链路压测

为什么只做单系统压测还不够呢?

在活动开始的瞬间,各系统都面临自身服务的巨大的压力,而系统之间是有互相依赖关系的,单机压测没有考虑到依赖环节压力都比较大的情况。一个系统出现故障,故障会在链路流转过程中层层累加,会造成无法评估的影响。

所以最可靠的方式是完全模拟真实场景来压测,通过线上全链路压测提前发现问题。

压测流程

完整的压测流程一般包含下面几个步骤,引用自文末参考资料

  1. 压测目标的制定
  2. 压测链路的梳理
  3. 压测环境的准备
  4. 压测数据的构造
  5. 发压测试
  6. 瓶颈定位及容量微调
  7. 压测总结

常规压测流程


压测目标

压测作用

  • 新服务,无预估目标,需要通过压测得到服务基准数据或找到系统瓶颈进行优化
  • 有明确的压测目标,需要通过压测确定服务的各项指标是否达标
  • 常态化压测,为后期性能优化指导方向或提供参考依据

压测指标

列举一些常用指标,并不一定都需要关注,根据业务考虑指标的细化粒度。

  • 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 错误日志量

这里要说明一下QPS和TPS的区别:

  • QPS一般是指一台服务器每秒能够响应的查询次数,或者抽象理解成每秒能应对多少网络流量
  • TPS是指一个完整事务,一个事务可能包含一系列的请求过程。举个

推荐阅读