系统压测指南

如何做压测

一.性能测试的基本理论

1.概念阐述

  • 吞吐量(TPS)
    • 吞吐量是指系统在单位时间内处理请求的数量。体现系统处理请求的能力,这是目前最常用的性能测试指标。
  • QPS(每秒查询率)
    • 官方说法QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。
    • 个人更倾向于理解为系统每秒处理完请求的次数。
  • 响应时间
    • 响应时间是指执行一个请求从开始到最后收到响应数据所花费的总体时间。它的数值大小直接反应了系统的快慢。
  • 并发数
    • 并发数是指系统可以同时承载的正常使用系统功能的用户的数量,或者理解为系统同时能处理的请求数量,这个也是反应了系统的负载能力。

2.系统性能描述

在IEEE的定义中:性能是系统或组件在给定约束中实现的指定功能的程度,诸如速度、正确性、内存使用等。

所以性能测试报告中,对系统性能的描述应该是多方面的,如:执行效率、稳定性、兼容行、可靠性、可扩展性容量等;其中,执行效率通过并发用户数、响应时间、吞吐量、成功率、资源消耗综合体现。

3.并发测试

性能测试有:负载测试、压力测试、配置测试、并发测试、容量测试、稳定性测试。其中,并发测试是测试多个用户同时访问同一个应用、同一个模块或者数据记录时是否存在死锁或者其他性能问题。

在实际的压测中,我们基本上都是设置多个并发,再进行负载测试、压力测试等,因为现实中,我们的系统就是面对多个用户的同时使用,并且,并发用户的数量,直接影响着系统资源的消耗,例如cpu、mem、网络连接、带宽等。

4.如何看待并发

  • 所谓并发,它的特点是“并行”和“同时”。

  • LoadRuner的并发很好理解,就是虚拟用户数。因为LR有个集合点,可以在所有虚拟用户初始化且到达集合点后,再一起执行后续操作,从而达到同时且并行的效果。但目前在后台性能测试,我们自己开发的工具大多不带集合点功能,这时候使用者对并发的理解就会有点混乱。

  • 实际上,所有的并发不可能做到完全同步,压测过程中由于各种影响,比如:各线程初始化速度不一样,连接数不够,处理速度不一样等,导致在并行节奏上相互有了偏差, 这种现象在系统接近性能瓶颈时,会更加突出。

  • “广义的并发实际上是在一个时间内操作事务的虚拟用户,而狭义的并发指的是单位时间内向系统发起请求的虚拟用户,前者是“存在”,后者是“请求”,勿容置疑,压力不仅仅受成功发出请求的用户带来的压力,同时也受“存在”的用户影响。”

  • 这样看来,工具中的connection数设置,更偏像是广义并发,代表着在压测时间段内虚拟用户总数,这也是并发原始值。而在后续的压测过程中,在单位时间内,并发数可能会动态变化,这里是狭义并发。

5.怎么理解压力

  • 压力就是并发在单位时间内对压测对象的请求数。 在我们的压测工具中,有一个配置项专门用来设置压力,可能是所有线程产生的总压力,也可能是单个线程产生的压力。
  • 压力不等于性能,压力只是检验性能的一种手段,对一个性能良好的系统,在一定的压力下,应该可以保持正常运转,如果超过负荷,则应该分流或化解压力,这也是我们需要检验的

  • 要特别注意:压力是由工具制造,工具的最大性能决定施加的最大压力。在测试过程中曾经遇到压测系统还没到极限,工具已经到瓶颈的情况,这时候得到的压测数据是错误的。

6.如何计算吞吐量

在性能测试中,吞吐量的计算有两种常见的公式:

  • 公式1: 吞吐量=并发数/平均响应时间

  • 公式2: 吞吐量=请求总数/总时长

关于并发的计算如下所示:

  • 并发=请求总数*平均响应时间 / 总时长
结论
  1. 在单接口压测时,我们用“请求总数/总时长”得到吞吐量;然后再用“吞吐量*平均响应时间”得到实际并发,此举可用来观察系统实际承受的并发;

  2. 在多接口压测时,由于短板效应,同一个流程中的所有接口获得的请求总数和总时长都一样,显然“请求总数/总时长”计算各个子接口的吞吐量不合适,所以改用“并发/平均响应时间”,其中的并发数应在压测工具中埋点统计,不可简单使用工具线程数。

二. 性能压测的一些注意事项

1.性能压测的基本原则

  • 无论是对哪个接口进行压测,发起测试的机器都要尽可能靠近被压测的应用服务器,这样才能得到更准确的压测结果(有效减少网络传输开销带来的干扰)

  • 排除非业务因素影响:压测前先确认硬件(CPU、内存、IO、网络等)、被压测接口用到的中间件(Redis、tikv,RabbitMQ等)的配置信息和健康状况。如果存在硬件故障或者中间件故障,则需要先排除掉

  • 确定压测目标,比如是压测tps、内存消耗量还是其他如要能支持多少并发用户

  • 确定一个压测基准,比如压测某个HTTP API接口的tps时,可以先压测心跳检测接口(业务逻辑最少),比如压测得到5000tps,那么就可以断定其他业务逻辑更复杂的HTTP API接口的极限tps不可能超过5000tps,无论你怎么优化(这里的优化特指业务性能优化,如果中间件优化了,则需要重新确定压测基准)

  • 一般先对单台服务器做压测,单台服务器压测达到期望的压测指标后再扩展到集群环境对多台服务器做压测

  • 一般cpu压到60%~70%就可以当作满了,一般这个时候就算高负载了,要扩容的

  • 压测服务器尽可能和线上服务器一致或者类似,确认发起测试的服务器本身不存在性能瓶颈(比如还没开始压测,发起测试的机器CPU就已经100%、测试机器在创建多一些线程的时候CPU增长很快)

  • 压测时先用少量并发用户、少量总请求数,然后逐渐增大并发用户数、总请求数。同时查看系统业务日志、系统负载情况(top)、系统资源消耗变化情况(vmstat)、GC情况和出错率等

  • 压测时间尽可能越长越好,以便观察系统在一段较长时间内的稳定性

  • 如果应用本身每次请求都会调用第三方服务接口,那么先对第三方服务接口做压测,先确认第三方服务接口不存在性能问题

