为什么要压测

这个问题问的其实挺没有必要的,做开发的同学应该都很清楚,压测的必要性,压力测试主要目的就是让我们在上线前能够了解到我们系统的承载能力,和当前、未来系统压力的提升情况,能够评估出当前系统的承载情况能不能满足当前和未来一段时间的正常运行。压力测试也让架构师和开发人员能够对自己负责的系统做到心中有数,当有大并发需求的活动或者其他突发事件导致的访问暴增,能够提前做好预估和准备应急预案。

压测难点

说了那么多,都是压测的必要性,那么既然要测那么重要,我们每次发版本都做一下压测不就好了,这么说的同学一定是没真正参与过压测的,参与过压测的同学都是谈压测色变,不管是测试人员还是开发人员都很害怕压测。大家为什么这么害怕压测,主要原因主要有下面这些压测的难点导致的:

1)压测环境难准备

在日常工作过程中,我们肯定遇到过压测环境难申请的问题,为什么难申请主要是因为压测一般要求环境和生产环境一致,那么就意味着压测机器资源的稀缺,没有哪家公司会长期准备所有系统的压测环境,毕竟成本太高,所以一般公司都是准备一些机器让所有系统共用压测环境,每次一个系统要做压测之前都要把上一个压测系统的数据和应用版本、中间件、数据库停掉或删掉,这是非常浪费时间的工作,所以很多公司现在在压测的环境准备都使用docker来准备环境,只需要定期更新docker image就可以,这就可以做到快速还原环境,需要用的时候直接把被测系统的docker image拉下来就行了,所以压测环境已经不再是我们的问题了。

2)压测数据难准备

在压测过程中还有个难点就是压测数据准备,如何能尽量真实的模拟生产的数据,最简单的就是录制一段时间生产的访问报文,然后在用压测环境进行正常回放和倍数回放。录制生产真实报文的工作,目前还没有遇到特别好的工具,大部分公司都是自己写个工具进行网络层面的嗅探,将嗅探到的生产报文再加工成Jmeter或者LoadRunner这些压测工具能够识别的压测脚本。这个工作其实只要搞通了一遍以后也没有那么复杂了。

3)压测工具使用复杂

压测工具曾几何时不管是测试人员还是开发人员都觉得很高大上,很难使用和学习,其实这个观念在10年前确实是这样的,但是随着越来越多的开源压测工具的兴起,那些复杂又笨重的商用压测工具渐渐被大家淡忘,现在有很多开源的服务端压测工具,使用起来还是很简单的,而且该有的功能基本都有了,前面废话了那么多,就是要说明压测已经不像以前那么复杂了,现在通过简单的环境配置和工具就可以快速的完成一次压力测试,环境准备这个我帮不了大家,今天文章重点就是介绍下开源压测工具的翘楚“Jmeter”的使用和结果分析,让大家爱上压测。

压测指标

压测结果指标基本概念:

  • Samples:表示一共发出的请求数
  • Average:平均响应时间,默认情况下是单个Request的平均响应时间(ms)
  • Error%:测试出现的错误请求数量百分比。若出现错误就要看服务端的日志,配合开发查找定位原因
  • Throughput:简称tps,吞吐量,默认情况下表示每秒处理的请求数,也就是指服务器处理能力,tps越高说明服务器处理能力越好

我们常用的压测指标其实并不多,主要就是用户并发量和tps,一般这两个指标是一起使用的,就是在用户这么大的并发量的前提下tps是每秒多少。这么说有点绕口,举个简单的例子,500个用户同时发起服务请求,服务端能够稳定正确处理的交易数。这里能够稳定正确处理的交易数就是我们常说的tps,也叫做服务处理吞吐量,例子中提到的500个用户同时发起服务请求,“同时发起”也很容易被误解,这里说的500用户同时发起请求是指的是500个用户同一秒钟发起的请求,并不是系统同时只能承载500个在线用户,这两个概念是完全不一样的,在制定指标的时候千万不要搞混,尤其是和业务人员沟通的时候一定要说清楚。一般来说我们会统计一段时间生产环境当前在线用户的会话数和接口当时被调用的次数,做个线性的乘数,通过这个乘数可以根据最后压测出的数据来评估系统大概能够承载的用户数。

使用Jmeter随时压测

下面我们就详细介绍下如何使用Jmeter来进行服务端接口压测,Jmeter安装起来非常方便,只需要去官网下载解压直接运行shell就可以了。

官网下载地址:http://jmeter.apache.org/download_jmeter.cgi

基本概念

在介绍如何使用Jmeter之前先介绍下Jmeter里的一些基本概念:

1)测试计划是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器。

2)线程组:代表一定数量的并发用户,它可以用来模拟并发用户发送请求。实际的请求内容在Sampler中定义,它被线程组包含。可以在“测试计划->添加->线程组”来建立它,然后在线程组面板里有几个输入栏:线程数、Ramp-Up Period(in seconds)、循环次数,其中Ramp-Up Period(in seconds)表示在这时间内创建完所有的线程。如有8个线程,Ramp-Up = 200秒,那么线程的启动时间间隔为200/8=25秒,这样的好处是:一开始不会对服务器有太大的负载。线程组是为模拟并发负载而设计。

