开发人员学Linux(4):使用JMeter对网站和数据库进行压力测试

前言
表面看来,JMeter与本系列课程似乎关系不大,但实际上在后面的很多场景中起着重要作用:如何获知修改了某些代码或者设置之后系统性能是提升了还是下降了呢?商业的压力测试工具LoadRunner确实很高大上,但是据说费用也不便宜且体积也不小,而目前最高版本的开源免费压力测试工具JMeter3.2压缩包体积才不到53M,而且对于开发人员而非专业测试人员来说,JMeter提供的测试功能已经够强大了。要完整地介绍JMeter,即使把JMeter自带的文档翻译成中文就是一本厚厚的书了。但是在本篇只讲述如何利用JMeter来对Web网站和数据库进行压力测试,因为测试场景的复杂性,本篇实例讲述基于csv文件的参数化测试。
JMeter提供了对不同的协议、服务器及应用的测试支持,如下:
Web – 各种开发语言开发出的网站,比如ASP/ASP.NET/JSP/PHP/Python/Perl等
SOAP / REST Webservices
FTP
Database via JDBC(基于JDBC对数据库进行压力测试)
LDAP
Message-oriented middleware (MOM) via JMS
Mail - SMTP(S), POP3(S) and IMAP(S)
Native commands or shell scripts
TCP
Java Objects
还是那句话:本篇只讲述对Web网站和基于JDBC对数据库进行压力测试。

软件准备
JMeter3.2:为保持与本文有比较好的对照,建议从官网下载3.2版本,下载地址:http://jmeter.apache.org/[preferred]/jmeter/binaries/apache-jmeter-3.2.zip
此软件解压后即可使用。
Tomcat8.5:本实例中的关于Web网站的压力测试都是基于Tomcat8.5的,下载地址:http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.15/bin/apache-tomcat-8.5.15.tar.gz
如果嫌麻烦,可以直接在上一篇《开发人员学Linux(3):CentOS7中安装JDK8和Tomcat8》的环境中进行。
MySQL Community Server5.7:本篇中将以MySQL为例讲述如何对数据库进行压力测试,实际上本篇对MySQL版本没有要求,但后来今后,还是建议下载5.7版本,下载地址:https://dev.mysql.com/downloads/mysql/,同时请下载MySQL的JDBC驱动。
注意:本篇中JMeter在Windows下运行,MySQL数据库及Tomcat服务器均在CentOS7下运行。
使用JMeter对一般性网站进行压力测试
为便于演示,这里以上一篇《开发人员学Linux(3):CentOS7中安装JDK8和Tomcat8》中搭建起来的环境进行压力测试,本人的虚拟机支持桥接模式,IP地址为:192.168.60.198,在Tomcat中有一个简单的提交表单,网址是:http://192.168.60.198:8080/examples/servlets/servlet/RequestParamExample,页面如下图所示:
 
该页面中有一个Form,查看页面源代码可知该Form提交给当前Servlet,且有两个字段,分别为:firstname和lastname,如下图所示:
 
下面讲述创建相关的JMeter元素。
1.运行JMeter
首先运行在解压后的JMeter目录下的bin目录找到jmeter.bat来运行JMeter(重要的事情再说一遍:本篇中JMeter在Windows下运行,MySQL数据库及Tomcat服务器均在CentOS7下运行),JMeter支持多种语言,包括中文(其实对中文的支持不彻底),而在中文环境下JMeter的默认语言是中文,因为考虑到必要时候还需要看JMeter目录下的printable_docs目录中的文档,而这里的文档全是英文的,所以我将它设置为英文,如下图所示:
 
这是设置为英文之后的界面:
 
2.向“测试计划”添加必要的元素。    
添加测试计划的必要元素的顺序为:ThreadGroup->HTTPRequest->Listener。实际上还应包含TestPlan(测试计划),因创建时默认会创建一个TestPlan,故添加TestPlan的步骤可省略。
2.1添加ThreadGroup
如下图所示:

2.2添加HTTP Request Defaults
在ThreadGroup元素上鼠标右键,”Add”-“Config Element”-“HTTP Request Defaults”,HTTP Request Defaults适合于在一个ThreadGroup里面有大量的HTTP Request的情况,很多情况下HTTP Request的一些配置是相同的,那么只需要在HTTP Request Defaults中设置好即可,无需在每个HTTP Request中单独设置,添加HTTP Request Defaults的界面如下图所示:

2.3添加HTTP Request
在ThreadGroup元素上鼠标右键,通过”Add”-“Sampler”-“HTTP Request”来添加HTTP Request。

2.4添加Listener
在ThreadGroup元素上鼠标右键,通过”Add”-“Listener”来添加Listener,在这里根据需要添加Listener,本人一般会添加如下Listener:
Summary Report:可以对测试的结果有一个概要了解,结果中包含了测试次数、平均/最大/最小响应时间、并发吞吐量、接收/发送的字节数等信息;
View Result Tree:由于默认情况下判断某个测试是否成功是以是否收到了内容来判断的,比如请求某个需要授权的页面,如果未授权则会被导向到登录页面,在JMeter看来未发生40X、50X这类HTTP Code的错误则仍会被当做测试结果正确,加View Result Tree后就可以看到客户端和服务器端发送及响应的数据。
View Results in Table:和Summary Report类似,但侧重点不同。

2.5添加CSV Data Set Config
前面的form表单中可以看出需要firstname和lastname两个值,我们可以直接分别指定固定的值,也可以设定从csv文件中数据中的一系列符合要求的值。
在ThreadGroup元素上鼠标右键,通过”Add”-“Config Element”-“CSV Data Set Config”来添加CSV Data Set Config。

2.6参数配置
按照上述步骤创建的TestPlan最终效果如下图所示:

在这里再次强调一下,我们测试的是安装在CentOS7中的Tomcat8自带的实例程序,CentOS7虚拟机采用桥接方式,IP地址为192.168.60.198,请求的URL地址为:http://192.168.60.198:8080/examples/servlets/servlet/RequestParamExample

HTTP Request Defaults的配置信息如下图:

CSV Data Set Config的配置信息如下图:

注意:在这里提到了一个名为Tomcat_performance_test_parameter.csv的文件,这个文件和当前JMeter项目文件Tomcat-based-test-plan-JMeter3.2_Demo.jmx放在同一目录下。可以使用NotePad++之类的文本编辑软件创建这个文件,并将文件编码设置为utf-8,文件内容如下:

HTTP Request的配置信息如下图:


Thread Group的配置信息

注意:为了便于展示结果,这个将测试次数改为100了。
2.7测试结果
执行完测试后即可在Listener中查看结果。
Summary Report界面

View Results in Table界面


View Results Tree默认界面:

默认是以Text形式显示响应数据,如果响应数据是XML/JSON/HTML的话,可以更改为相对应的显示方式,这样更直观。在本例中以浏览器方式显示响应数据的界面如下:

基于模板创建压力测试计划
前面讲述了一个简单但完整的HTTP Web压力测试例子,基本上大多数同一类型的压力测试总有一些共同的元素,为此可以使用模板来创建压力测试计划。
1.选择从模板创建压力测试计划,如下图:

2.在弹出的对话框中选择”Building a Web Test Plan”,如下图所示:

3.点击”Create”即可基于模板的压力测试项目的创建,如下图所示:

然后根据我们自己的需要增加或删除一些元素,然后进行相应设置即可进行压力测试了。
使用JMeter对数据库进行压力测试
前面讲过JMeter支持多种压力测试,下面讲一下JMeter对数据库进行压力测试。
1.数据库准备
首先准备好需要进行压力测试的数据库,本次以本人以前学习爬虫时所使用的一个数据,基本信息如下:
数据库版本:mysql-5.1.58
数据库名:netskycn
查询用表名:ty_content(含748007条数据,2.2GB)。
ty_content的创建脚本如下:

CREATE TABLE `ty_content` (
    `Id` INT(11) NOT NULL AUTO_INCREMENT,
    `ArticleId` INT(11) NOT NULL,
    `Content` MEDIUMTEXT NOT NULL,
    `ContentHash` VARCHAR(32) NOT NULL,
    `CreateAt` DATETIME NOT NULL,
    `IsVisible` TINYINT(1) NULL DEFAULT ‘1‘,
    PRIMARY KEY (`Id`),
    UNIQUE INDEX `IDX_ContentHash` (`ContentHash`),
    INDEX `IDX_ArticleId` (`ArticleId`)
)
COLLATE=‘utf8_general_ci‘
ENGINE=MyISAM;

2.JDBC驱动准备
JDBC驱动可从各数据库厂商官网下载,这里本人已下载好的MySQL JDBC驱动mysql-connector-java-5.1.36.jar,将其复制到JMeter目录下的lib目录中。
3.创建TestPlan
可以基于模板创建JDBC Test Plan,如下图所示:

4.修改配置信息
1.首先添加CSV Data Set Config,并且准备MySQL_JDBC_ArticleID.csv文件,MySQL_JDBC_ArticleID.csv内容如下:

在这个文件中共有6964条数据,它来自于ty_content表中ArticleId的统计(不含重复数据)。
CSV Data Set Config的配置信息如下:

JDBC Connection Configuration配置信息如下:

Thread Group配置信息如下:

JDBC Request配置信息如下:

最终测试效果:

总结:
本篇讲述了如何使用JMeter来进行Web和数据库压力测试,为快速创建压力测试计划,可给予模板进行创建。可以看出一个JMeter压力测试计划必须包含如下元素:ThreadGroup、与压力测试计划对应的Request(如HTTP Request或JDBC Request)、Listener(可以根据需要添加多个Listener),并且为了减小缓存的影响,我们介绍了如何利用csv文件将测试中的参数信息保存起来。
本文未尽之处就是如何对需要身份验证的Web网站进行压力测试,对于带有验证码的需要在压力测试期间暂时禁用验证码功能。另外对于多种验证方式,所使用的方法也有区别,在这期间我试过针对性地对一些需要身份验证的网站建立压力测试计划,但没发现太多共性的东西,故在本篇中没有讲述这方面的内容,等后期有时间再总结整理这方面的内容。

时间: 2024-12-04 23:38:13

开发人员学Linux(4):使用JMeter对网站和数据库进行压力测试的相关文章

开发人员学Linux(10):CentOS7安装配置代码质量管理平台SonarQube6.4

1.前言上一章讲述了如何配置使用源代码管理工具SVN并使之与Apache集成,从而实现代码的变更可追溯,虽然在大多数团队里强调代码提交之前必须找团队中经验丰富的人来审核通过后方可提交,但这一条有时候不是所有时候都能得到满足,有没有依赖于机制而不是人来保证代码质量呢,我们知道计算机的缺点也是优点之一就是可以忠实执行指令.答案是有的,那就是SonarQube,其官方网址为:https://www.sonarqube.org/,目前最新版本为6.4.SonarQube是一个开源平台,用于管理源代码的质

开发人员学Linux之终结篇:大型系统开发经验谈

1.前言这篇文章来源于我的一个ppt,而这个ppt是源于一个朋友的一次邀请,朋友邀请我为一个公司做一堂大约2小时的技术讲座,我选定的方向是如何开发一个大型系统,在这里我对大型系统的定义为日均PV在千万级以上,而京东和淘宝这类则属于巨型系统了.因此在本篇中讲述的都是基于一些开源免费的技术实现,至于那些通过F5硬件加速.DNS来实现负载均衡.CDN加速等需要花钱购买的技术或者服务则不再本篇介绍范围之类.本来此篇是作为<开发人员学Linux>系列的终结篇最后出现的,但是考虑到在此过程中我可能会由于时

开发人员学Linux(6):CentOS7编译安装MySQL5.17.8多实例及主从复制

1.前言上一篇讲述了如何在CentOS7下编译安装Nginx-1.12.0并如何配置反向代理,本篇将讲述如何编译安装MySQL5.7.18并配置多实例.2.准备2.1下载MySQL5.7.18源码注意最新版本的MySQL需要Boost才能编译安装,在MySQL提供的下载中有不带boost的源码,还有带boost的源码,如果下载不带boost的源码还需要再去下载boost源码,为省事起见,建议下载带boost的源码,下载地址:https://cdn.mysql.com//Downloads/MyS

