JMeter性能测试实现与分析分享
JMeter是由著名开源软件巨头Apache组织开发的纯Java的压力测试工具,它即能测试动态服务(WebService),也能测试静态资源,包括Servlet服务、CGI脚本等,还能测试动态语言服务(PHP、Java、ASP.NET等)和数据库和FTP服务,测试结束之后能够根据测试的脚本设置和服务器设置环境,天生可视化的测试报告图表。本文以测试基于HTTP请求的WebService服务为例进行讲解。1. 环境与设置
下载安装
JMeter的使用非常简单,下载之后,如果是Windows体系,运行bin目录中的jmeter.bat即可,如果是UNIX-like体系,运行jmeter.sh即可。
别的,JMeter还支持以下令行方式运行。一般的下令方法是如许的:
jmeter.sh -n -t test_plan.jmx -l output_log.jtl
-n 通知JMeter以非GUI方式运行
-t 指定将要运行的测试计划,测试计划本质上一个XML文件
-l 指定测试结果集输出文件,这个文件本质上是一个CSV文件
如果以下令行方式运行,必要修改bin目录中的jmeter.properties文件中的jmeterengine.force.system.exit这个选项,原因是以下令行方式运行时是无法对GUI窗口实行关闭利用的,这会导致UI线程永久都不会退出,这种线程死锁的环境会被JMeter以为是非常而报错。
JMeter运行时会创建日志,对于未开启UAC的Windows用户,利用没有任何影响,日志文件是保存在bin目录中的,也就是说是和jmeter.bat文件保存在一起的,但是对已经开启了UAC的用户来说,如果选择以管理员权限运行jmeter.bat,并且启动了凭证验证机制,那么日志文件将不会与jmeter.bat保存在一起,因为Windows下的bat文件是被cmd.exe(下令提示符,Windows的下令行Shell程序)所分析和实行的,而cmd.exe这个程序是在C:\Windows\System32这个目录下的(我们假定你的体系安装在C盘),所以启动程序的进程上下文环境发生了变革,所以日志文件也会保存在C:\Windows\System32这个目录中,更严重的,在某些环境下会因为CLASSPATH设置与JMeter运行环境出现不划一而导致找不到相应的Jar包,出现java.lang.ClassNotFoundException。究竟上这个问题是可以被处理惩罚的,所以,可以以为这是jmeter.bat程序的一个BUG。
关于什么是UAC,官方有详细介绍,请点击这里查看,点击这里还可以看到一个更简单的介绍和说明。
环境要求
JMeter 3.0于今年5月中旬发布,与之前的版本不同,这个版本明确要求JDK 1.7以上版本的支持,保举使用JDK1.8版本,并且这个版本的JMeter中使用的Apache HttpClient库的版本也已经更新到了4.5.2。
如果用户使用JMeter 2.10或者更早的版本,那么JMeter中集成的是HttpClient库的3.1以致更低的版本,此时如果被测试的Java请求是使用HttpClient库的4.5及以上版本编译的,那么运行时会出现莫名其妙的网络错误,这是因为HttpClient库的版本不兼容造成的,解决方法是在自己引用的Java请求中使用HttpClient3.1版本,和JMeter保持划一。然而保举的方式是改用JMeter3.0以上版本,因为官方已经明确声明自JMeter3.0起,HttpClient3.1的版本兼容性支持将被废弃。
JMeter3.0以上版本提供了很多新功能,修复了性能上的几个问题,而且HttpClient4.5以上版本也改进了一些功能,修复了退出时长期连接未关闭的BUG,改进了对HTTPS的支持。
2. 实行测试
几个概念
测试计划,也就是Test Plan,是整个测试任务管理的顶级单元,所有的对于测试任务的设置,都是放在测试计划中的。这就似乎一个根目录一样,所有的文件和数据,都是保存到这个根目录之下的。
线程组,也就是Thread Group,是可以被独立调试、实行和调度的独立单元,一个测试计划中可以有多个线程组,每个线程组可以设置并发用户数、运行次数、并发加压强度、定时任务等参数。
取样器,也就是Sampler,是一个HTTP请求的所有逻辑关系承载,在这一个取样器中,可以设置请求目标服务器的主域名、请求路径、参数、请求头信息、客户端Cookie计谋等。
监听器,也就是Listener,是对测试过程和测试数据的收集机制,最常用的是聚合报告(Aggregate Report)和逻辑控制器,也就是Logic Controller,在这里可以设置多个取样器的控制逻辑,比如我们通常都会有登录服务只访问一次,而数据服务或者查询服务要访问多次,此时可以通过只访问一次登录接口,然后根据需求对数据服务或者查询服务进行压力测试的方式完成。
设置元件,也就是Config Element,这里最常用的功能,是对HTTP请求的DNS计谋、缓存计谋、Cookies计谋、Header信息、认证机制等信息进行设置,对于必要实现请求参数化的,还可以使用CSV Data Set Config功能。
设置任务
创建一个线程组,在TestPlan上点击右键,选择Add->Threads(Users)->Thread Group即可完成一个线程组的创建。
并发数:在Number of Threads(users)中设置,设置更多的用户将必要更多的内存,一般环境下,如果并发数设置为1000,循环数设置为10,运行时必要的内存将会再700MB到1GB左右,在此数值之上时必要对JVM进行调优,否则有可能因为JVM或者测试机器性能问题导致测试数据禁绝确,以致有可能导致JMeter无响应造成任务失败。
聚集点:在Ramp-Up Period(in seconds)中设置,这里可以控制加压强度,这个设置项的意义是多少秒之内完成所有用户的加压,在此处设置一个恰当的值,再勾选设置项Scheduler,然后设置其中的Startup delay(seconds)选项即可完成聚集点的设置。从而到达每n个用户一起并发请求如许的结果。
循环数:设置Loop Count即可,如果勾选了Forever,就是永久运行,除非用户手动停止。如果是在下令行上运行的测试计划,并且启用了这个选项,只能使用CTRL+C强行中止,如果任务是被使用类似于nohup如许的方式运行在后台的,只能强制杀死进程完成退出利用,不过这种方式下不用担心测试数据丢失,因为JMeter对测试数据的输出和保存是实时的。
检查点:设置检查点之前,必要先为线程组添加一个取样器,我们以HTTP Sampler为例,在线程组上点击右键,选择Add->Sampler->HTTP Request即可,取样器添加完成之后,必要先对此取样器设置主域名,访问路径,内容编码,超时时间、提交参数等诸多信息和参数。设置完成之后,在此取样器上点击右键,选择Add->Assertion->Response Assertion,然后对这个响应断言进行设置,它支持Contains(包含)、Matches(匹配)、Substring(子字符串)、Not(非运算)四种方式。特别的,我们不必要对Patterns to Test中的内容进行字符转义。
参数化:待完善。
设置其他测试选项,最常用的其他测试选项,是HTTP Request的头信息,通过这个功能可以设置HTTP请求提交时的Header信息和参数,设置方法是在取样器上点击Add->Config Element->HTTP Header Manager,然后就可以添加一个HTTP头信息管理器,然后添加若干参数用于提交HTTP请求时提交到服务器。
实行测试
单个实行:在线程组上,点击右键,选择Start,即可按照此线程组设置的并发数的循环数启动此线程组进行测试。
验证实行:这个功能是JMeter3.0之后才有的功能,在线程组上,点击右键,选择Validate即可运行一次,无论并发数和循环数是多少,只运行一次,可以在修改参数之后快速验证此线程组是否正确。
部分实行:当一个测试计划中有多个线程组的时间,可以按住CTRL键单个选择或取消选择,也可以按住SHIFT键一连选择多个线程组,选择了自己想要实行的线程组之后,在被选择的多个线程组的恣意一个上点击右键,选择Start即可实行被选择的线程组,这些线程组会按设置的所有参数立即启动。
全量实行:在测试计划上点击左键选中它,然后点击下令栏的Start按钮,或者菜单Run->Start下令,或者按下CTRL+R快捷键,都会立即启动整个测试计划下的所有线程组开始实行测试任务。
服务器监控
先介绍几个最常用的服务器状态监控工具:
top Linux自带的经典的体系性能环境查看工具
htop 这是一个第三方工具,用C语言写成,必要下载、编译和安装,是top下令的改进版本,功能非常强大,视觉结果很好
glances,这是类似于htop的一个工具,使用Python写成,必要Python3.4以上版本的支持,通过Python的pip3即可一键完成安装,和htop一样,功能强大、视觉结果很好
free Linux自带的下令,用于查看内存状态
vmstat Linux组件,用于快速查看体系的性能状态信息
nmon 这是一个第三方工具,绿色免安装,使用C语言写成,它的原理是轮询和收集/proc下的体系运行信息,然后进行分析整理,所以必要nmonChart的共同,可以天生非常直观和美丽的性能图表,并且通过设置可以实现动态分析和在线查看。老版本的nmon会天生一个带有VB宏的Excel文档,然后下载下来之后必须使用Excel打开并且必须启用宏功能,这种方式既不安全也很贫苦,已经被镌汰了。
iftop 这是一个第三方工具,必要下载并且编译安装才能使用,iftop工具最新版本0.17的安装文件中对依赖包没有处理惩罚,所以如果编译失败,必要我们手动检查libpcap、libpcap-devel、ncurses、ncurses-devel这几个依赖包是否正确安装,安装完毕直接输入iftop即可启动,可以非常直观地看到网络设备的连接速度环境。
分析结果
基础分析和查看,要想快速查看测试任务实行环境,必要对每一个取样器都设置结果树和断言结果,利用方法很简单,在取样器上点击右键,选择Add->Listener->Assertion Result即可添加一个断言结果,这种环境下对每一次请求结果的断言检查是否乐成,会立即看到,固然,如果断言失败,这条测试用例也就失败了。添加结果树的方法同样简单,在取样器上点击右键,选择Add->Listner->View Results Tree即可,添加结果查看器的好处很多,可以看到取样器的每一次请求的提交参数、时间等所有信息以及响应结果,便于深入细致的分析测试实行环境和乐成与失败的原因。
综合查看,综合查看结果,必要添加聚合报告,利用方法是在线程组中点击右键,选择Add->Listner->Aggregate Report,添加聚合报告的好处是能够查看到此线程组下的所有取样器的实行次数,寻常时间、中值时间、最大时间、最小时间、失败率、吞吐量等非常实用的测试数据。
3. 其他细节问题
1)将测试结果保存到Excel表格
Excel表格具有非常强大的数据分析和统计汇总能力,将海量的测试数据导出到Excel表格黑白常实用的,利用很简单,在线程组上点击右键,选择Add->Listner->View Results in Table,然后在Write results to file /Read from file中的Filename中填入一个指定的文件名即可,文件的扩展名最好是CSV,如许可以直接使用Excel打开。
2)全局分析
有多个线程组时,逐个分析比较贫苦,也倒霉于效率提拔,只必要在TestPlan上点击右键,选择Add->Listner->Aggregate Report,即可对整个测试计划的所有线程组的测试实行环境一目了然,非常方便和实用,对于测试结果集,还可以点击Save Table Data将它保存到CSV文件中,然后直接用Excel打开,可以很快的自动转换成非常美丽的图表。
4. 横向对比
1) 与Apache HTTP Server的ab工具对比
不同之处
ab工具对设置HTTP请求头状态、GET参数、POST提供数据和PUT提交文件,利用不敷直观
ab工具对HTTPS的支持,必要单独编译的版本,默认的版本是不支持的,而ab工具并不能单独编译,因为它使用了Apache Portable Runtime(APR,可移植运行时库)中的源码,所以必要将整个Apache HTTP Server全部下载下来并且设置环境才能完成编译,使用门槛较高。
ab工具仅支持下令行模式,JMeter同时支持GUI模式和下令行模式,但是GUI模式必要消耗更多资源
ab工具效率和性能比JMeter高很多,所以对测试任务秘密求低
ab工具的最大请求数不能超过50000
参数化、聚集点、检查点这几大功能方面,JMeter要比ab工具强大的多
相同之处
都可以对测试结果天生CSV文件
都可以很方便的设置HTTP KeepAlive特性
都提供了跨平台级的支持
都对测试结果集的收集和分析做的很好
2) 与LoadRunner对比
不同之处
LoadRunner是一个非常庞大的工具,功能比JMeter要强大,利用也更加复杂,得当于专门长期从事性能测试领域的应用和研究
LoadRunner是贸易软件,有代价不菲的授权许可费用,JMeter是开源软件
LoadRunner有比JMeter更加详细和庞大的文档体系,为完成复杂的测试任务提供了强有力的支持
LoadRunner由三大组件VuGen、Controllor、Analysis组成,JMeter是一个整体,没有做如许的拆分
LoadRunner的测试分析功能比JMeter要强大的多
LoadRunner对测试任务机的要求比JMeter要高出很多
LoadRunner不但支持Java扩展,更支持强大C扩展,对测试脚本的可定制性比JMeter要复杂和强大
相同之处
都支持在Windows和Linux平台上运行测试任务
都具备设置聚集点、检查点、参数化特性
5. 未来预测(下一个版本)
1)将会提供对MQTT的支持
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)并不是一门新技校,它是由IBM开发的一套面向M2M(Machine-to-Machine)的即时通讯协议,基于TCP/IP的连接实现,所以它险些支持所有平台,未来可能会成为物联网的一部分。
2)修复和改进
高分屏下的显示优化、文档改进、图片压缩、Label扫描优化。
6. 附加信息
1)JMeter的运行原理分析
JMeter模仿多用户并发,使用的JDK的线程模式,而且JDK的线程模式都是一堆native方法,它是JDK的C语言实现中根据不同的体系做出的处理惩罚,在Windows上末了会转为调用C标准库,在Linux上末了转为pthread库,所以当JMeter正在运行时,可以查看到它所依存的java进程的线程数量。
JMeter的代码量非常庞大,经过多年积累,本身的逻辑和体系布局也非常完善,它支持Web、HTTP、HTTPS、SOAP/REST、FTP、JDBC、LDAP、JMS、TCP、SMTP、POP3、IMAP,以致支持Native模式的Shell脚本,GUI图表库使用的不是AWT,也不是SWT,而是Swing,界面显示优美,控件功能丰富。因此JMeter拥有一整套完整的类管理机制和接口。
JMeter还拥有很强的二次开发和扩展能力,因此以致有团队用它来做回归测试而不是仅仅是性能和压力测试。
JMeter官方文档说的很清楚,JMeter不是一个浏览器,它不会分析HTML文档,也不会实行JS脚本。
JMeter还支持BeanShell。
JMeter对HTTP协议的Response,无论是JSON照旧XML,都能正确的分析。
JMeter的一堆properties文件中,有数量庞大的定制参数,通过这些功能,可以实现更多可定制化的任务和需求。
JMeter还支持部署为集群服务器任务,实行超大规模的测试任务。
2)Apache ab工具的运行原理分析
ab工具使用C语言写成,但是它不是一个独立的项目,而是著名的httpd服务器项目标一个组件。它复用了APR的内存池技术,因此不会有频仍的内存申请和销毁动作,所以从基础设计上就保证了高并发测试任务的高效实行,同时又能有效克制内存泄漏或者溢出。
Apache ab工具使用的是多路模式,依赖于创建非阻塞式的socket,以Poll的方式实现,pollset设计是一种优秀的设计方案,它不光是为了socket还可以是file。关键函数的原型是:
static void start_connect(struct connection * c);
关于这个函数,程序会依据并发数和实行次数对I/O实现多路复用,而且是用的多层循环遍历和递归的方式。通常环境下,软件开发时如果同时在一个函数中使用过多的循环嵌套和递归,会导致程序性能降落,以致栈溢出,如果在这种环境下再大量使用全局变量,整个项目代码就会变的不可控,而ab却反其道而行之,在内存池的基础上,引入这种机制,实现了对非阻塞式socket的快速创建和遍历利用,然后再使用事件回调机制收集和处理惩罚结果,从而非常巧妙的同时实现了低内存、高并发、低CPU的目标,保证了极高的性能和效率。所以,网络上大量流传很多贴子说的ab工具是使用多线程模仿并发的结论是错误的,它是单进程单线程的工作模式,至于多线程,那已经是体系底层对异步socket的处理惩罚了,和ab工具是否是多线程并没有什么关系。程序运行之初,它调用下面的代码完成内存池的初始化:
apr_pool_create(&cntxt, NULL);
cntxt的范例是apr_pool_t,这是一个布局体,在所有测试完成之后,再次调用下面的代码完成内存池的释放:
apr_pool_destroy(cntxt);
它支持一堆复杂的下令行参数调用,然后根据这些参数设置选项,程序运行之初会在内存中创建几个非常重要的数据布局:
connection:布局体,HTTP请求实例数据布局,它包含与请求相关的关键数据,比如内存池管理实例ctx、Socket对象aprsock、Poll聚集的形貌对象实例pollfd以及请求本身相关的状态、时间、缓冲区巨细、keep-alive等,详细的详细介绍请继续往下看。
apr_pool_t:布局体,这是内存池的管理实例,每一个HTTP请求都会产生如许一个实例,
apr_socket_t:布局体,包括自己内存池管理实例、socket范例、协议、当地地址、长途地址、端口号、是否阻塞方式、超时时间等调用选项。
apr_pollfd_t:布局体,pollset的形貌,在ab工具中,会定义多个指向这个布局体数据布局的指针,在底层处理惩罚中,这些数据会天生一个链表。包括范例、请求事件标志、接收事件标志、Poll形貌信息、当前调用者的上下文信息等。这个布局体中还有reqevents和rtnevents两个成员,是内核态和用户态轮询I/O状态和回调时用的事件句柄。
apr_size_t:也就是C语言中的size_t,无符号整型,保存当前HTTP请求在apr_socket_recv上完成的巨细信息。
apr_time_t:本质上是一个apr_int64_t,也就是long范例,保存请求时间相关的毫秒级的时间,包括启动时间、连接时间、请求写入时间、读取完成时间、请求完成时间,引用的是timestamp机制。
data:布局体,保存的是连接时间相关的所有数据,重要是启动时间、请求发出和读取响应之间的隔断时长(请求连接乐成的时间)、整个一连所花费的时间、各连接之间的隔断时间。与这个布局体细密绑定的还有几个compare函数,是用来处理惩罚测试结果的时间做数据比较用的。
apr_int64_t:对C语言中long范例的包装。
request:这是一个全局变量,指向巨细为8192个char的数组的指针,里面保存的是HTTP请求的响应头信息,比如HTTP/1.0、Keep-Alive、Content-type等。
apr_pollset_t:pollset对象,pollset是一组socket的聚集。
apr_sockaddr_t:HTTP请求的socket相关的数据布局。
简单的讲,ab工具中大量使用了APR中的数据布局,这些数据布局,是Apache根据必要对C语言的数据范例、网络、I/O、以及一些体系调用的再封装,完整的数据布局文档及其应用方法可以在这里看到,更加细致的网络相关的接口使用方法,还必要参考《Unix网络编程第1卷》,这本书的Chapter 6中作者详细介绍了五种I/O模型及其使用方法。
3)nmon工具的运行原理分析
nmon的原理比较简单,全部依赖于C语言标准库和Linux体系的内核文件体系/proc,没有第三方库的支持。程序运行之初,针对CPU、内存、硬盘、网络这些设备,分别定义了不同的函数,分析它们的内核参数和体系信息,然后创建一个主循环去轮询这些体系信息,并将结果输出到指定的设备中去,使用最多的库函数就是curses函数mvwprintw,获取到数据之后,以特定的方式组织起来保存到一个文本文件中去,对于这个保存的文件,使用nmonchart可以很轻松的将它转换成一个美丽的HTML文档。
curses函数库是Linux下基于文本模式使用的图形函数库,它的出现,使得即使是文本模式下的Linux界面,也可以有非常美丽的输出和显示,它可以很自由的定义输出的目标设备、颜色、外形等众多的特性。不同的Linux版本对curses的支持有所不同,所以当你下载下来nmon之后会发现它针对不同发行版的Linux有不同的运行程序,没关系,我们只必要保存我们想要使用的(比如CentOS),其他的同等删除即可,它们之间没有依赖关系,只必要一个主程序就可以运行了。实行服务器性能测试时nmon工具险些是必不可少的,而nmon又有一堆参数必要设置,这种环境下我们可以把整个下令行和参数写到一个Shell脚本中,必要实行测试时只必要修改少量的几个关键参数,然后运行这个脚本即可,如果再自动调用nmonchart,然后将结果输出到HTTP服务器上,我们就可随时随地的动态的查看服务器的性能表现了。
4)结束语
这篇文档是我这两个星期实行性能测试以来的一些分析研究和总结,归纳整理出来,供以后必要的同砚研究使用,如许可以免除大家百度和谷歌的时间,提拔工作效率,同时也是我们本身工作的一种积累和归档,盼望能为后来人提供一些参考和借鉴,鉴于本人学识有限,文中如有错误,敬请谅解。
末了: 下方这份完整的软件测试视频学习教程已经整理上传完成,朋侪们如果必要可以自行免费领取 【保证100%免费】
https://i-blog.csdnimg.cn/blog_migrate/69d8f0d9807ca72d5525111ba8f515a3.png#pic_center
这些资料,对于【软件测试】的朋侪来说应该是最全面最完整的备战堆栈,这个堆栈也伴随上万个测试工程师们走过最艰难的路程,盼望也能资助到你!
https://i-blog.csdnimg.cn/blog_migrate/57ed0ec5fc12ddd4342c3c490da787eb.gif#pic_center
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]