3)取样器(Sampler):模拟各种请求。所有实际的测试任务都由取样器承担,存在很多种请求。如:HTTP 、ftp请求等等。

4)监听器:负责收集测试结果,同时也被告知了结果显示的方式。功能是对取样器的请求结果显示、统计一些数据(吞吐量、KB/S……)等。

5)逻辑控制器:允许自定义JMeter发送请求的行为逻辑,它与Sampler结合使用可以模拟复杂的请求序列。

6)断言:用于来判断请求响应的结果是否如用户所期望,是否正确。它可以用来隔离问题域,即在确保功能正确的前提下执行压力测试。这个限制对于有效的测试是非常有用的。

7)定时器:负责定义请求(线程)之间的延迟间隔,模拟对服务器的连续请求。

8)配置元件维护Sampler需要的配置信息,并根据实际的需要会修改请求的内容。

9)前置处理器和后置处理器负责在生成请求之前和之后完成工作。前置处理器常常用来修改请求的设置,后置处理器则常常用来处理响应的数据。

创建一个压力测试

  1. 创建线程组

通过右击测试计划->添加->Threads->线程组,进行线程组的创建。

 
Screenshot 2018-08-20 16.13.16

线程组创建好了需要设置线程组,从设置界面其实可以知道主要的设置内容是线程数、Ramp-Up Period、循环次数、取样错误后执行的动作。

 
Screenshot 2018-08-20 16.13.38

2)创建Http请求

从图上大家可以看到除了可以添加http请求还可以增加Java、JMS、FTP、JDBC等等,因为http请求用的最多所以这里我们就介绍创建http请求JSON接口的具体操作。

 
Screenshot 2018-08-20 16.12.10

添加好Http请求,设置Http请求参数,这里设置http请求参数和我们使用一般调用一个http接口一样,主要需要设置几项内容:

协议:http还是https,这里我们设置http。

服务器名或IP地址:这里设置成自己项目的IP地址或域名。

端口:服务端口这里根据自己项目服务开放的端口来设置。

http请求方法(GET、POST、PUT等)

接口上下文路径:对应你要测试的接口上下文路径。

报文体:因为接口是JSON格式的,按照JSON格式送报文就可以了。

 
Screenshot 2018-08-20 16.14.55

设置Http Header,在创建的Http请求上右击,选择添加->配置元件->HTTP信息头管理器。

 
Screenshot 2018-08-20 16.15.41

因为是http JSON接口所以需要设置报文头里的Content-Type为application/json

 
Screenshot 2018-08-20 16.16.06

压测结果分析

Jmeter对于压测结果可以设置多种监听器来查看结果,可以设置图形结果、结果树、断言结果、聚合报告等多种展示形式。下面分别给大家看下我比较常用的两种压测报告图形结果和聚合报告,这两个结果基本可以满足日常压测结果分析的需求了。

 
Screenshot 2018-08-20 16.16.56

图形结果可以比较直观的查看到压测的结果数据,红色线表示偏离平均值的交易曲线,蓝色线表示平均响应时间,绿色线表示交易吞吐量,这里要注意下默认的吞吐量的时间单位是分钟。

 
Screenshot 2018-08-20 16.17.12

这个是聚合报告,能够比较比较系统的所有被测接口的数据查看报告情况。

 
Screenshot 2018-08-20 16.17.33

测试报告分析思路:

1)Error%:确认是否允许错误的发生或者错误率允许在多大的范围内;

2)Throughput:吞吐量每秒请求的数大于并发数,则可以慢慢的往上面增加;若在压测的机器性能很好的情况下,出现吞吐量小于并发数,说明并发数不能再增加了,可以慢慢的往下减,找到最佳的并发数;

3)压测结束,登陆相应的web服务器查看CPU等性能指标,进行数据的分析;

4)最大的tps:不断的增加并发数,加到tps达到一定值开始出现下降,那么那个值就是最大的tps。

5)最大的并发数:最大的并发数和最大的tps是不同的概率,一般不断增加并发数,达到一个值后,服务器出现请求超时,则可认为该值为最大的并发数。

6)压测过程出现性能瓶颈,若压力机任务管理器查看到的cpu、网络和cpu都正常,未达到90%以上,则可以说明服务器有问题,压力机没有问题。

7)影响性能考虑点包括:数据库、应用程序、中间件(tomact、Nginx)、网络和操作系统等方面。

总结

这篇文章先介绍了压测的重要性,又简单介绍了下我们常用的压测指标,最后重点介绍了下如何通过轻量级开源的Jmeter完成一次http接口的压测,并介绍了下测试报告分析的一个思路,轻量级的Jmeter可以让大家更加方便快速的开展压力测试,尤其对于压测条件不是很充分的小团队,使用这样的开源方案可以很方便的开展压测工作,让自己对系统的情况更加了解,最后希望大家都能够将Jmeter用起来。