开发人员学Linux(3):CentOS7中安装JDK8和Tomcat8

题外话:直到今天开始写本系列的第三篇时本人才想好为这个系列取一个名字,本系列不是为Linux运维人员准备的,而是主要为开发人员准备的,包括但不限于:希望了解Linux的开发人员:需要在Linux上部署一些组件的开发人员,如Memcached/Nginx/Redis等:需要使用一些在Linux上部署运行效果可能会更好的效果的系统,如Jetkins.SVN.JavaMelody等.希望了解一些当前较热的技术,想在虚拟机里搭建个环境把玩一番的,如.Net Core/Hadoop等.因此在本系列文章中不

开发人员学Linux(13):CentOS7安装配置IT设备监控系统Zabbix

1.前言 在前一篇讲述了如何安装Memcached和Redis,在这一篇主要讲述如何安装企业级IT设备监控系统Zabbix.本人曾在某大型集团公司信息化部门工作,公司在多个城市以及一个城市的多个区有办公区,在那里不仅会开发软件系统,还需要对大量的软件系统.操作系统及IT设备进行监控,以保证IT基础设施能够7×24小工作.在没有实施系统之前,经常接到电话被告知网络中断了或是某个应用程序无法使用了,每次接到电话之后首先要排除是否误报,然后再分析是哪里出了问题,最终找出解决办法.每次处理事情的周期很长

开发人员学Linux(7):CentOS7编译安装PHP并配置PHP-FPM

1.前言上一篇讲述了如何编译安装MySQL,虽然可以通过yum install 或者rpm来安装,但是yum install和rpm安装有一个特点,就是有些参数是别人根据大众需求定制的,如果需要进行自己的特定参数指定,这个是比较难做到的,因此有一定Linux基础的人都是编译安装或者根据公司的具体环境制作适合环境的安装包.上一篇的例子中讲述了如何编译安装和如何配置多实例,并在最后讲述了如何配置主从复制配置.以前开源开发经常将LAMP,就是Linux+Apache+MySQL+PHP,对于一些起步型

开发人员学Linux(5):CentOS7编译安装Nginx并搭建Tomcat负载均衡环境

1.前言在上一篇讲述了JMeter的使用,在本篇就可以应用得上了.本篇将讲述如何编译安装Nginx并利用前面的介绍搭建一个负载均衡测试环境.2.软件准备Nginx-1.12.0,下载地址:https://nginx.org/download/nginx-1.12.0.tar.gzTomcat8(本系列已介绍过如何下载和安装)JMeter(本系列已介绍过如何下载和使用)注:VirtualBox宿主机IP为"192.168.60.16,虚拟机IP为:192.168.60.198,虚拟机通过桥接方式接

开发人员学Linux(9):CentOS7编译安装Git-2.13.1及使用

1.前言在上一篇讲述了如何在CentOS7上编译安装Subversion1.9.5和Apache2.4.25,并与Apache2.4.25集成,达到多个SVN版本库集中授权控制的效果.在传统的企业里面使用SVN来作为源代码版本工具的比例是比较高的,但在一些互联网企业里面很多已经在使用git来作为源代码版本管理工具了.网上关于SVN和Git的比较说明是很多的,其中最重要一个区别就是SVN是集中式的,git是分布式的,比如要查看版本库的历史提交记录,在SVN中必须要在能够连接到SVN服务器才可以,而

开发人员学Linux(2):VirtualBox中安装CentOS7系统设置

上一篇<VirtualBox中安装CentOS7过程记录>中讲述了如何安装VirtualBox和在VirtualBox中安装CentOS7,但是限于篇幅有很多问题没有展开,在本篇将展开介绍VirtualBox和CentOS的设置问题.VirtualBox支持的虚拟机文件类型VDI: Virtual Disk Image,这是VirtualBox默认使用的虚拟机文件类型.VMDK:这是VMware默认使用的虚拟机文件类型.VHD:这是微软出品虚拟机软件默认使用的虚拟机文件类型.在创建虚拟机时选择