2.压测流程

  1. 检查硬件和中间件配置信息和运行健康状况,比如连接最大连接数设置是否合理、tikv配置是否合理等,确保它们不会影响压测结果
  2. 确定压测目标,比如“压测mqtt-connect接口的极限,要求1000并发用户下能达到5000tps”。
  3. 部署应用到压测服务器,准备好发起测试的服务器(如果能和压测服务器一样最好,不能一样至少也要做到在同一个局域网内),然后用ping、traceroute查看下网络连通状况
  4. 确定压测基准,比如获取心跳检测请求的极限tps
  5. 构造尽可能接近真实用户访问情况的测试数据
  6. 逐渐增大并发量和总请求数,观察系统层面的各项指标和应用运行状况
  7. 有时候可能需要长时间让系统高负载运行,比如观察系统长时间处于高负载情况下是否会出现GC故障

3.总结经验

  • 压测时一定首先要确定你的压测指标,只有明确了压测指标后你才能对测试工具有着正确的使用姿势。

  • 压测时一切判断必须基于真实测量数据,不能想当然。比如认为某个环节的逻辑很少,然后武断地认为性能瓶颈肯定不会出在那个环节,然后就忽略测量这个环节的耗时

  • 可能不止一个环节存在性能瓶颈,比如某个请求会流经A => B => C => D四个环节,经过测量发现当前性能瓶颈存在于B环节(比如80%的时间都消耗在B环节),然后经过努力终于把环节B的耗时降下来了,也许你会发现吞吐量和平均响应时间还是上不去并且再测量后发现现在性能瓶颈又变成C了。原因是:实际上B和C两个环节都存在性能问题,只不过未对B环节调优之前,大部分请求流量都堵塞在B环节,导致到达C环节的请求流量压力非常小,所以C环节的性能问题也就凸显不出来了;而当排除B环节的性能问题后,C环节单位时间内接收到的流量剧增,自然而然C环节的性能问题就暴露出来了。也正因此,对于复杂的业务流程,压力测试很难做到一蹴而就,需要逐一排查突破

  • 尽可能自动化获取各个环节的性能数据。如果能通过一个集成的监控系统直观地观察到各个环节的耗时,那么对于诊断整个系统的性能瓶颈将非常有帮助(当你尝试过手动插入执行时间记录日志并收集分析后就能切身体会这点了)。同时监控系统也将为提升系统稳定性和可用性提供一大保障

  • 即使你依赖的一个服务号称能达到tps多少多少,号称性能有多快多快,也有必要先弄清楚它的压测场景(用多少数据测的、并发用户多少、总请求多少、测试请求数据是什么样的、能否复现)。确认没问题后还要再检查自己的压测设置有没有问题,比如一个高性能HTTP接口也可能因为你的网络环境或者HTTP客户端连接池大小设置不当、超时时间设置不当等原因而测不出你预期的性能

  • 高并发场景如果使用log4j(假如采用默认配置)打印大量日志,会对系统吞吐量造成巨大影响,因为默认log4j写日志是同步写,多线程并发写日志时会等待一个同步锁,

4.压测常用命令:

top:
  1. 工具(命令)名称: top
  2. 工具(命令)作用:

    • 显示系统当前的进程和其他状况;top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止. 比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.
  3. 使用方法 :top [-] [d] [p] [q] [C] [S] [s] [n]

  4. 参数说明:

    • -d 后接秒数,指定每两次屏幕信息刷新之间的时间间隔,表示进程界面更新时间(默认为5秒)。
    • -b,-n搭配,批次执行top ——> top -b -n 2 > /tmp/top.txt ####将top进程表在/tmp/top.txt中打印2次。
    • -p 通过指定监控进程ID来仅仅监控某个进程的状态。 ——> top -p 1 #查看进程号为1的进程。
    • -q 该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
    • -S 指定累计模式
    • -s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
    • -i 使top不显示任何闲置或者僵死进程。
    • -c 显示整个命令行而不只是显示命令名
  5. Linux下命令TOP中的常用交互命令

    1. 2500毫秒刷新一次TOP内容,总共5次,输出内容存放到performace.txt文件中。注:要将内容输出到文件中,必须使用-b,表示批处理选项.

      • top -b -d 2.5 -n 5 > performace.txt
    2. TOP命令如何快速按%CPU、%MEM、TIME+列排序,注:TOP默认排序为倒序,如果确实需要升序排序,可以使用大写字母按键:R

      • %CPU:使用大写字母按键:P
      • %MEM:使用大写字母按键:M
      • TIME+:使用大写字母按键:
    3. TOP命令中显示其它列值、将两列互换等

      • 选择显示列或隐藏列:使用小写字母按键:f
      • 交换列显示顺序:使用小写字母按键: o
      • 选择需要排序的列:使用大写字母按键:F

猜你喜欢

转载自blog.csdn.net/weixin_39843367/article/details/81704750