作者:monkey01
链接:https://www.jianshu.com/p/3cc4dd32a89a
来源:简书

Jmeter让压测随时做起来(转载)的更多相关文章

  1. Jmeter阶梯式压测

    https://www.cnblogs.com/Zfc-Cjk/p/11639219.html 什么是阶梯式压测? 阶梯式压测,就是对系统的压力呈现阶梯性增加的过程,每个阶段压力值都要增加一个数量值, ...

  2. jmeter接口压测的反思

    jmeter接口压测的反思 1.keepalive的坑:连接数满了,导致发起的请求失败. 2.token关联?是数据库取做参数化,还是随机数生成(需要改代码) 3.签名问题如何处理? 4.压测负载机端 ...

  3. JMeter分布式压测实战(2020年清明假期学习笔记)

    一.常用压力测试工具对比 简介:目前用的常用测试工具对比 1.loadrunner 性能稳定,压测结果及颗粒度大,可以自定义脚本进行压测,但是太过于重大,功能比较繁多. 2.Apache ab(单接口 ...

  4. lesson5:利用jmeter来压测消息队列(activemq)

    本文讲述了利用jmeter来压测消息队列,其中消息队列采用apache的activemq,jmeter本身是支持符合jms标准消息队列的压测,由于jmeter的官方sampler配置比较复杂,本文直接 ...

  5. lesson4:利用jmeter来压测数据库

    本文讲述了如何利用jmeter来压测数据库,事例中选取了mysql作为测试数据库,其它的数据库也是一样,只需要更换驱动程序即可. 准备工作:a.mysql数据库安装,请自行百度:b.jdbc驱动包,请 ...

  6. jmeter 分布式压测(windows)

    单台压测机通常会遇到客户端瓶颈,受制于客户机的性能.可能由于网络带宽,CPU,内存的限制不能给到服务器足够的压力,这个时候你就需要用到分布式方案来解决客户机的瓶颈,压测的结果也会更加接近于真实情况. ...

  7. jmeter简单压测设置

    参数化 随机参数 时间参数 顺序自增函数  文件读取  直接引用 响应断言 用来查看sessionid 关联 关联引用 jmeter操作数据库 安装连接程序包 ip 端口号 哪个数据库 可以执行多条s ...

  8. 压力测试(八)-多节点JMeter分布式压测实战

    1.Jmeter4.0分布式压测准备工作 简介:讲解Linux服务器上jmeter进行分布式压测的相关准备工作 1.压测注意事项 the firewalls on the systems are tu ...

  9. jmeter静默压测+可视化

    静默压测自动化脚本auto_stress_test.sh #!/usr/bin/env bash export jmx_template="test2" export suffix ...

随机推荐

  1. 数据库中取出YYYY-mm-dd H:i:s的数据怎么将其转化成YYYY/mm/dd格式,另外,怎么将一个数据表中的数据插入另一个数据表

    sql语句是select  left(replace(rq,'-','/'),10) as rq from 表名 tp5.1中的写法 $res = Db::table('表名') ->field ...

  2. Js调用Android回调处理

    通常在混合app中经常会使用js调用native的方法,一般是: window.nativeApp.call(XXX); 直接调用native方法,对于简单的处理倒是可以,如果需要回调呢?期待的方式是 ...

  3. 手把手golang教程【二】——数组与切片

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第五篇,这一篇我们将会了解golang中的数组和切片的使用. 数组与切片 golang当中数组和C++中的定义类似, ...

  4. 仅需60秒,使用k3sup快速部署高可用K3s集群

    作者简介 Dmitriy Akulov,连续创业者,16岁时搭建了开源CDN公共服务jsDelivr的v1版本.目前是边缘托管平台appfleet创始人. 原文链接: https://ma.ttias ...

  5. Linux相关命令、虚拟机网络配置

    虚拟机联网 Linux命令 1.查找 #查找django进程,不包括grep自建的 ps -ef |grep django | grep -v grep # find 查找home目录下的name.t ...

  6. Win32 Sdk 连接Access数据库

    /************************************************************* *** MyWinClass.cpp 创建窗口模板 *** vs2017+ ...

  7. 【Python代码】TSNE高维数据降维可视化工具 + python实现

    目录 1.概述 1.1 什么是TSNE 1.2 TSNE原理 1.2.1入门的原理介绍 1.2.2进阶的原理介绍 1.2.2.1 高维距离表示 1.2.2.2 低维相似度表示 1.2.2.3 惩罚函数 ...

  8. POJ1948 Triangular Pastures

    POJ1948 Triangular Pastures #include <iostream> #include <cmath> using namespace std; ; ...

  9. linux常用命令---文件权限操作

    文件权限

  10. 【python 】文件下载进度条(装逼利器)

    基础版 import requests url = "http://mp.111ttt.cn/mp3free/81135985.mp3" rsp = requests.get(ur ...