Jmeter分布式压测

简单来说就是,多台机器同时安装jmeter,选择一台机器作为调度机,其他作为压力机。进行相应的配置后,就可以用调度机操控压力机发起请求。 分布式执行原理 负载机配置 安装JAVA 下载并解压JDK

配置jdk的环境变量

再执行source /etc/profile刷新配置文件 通过java -version查看是否设置成功 安装Jmeter 下载jmeter.tgz文件,并将文件上传至/data/

再执行source /etc/profile刷新配置文件 通过jmeter -v查看是否设置成功 在jmeter目录创建testplan testresult子目录 , 将测试脚本login.jmx上传至testplan,进入bin文件下执行测试输出测试结果命令

分布式配置 调度机Controller 在多台机器中按照上述步骤配置jmeter,选择其中一台为调度机,其他为执行机 在调度机上修改bin/jmeter.properties, 添加执行机的IP及端口 , 1099是默认的rmi通信端口

案例中 , 192.168.174.130:1000即是执行机IP和端口号 取消server.rmi.ssl.disable=false的中注释并将false改为ture

开启执行脚本机器上的server服务,bin/jmeter-server 在控制机执行分布式命令

执行机Agent 修改jmeter.properties

然后执行命令 , 启动服务

遇到的问题及解决 An error occurred: Cannot start. localhost is a loopback address In latest version, you can run your script with:指定本地IP 解决方案:

java.io.FileNotFoundException: rmi_keystore.jks 1、Jmeter4.0,启动slave报错java.io.FileNotFoundException: rmi_keystore.jks image 解决方法一:slave的jmeter.properties中,设置server.rmi.ssl.disable=true 原因:jmeter4.0以上的版本,默认启用RMI连接的安全通信,需要创建密钥库。所以将SSL禁用即可。 解决方法二:手动生成秘钥和证书。执行create-rmi-keystore.bat(Windows适用)或create-rmi-keystore.sh(Linux适用) Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 在使用java远程启动linux服务器上的jmeter服务是报Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 查询该报错基本都是tomcat操作 , 编辑jmeter/bin/jmeter-server文件,在顶部添加JAVA_HOME和JRE_HOME即可 解决Tomcat异常 其它说明 1.调度机(master)和执行机(slave)最好分开,由于master需要发送信息给slave并且会接收slave回传回来的测试数据,所以mater自身会有消耗,所以建议单独用一台机器作为mater。 参数文件:如果使用csv进行参数化,那么需要把参数文件在每台slave上拷一份且路径需要设置成一样的。 每台机器上安装的Jmeter版本和插件最好都一致,否则会出一些意外的问题。 若是脚本中设置的并发线程数是100,采用3台slaver机器去施加压力,那么对于服务端来说,此时的并发线程数是300。 为了减少出错的可能性,最好按照如下Jmeter 分布式要求: 各个机器在相同目录下安装相同版本的jdk; 各个机器在相同的目录下安装相同版本的jmeter; 配置/etc/hosts的IP和hostname的映射。 修改各个机器的jmeter的默认内存参数,从512m调整为合适大小。 基础docker&k8s的分布式压测方案 更多资料可查看 https://github.com/kubernauts/jmeter-kubernetes 作者:Kevin_Luo 链接:https://www.jianshu.com/p/74f046adcd21 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

ab压力测试工具

 

 

 

 

  安装ab测试工具

  ab工具帮助 ab是Apache超文本传输协议(HTTP)的性能测试工具。其设计意图是描绘当前所安装的Apache的执行性能,主要是显示你安装的Apache每秒可以处理多少个请求。

  使用举例:

  from:https://www.e-learn.cn/content/linux/1134148

超实用压力测试工具-ab工具

写在前面 在学习ab工具之前,我们需了解几个关于压力测试的概念 吞吐率(Requests per second) 概念:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。 计算公式:总请求数 / 处理完成这些请求数所花费的时间,即 Request per second = Complete requests / Time taken for tests 并发连接数(The number of concurrent connections) 概念:某个时刻服务器所接受的请求数目,简单的讲,就是一个会话。 并发用户数(The number of concurrent users,Concurrency Level) 概念:要注意区分这个概念和并发连接数之间的区别,一个用户可能同时会产生多个会话,也即连接数。 用户平均请求等待时间(Time per request) 计算公式:处理完成所有请求数所花费的时间/ (总请求数 / 并发用户数),即 Time per request = Time taken for tests /( Complete requests / Concurrency Level) 服务器平均请求等待时间(Time per request: across all concurrent requests) 计算公式:处理完成所有请求数所花费的时间 / 总请求数,即 Time taken for / testsComplete requests 可以看到,它是吞吐率的倒数。 同时,它也=用户平均请求等待时间/并发用户数,即 Time per request / Concurrency Level ab工具简介 ab全称为:apache bench 在官网上的解释如下: ab是Apache超文本传输协议(HTTP)的性能测试工具。其设计意图是描绘当前所安装的Apache的执行性能,主要是显示你安装的Apache每秒可以处理多少个请求。 其他网站解释: ab是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。 下载ab工具 进入apache官网 http://httpd.apache.org/ 下载apache即可 启动ab工具 以windows环境下,apache安装路径为C:\apache\Apache24\为例 打开终端,输入命令 cd C:\apache\Apache24\bin 即可启动ab 开始测试 输入命令 ab -n 100 -c 10 http://test.com/ 其中-n表示请求数,-c表示并发数 其余命令请参见 http://apache.jz123.cn/programs/ab.html 测试结果分析 上面的命令运行完毕后就出来测试报告了 完整测试报告 这段展示的是web服务器的信息,可以看到服务器采用的是nginx,域名是wan.bigertech.com,端口是80 服务器信息 这段是关于请求的文档的相关信息,所在位置“/”,文档的大小为338436 bytes(此为http响应的正文长度) 文档信息 这段展示了压力测试的几个重要指标 重要指标 Concurrency Level: 100 //并发请求数 Time taken for tests: 50.872 seconds //整个测试持续的时间 Complete requests: 1000 //完成的请求数 Failed requests: 0 //失败的请求数 Total transferred: 13701482 bytes //整个场景中的网络传输量 HTML transferred: 13197000 bytes //整个场景中的HTML内容传输量 Requests per second: 19.66 [#/sec] (mean) //吞吐率,大家最关心的指标之一,相当于 LR 中的每秒事务数,后面括号中的 mean 表示这是一个平均值 Time per request: 5087.180 [ms] (mean) //用户平均请求等待时间,大家最关心的指标之二,相当于 LR 中的平均事务响应时间,后面括号中的 mean 表示这是一个平均值 Time per request: 50.872 [ms] (mean, across all concurrent requests) //服务器平均请求处理时间,大家最关心的指标之三 Transfer rate: 263.02 [Kbytes/sec] received //平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题 这段表示网络上消耗的时间的分解 网络消耗时间 这段是每个请求处理时间的分布情况,50%的处理时间在4930ms内,66%的处理时间在5008ms内…,重要的是看90%的处理时间。 响应情况 关于登录的问题 有时候进行压力测试需要用户登录,怎么办? 请参考以下步骤: 先用账户和密码登录后,用开发者工具找到标识这个会话的Cookie值(Session ID)记下来 如果只用到一个Cookie,那么只需键入命令: ab -n 100 -C key=value http://test.com/ 如果需要多个Cookie,就直接设Header: ab -n 100 -H “Cookie: Key1=Value1; Key2=Value2” http://test.com/ 总结 总的来说ab工具ab小巧简单,上手学习较快,可以提供需要的基本性能指标,但是没有图形化结果,不能监控。因此ab工具可以用作临时紧急任务和简单测试。 同类型的压力测试工具还有:webbench、siege、http_load等   from:https://www.cnblogs.com/behindman/p/8700611.html

Jmeter接口测试+压力测试

jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单。因为jmeter是java开发的,所以运行的时候必须先要安装jdk才可以。jmeter是免安装的,拿到安装包之后直接解压就可以使用,同时它在linux/windows/macos上都可以使用。 jmeter可以做接口测试和压力测试。其中接口测试的简单操作包括做http脚本(发get/post请求、加cookie、加header、加权限认证、上传文件)、做webservice脚本、参数化、断言、关联(正则表达式提取器和处理json-json path extractor)和jmeter操作数据库等等。 接口测试 Jmeter-http接口脚本 一般分五个步骤:(1)添加线程组 (2)添加http请求 (3)在http请求中写入接入url、路径、请求方式和参数 (4)添加查看结果树 (5)调用接口、查看返回值 jmeter 发get请求 jmeter 发post请求 jmeter 添加cookie 需要在线程组里添加配置元件—HTTP Cookie 管理器 jmeter 添加header 需要在线程组里面添加配置元件—HTTP信息头管理器 jmeter 上传文件 jmeter 参数化 入参经常变化的话,则可以设置成一个变量,方便统一修改管理;如果入参要求随机或可多种选择,则通过函数生成器或者读取文件形成一个变量。所以参数化有三种方式:用户定义的变量、函数生成器、读取文件。 (1)用户定义的变量 需要添加配置元件-用户定义的变量。 (2)函数生成器 需要用到函数助手功能,可以调用函数生成一些有规则的数据。常用的几个函数有_uuid、_random、_time。_uuid会生成一个随机唯一的id,比如在避免java请求重发造成未处理数据太多的情况,接口请求可加一个唯一的请求id唯一的响应id进行一一对应;随机数_random,可以在你指定的一个范围里取随机值;取当前时间_time,一些时间类的入参可以使用,如{__time(,)} 是生成精确到毫秒的时间戳、{__time(/1000,)}是生成精确到秒的时间戳、${__time(yyyy-MM-dd HH:mm:ss,)} 是生成精确到秒的当前时间。 (3)从文件读取 需要在线程组里面添加配置元件-CSV Data Set Config 其中Recycle on EOF:设置True后,允许循环取值 具体的例子如下所示: jmeter 断言 jmeter断言用来检测响应返回的结果和我们预期的是否一致。若针对整个线程组的话,则在线程组下添加断言-响应断言;若只是针对某个请求的话,则在请求下添加断言-响应断言。 jmeter关联 接口请求之间存在参数调用,为了保存这个参数,建立jmeter关联。比如登陆接口和购买商品接口,购买商品接口就需要登陆接口返回的token等登陆信息,jmeter关联就可以保存这个token信息,方便购买商品接口使用。 jmeter关联可以通过二种方式来完成,获取到返回结果中指定的值。它们分别是正则表达式提取器、 json path extractor。 (1)正则表达式提取器 若想获取的返回值未匹配到,可以把正则表达式两边匹配的数据扩大点。 a. 关于正则表达式 ():括起来的部分就是要提取的。 .:匹配除换行外的任何字符串。 +:代表+号前面的字符必须至少出现一次(一次或多次)。 ?:代表?前面的字符最多可以出现一次,在找到第一个匹配项后停止(0次或1次)。 :代表号前面的字符可以不出现,也可以出现一次或者多次(0次、1次或者多次) (.*):贪婪模式,匹配尽可能多的字符 (.*?)或(.+?):匹配尽可能少的字符,一旦匹配到第一个就不往下走了。 b. 关于模板 若想提取多个值的话,比如是a和b这两个值,则可以写成:$1$$2$。无论要提取多少个值,引用名称就是一个的,比如名称为id,${id_go}:获取整个字符串ab,${id_g1}:获取的是a,${id_g2}:获取的是b。 下面有一个具体的实例,如下图所示: (2)json path extractor jmeter通过安装json path extractor插件来处理json串,提取json串中的字段值。插件的下载地址:https://jmeter-plugins.org/?search=jpgc-json,下载完成,解压后,直接把lib文件夹放到jmeter相应目录下面。特别说明:jmeter 2.xx左右的版本尝试过无法使用该插件,在jmeter 3.xx左右的版本装完插件后能正常使用。 需要在请求下创建后置处理器-jp@gc-JSON Path Extractor,具体的实例如下所示: 关于json path相关插件的方法和使用,推荐可以看这篇博客: http://www.jianshu.com/p/56a607fc0d8f jmeter 操作数据库 操作数据库基本有四个步骤:(1)导入mysql的jdbc的jar包 (2)创建数据库的连接配置,线程组里添加配置元件-JDBC Connection Configuration (3)线程组里添加jdbc request,写sql语句 (4)添加察看结果树,点击启动按钮,就能看到执行的SQL。具体的实例如下截图所示: 特别说明:jmeter还可以操作oracle、postgreSQL、msSQL、mongodb等等数据库,同时不同的数据库,JDBC Connection Configuration填写的Database url格式和JDBC Driver驱动名称也不相同。jmeter数据库驱动列表如下表所示: 数据库 驱动 数据库url mysql com.mysql.jdbc.Driver jdbc:mysql://host:port/{dbname}?allowMultiQueries=true oracle org.postgresql.Driver dbc:postgresql:{dbname} Jmeter-webservice接口脚本 基本分为五个步骤:(1)先需要通过soapui工具获取到webservice接口的请求地址、请求报文和请求soapaction。(2)jmeter新建一个线程组 (3)线程组下建立SOAP/XML-RPC Request,写入请求url、请求报文、请求soapaction。(3)启动jmeter,调用接口,通过察看结果树查看返回值。 soapui获取信息的实例如下图所示: soapui提交完后,点击raw,可看到soapation,有些接口若没返回soapation,则jmeter里也就不用填。 jmeter-webservice脚本实例如下图所示: 压力测试 压力测试分两种场景:一种是单场景,压一个接口的;第二种是混合场景,多个有关联的接口。压测时间,一般场景都运行10-15分钟。如果是疲劳测试,可以压一天或一周,根据实际情况来定。 压测任务需求的确认 压测前要明确压测功能和压测指标,一般需要确定的几个问题: 固定接口参数进行压测还是进行接口参数随机化压测? 要求支持多少并发数? TPS(每秒钟处理事务数)目标多少?响应时间要达到多少? 压服务器名称还是压服务器IP,一般都是压测指定的服务器 压测设置 线程数:并发数量,能跑多少量。具体说是一次存在多少用户同时访问 Rame-Up Period(in seconds):表示JMeter每隔多少秒发动并发。理解成准备时长:设置虚拟用户数需要多长时间全部启动。如果线程数是20,准备时长为10,那么需要10秒钟启动20个数量,也就是每秒钟启动2个线程。 循环次数:这个设置不会改变并发数,可以延长并发时间。总请求数=线程数*循环次数 调度器:设置压测的启动时间、结束时间、持续时间和启动延迟时间。 压测结果查看 运行完后,聚合报告会显示压测的结果。主要观察Samples、Average、error、Throughput。 Samples:表示一共发出的请求数 Average:平均响应时间,默认情况下是单个Request的平均响应时间(ms) Error%:测试出现的错误请求数量百分比。若出现错误就要看服务端的日志,配合开发查找定位原因 Throughput:简称tps,吞吐量,默认情况下表示每秒处理的请求数,也就是指服务器处理能力,tps越高说明服务器处理能力越好。 压测结果的分析 有错误率同开发确认,确定是否允许错误的发生或者错误率允许在多大的范围内; Throughput吞吐量每秒请求的数大于并发数,则可以慢慢的往上面增加;若在压测的机器性能很好的情况下,出现吞吐量小于并发数,说明并发数不能再增加了,可以慢慢的往下减,找到最佳的并发数; 压测结束,·登陆相应的web服务器查看CPU等性能指标,进行数据的分析; 最大的tps:不断的增加并发数,加到tps达到一定值开始出现下降,那么那个值就是最大的tps。 最大的并发数:最大的并发数和最大的tps是不同的概率,一般不断增加并发数,达到一个值后,服务器出现请求超时,则可认为该值为最大的并发数。 压测过程出现性能瓶颈,若压力机任务管理器查看到的cpu、网络和cpu都正常,未达到90%以上,则可以说明服务器有问题,压力机没有问题。 影响性能考虑点包括:数据库、应用程序、中间件(tomact、Nginx)、网络和操作系统等方面。 jmeter在linux下进行压力测试 jmeter 在linux安装 简单说下,就是要先安装jdk,同时再配置环境变量,最后再上传jmeter压缩的安装包,在linux下解压完安装包就可以使用了。推荐博客:http://blog.csdn.net/zhemeteor/article/details/51315874 jmeter在linux运行 进入jmeter下的bin目录下运行脚本,未配置jmeter环境变量的条件下,运行的命令: ./jmeter -n -t a.jmx -l res.jtl 其中a.jmx是准备好的jmeter脚本,res.jtl是测试结果文件,测试结果文件可以导入到jmeter察看结果树下查看。   from:https://blog.csdn.net/github_27109687/article/details/71968662

压力测试Jmeter+badboy

前言:很多人都想学习压力测试,但是一开始手动写脚本着实蛋疼,所以今天我教大家的是利用badboy来录制压测脚本,然后用Jmeter来做压力测试。 流程:badboy导出Jmeter压测脚本->Jmeter进行压力测试(特别适用于本次潘sir大作业–电影售票系统web版本的压力测试) 第一步:下载badboy和Jmeter badboy:http://www.badboy.com.au/ Jmeter:http://jmeter.apache.org/ 安装特别简单,笔者罗炜劲也没遇到什么困难。这里就不赘述了,真的没坑的,也不需要配置什么。可能唯一需要注意的是Jmeter的运行,需要打开bin目录下的批处理文件:看下面截图。 会首先出现一个命令行,然后出现以下图形化界面 第二步,用badboy录制脚本并导出.jmx格式 笔者这里随便拿某讯的网站来示范,当然,人家的机制肯定是会防止别人ddos攻击,所以频繁发出请求的话,肯定是会返回拒绝访问的结果,但是我们不关注返回结果,我么关注录制和压测的流程。 首先在地址栏输入要压测的地址然后跳转 这时候badboy左侧脚本已经录制一条了,可以看到页面已经跳转到了QQ邮箱,并且script多了一条记录 然后输入账号密码,点击登录,页面跳转,同时脚本多一个步骤 然后我就退出了QQ邮箱。并且,脚本多了一行 录制完成之后,点击左上角的导出jmeter,保存脚本到指定目录。 第三步:Jmeter出场 首先打开刚刚从badboy哪里保存的脚本 可以看到测试计划多了一个,然后线程组就是定义并发数目,step就是压测的步骤,意思就是比如1000个并发,就会模拟1000个人,不断重复刚刚我录制的操作,登录邮箱,退出邮箱这样。 双击Thread Group线程组,就可以定义线程数,循环次数,随机间隔时间。想做压力测试,当然线程数越多压力越大,间隔越小越大。 第四步:压测步骤已经写好,是不是可以直接运行呢?我们还需要添加监听器!来查看压测返回的结果啊! 监听器的种类好多,可以全部加进去试试,各有各的看点!我加了三个监听器: 最后,运行!查看结果 查看结果树 表格查看 聚合报告:我喜欢看这个,可以看出错误率,最大吞吐量。可以反映出服务器性能。 小结:希望大家有所收获。

Jmeter进行webSocket接口测试

一、运行Jmeter (1) 去官方网站下载jmeter(版本为3.3)并解压。点击bin/jmeter.bat启动jmeter (2)  新建线程组。 (3) 在线程组中新建WebSocket Sample     二、WebSocket Sampler简介 1、WebServer (1)Server Name or IP:WebSocket发送的目标服务器的地址或者名称 (2)Port Number:WebSocker服务器监听的端口号。(一般是HTTP 80端口,可以通过WireShark数据包得到) 2、Timeout: (1)Connection – 发送一个连接请求后,Jmeter等待连接完成的最长时间,单位是毫秒。 (2)Response – 对响应消息的最大等待时间。 3、WebSocket Request (1)Implementation – 只支持RFC6455(v13) ,WebSocket协议标准的最新版。 (2)Protocol – 有ws与wss之分, ws前缀是WebSocket连接的辨别标识,wss前缀是WebSocket安全连接的辨别标识。根据自己的实际情况填写 (3)Streaming Connection – 选择这个TCP session要不要保持,如果勾上标识连接会一直存在,如果没有勾上,那么得到第一次响应后该链接就会被关闭。 (4)Request data:填入将要发送的请求,要跟开发沟通好,这个是什么格式的消息。 4.WebSocket Response (1)Response Pattern – 采样器将等待含有该标识的消息并继续通信(或者直到timeout,该连接关闭) (2)Close Connection Pattern – 如果服务器返回的消息含有这样的字符,就结束会话。 (3)Message Backlog – 定义服务器返回消息保留的最大长度。 三、试验 按照网上的例子,可以用http://www.websocket.org/echo.html这个网站做一些试验,网站会将收到的数据(你的request数据)在服务器响应中原样返回。 将网站提供的host等信息填入即可与网站通信,下面是我的实验,用于理解Jmeter中websocket sampler 1、streaming选项的影响 (1)不勾选streaming test plan设置如下: 不勾选streaming connection结果如下: 可以看出发送的Ground control to Major Tom被返回,这个实验是成功的,从result tree的sampler result中Execution FLow中可以看出测试的结果与上面我们的设置之间的关系:用了5000毫秒的时间等待服务器的连接,用了20000毫秒的时间等待服务器的消息,且在接受到第一条消息后,关闭了这个websocket会话。 (2)勾上streaming connection 可以看到在结束测试的时候,勾上streaming那个小勾后,测试结束时streaming connection还是开着的。 (3)发送两条消息 只发送一条消息可能看不出什么区别,将Websocket sampler复制一下,发送两条信息。这样就可以看出第二条消息发送时是直接用的第一条消息打开的连接,服务器的响应被归类到一次会话的响应窗口。 (4)、参照参考文档设置一个测试(添加一个loop controller,设置循环次数为3) 结果如下: 循环中的sampler都勾选了streaming,最后一个sampler没有勾选此选项,结果中可以看出:在loop controller中的sampler使用的是一个连接,在loop外面的这个sampler会打开一个新的连接,可以得出一个结论,实际上,当勾选了streaming connection时,不仅会在结束会话后保留连接,而且勾选了的sampler会在有可用连接是直接使用,而没有勾选的sampler即使存在可用连接也会重新打开一个新的连接。因此,如果是要在一个会话中发送多条消息,请勾选这个streaming connection。 2、如何人为的结束一段对话 这就要用到之前提到过的response pattern和close pattern,先给出三个请求在没有设置response pattern和close pattern的运行结果以便于比较 然后在第一个sampler中设置response pattern和close pattern如下(由于只建立一次连接,所以只会读取第一个sampler中的pattern设置信息) 这样在第二个请求的响应返回不符合father这个标识,又符合了close pattern时,就会断开连接了,此时第三个websocket勾选了streaming使用上一个连接,但实际上却连接不上这个远程终端时就会报错了。(response响应在这种情况下不能设置为空,如果先检测到返回的内容符合response pattern,就不会再去判断是否符合close pattern了) 3、Message Backlog的设置 上面的试验使用的都是默认的3,因此如果试验中的三个socket都是是在一个会话中通信,点击第三个是可以看到最近的三个服务器响应的。当这个选项设置为1时,就只能看到最近的一条响应信息了

使用JMeter测试基于WebSocket协议的服务

由于JMeter没有针对WebSocket的sampler,所以就需要安装开源的插件,以使其支持WebSocket协议。 安装JMeter WebSocketSampler 首先,从github上clone源码下来,地址如下: https://github.com/maciejzaleski/JMeter-WebSocketSampler 之后,使用Maven构建此代码后,将jar包“JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar”放到JMeter的“lib/ext/”目录中,此目录是JMeter用来放置扩展包的地方。 最后,将websocket sampler依赖的其他jar包放到“lib”目录下,此目录是JMeter用来放插件所依赖的jar包的地方。websocket sampler所依赖的jar包如下: jetty-http-9.1.1.v20140108.jar jetty-io-9.1.1.v20140108.jar jetty-util-9.1.1.v20140108.jar websocket-api-9.1.1.v20140108.jar websocket-client-9.1.1.v20140108.jar websocket-common-9.1.1.v20140108.jar 打开JMeter,通过”Add” -> “Sampler” -> “WebSocket Sampler”,添加一个取样器: 创建一个简单的websocket实现: 通过下面blog所说的步骤,构建一个基于websocket协议的聊天室: http://waylau.com/netty-websocket-chat/ 启动后如图: 使用JMeter测试websocket聊天室 配置WebSocket Sampler如下图: 运行后,查看JMeter显示结果: 查看聊天室,发现确实收到的此条消息:   from:https://www.cnblogs.com/liupengblog/p/5355199.html

JMeter 和 Badboy: 功能和性能测试工具

JMeter ======================================================= JMeter基础之一 一个简单的性能测试 http://www.cnblogs.com/fnng/archive/2012/12/22/2829479.html,看完这个就学到很多东西。 jmeter入门教程- Jmeter教程及技巧汇总 http://www.jmeter.cf/jmeter-summary.html JMeter试用手记 http://gq913.iteye.com/blog/157280 JMeter入门教程 http://blog.csdn.net/w565911788/article/details/7629787 使用jmeter测试web应用遇到的几个问题及解决 http://chen4w.iteye.com/blog/945298,录制问题。 jmeter学习系列--脚本参数化和断言设置 http://www.blogjava.net/qileilove/archive/2012/05/02/377159.html,利用Jmeter的CSV Data Set Config来实现参数化功能 用jmeter进行多用户并发压力测试 http://www.bubuko.com/infodetail-836134.html Jmeter逻辑控制器功能说明  http://my.oschina.net/u/2391658/blog/701485 综合: 模仿用多用户做压力测试的大致步骤 1. 录制脚本 2. 配置session,注意session跟http cookie manager的配置关系。 3. 配置用户列表的CSV Data Set Config初始化数据 4. 线程组并发和测试 录制: 可录制JMETER脚本的CHROME扩展插件BlazeMeter http://www.iquicktest.com/chrome-extension-jmeter.html JMeter基础之—录制脚本 http://www.cnblogs.com/fnng/archive/2011/08/20/2147082.html Jmeter 快速入门教程(四)--录制复杂web测试脚本 http://www.jmeter.cf/index.php/tutorials/154-jmeter-web.html 代理录制 IE无法录制到请求的问题解决 http://www.cnblogs.com/nocturneg/archive/2012/08/06/2624674.html 录制配置: chrome SwitchySharp 选项: 手动设定:localhost, 端口: 8081 (jmeter代理的端口),本地服务器的话,清空"不代理的地址"。 jmeter: http 代理: 端口:8081, https domian: localhost:8080(非https服务器不需要配置这里)  这里就是让通过端口8081转发到8080端口(实际站点端口) 插件: 官方插件: http://jmeter-plugins.org/downloads/all/ Web Driver http://jmeter-plugins.org/wiki/WebDriverTutorial/ WebSocket Testing With Apache JMeter http://blazemeter.com/blog/websocket-testing-apache-jmeter JMeter常用测试元件 http://book.51cto.com/art/201204/327306.htm jmeter之配置元件 http://www.blogjava.net/qileilove/archive/2014/02/28/410451.html JMeter文章收集http://www.ltesting.net/ceshi/open/kyxncsgj/jmeter/,里面的文章不是很完整。 实战:使用JMeter的Java Sampler轻松定制自己的benchmark http://itstarting.iteye.com/blog/1513335 一些说明: Session 要使jmeter能够保持住session,必须使其能够维持cookie中的jsessionid,因此增加“http cookie manager”. 同时,注意这文章说明:jmeter 性能测试,关于session保持的问题解决 http://blog.csdn.net/catoop/article/details/8055264 需要了解如何配置支持cookie JMeter——HTTP COOKIE Manager(cookie管理器)  http://wangsheng14591.blog.163.com/blog/static/327797102012829101351887/ 自己配置可以解决[no cookies]问题 1.配置jmeter.properties CookieManager.save.cookies=true CookieManager.check.cookies=false 2.在cookie管理中,增加的参数比如 名称:paramter1,值:pandy,域:localhost,路径:/mywebapp/weburl(这里的路径就是http请求的路径:http://localhost:8080//mywebapp/weburl),尤其注意路径,否则无法解决no cookies问题的。(好像不一定要设定路径的) 我自己的成功配置: A: 新建一个http cookie manager”,不需要增加JSESSIONID变量,当录制完成以后,运行的时候,jmeter自动产生和管理,把给个请求都加上sessionId; B: 然后创建一个代理,目标:计划(自己定义的计划名称) --> 线程组(自己创建的线程组);  分组: 每个组放入一个新的控制器;  跟随重定向; C: 创建一个线程组 以上配置就可以了。 其他方式参考: 问题是如何得到这个jsessionId?可以看http://lixf5409.iteye.com/blog/2064303的两种方法: 1,第一次访问应用服务器的时候,应用服务器会产生一个sessionid用于维护客户端的信息,tomcat的sessionid的key是jsessionid。jsessionid可以通过chrome浏览器的Resources->Cookies获取到。 单个请求还可以,多个请求的话会重复配置很多请求的jsessionid。,其实把cookie管理升级到http请求为兄弟节点,就能被共享到所有http请求了。 2.新建2个循环控制器: 登录-循环控制器和启动-循环控制器。登录-循环控制器的循环次数设置为1,启动-循环控制器的次数视性能测试情况设置。并在需要用到session的HTTP请求的上一级目录建立HTTP Cookie 管理器。 这样启动的时候就可以获取到session中的用户Id了。自动产生和管理? 设置QPS限制 通过设置定时器来控制QPS,一旦取样器的响应时间发生改变(网络环境发生改变),就需要重新调整定时器的等待时间。 Jmeter提供了一个非常有用的定时器,称为Constant Throughput Timer (常数吞吐量定时器),该定时器可以方便地控制给定的取样器发送请求的吞吐量。 右键点击线程组下面的请求 ,弹出菜单(添加—>定时器—>Constant Throughput Timer)选择Constant Throughput Timer Constant Throughput Timer 的主要属性介绍: 名称 :定时器的名称 Target throughput(in samples per minute):目标吞吐量。注意这里是每分钟发送的请求数,因此,对应测试需求中所要求的20 QPS ,这里的值应该是1200 。 Calculate Throughput based on :有5个选项,分别是: This thread only :控制每个线程的吞吐量,选择这种模式时,总的吞吐量为设置的 target Throughput 乘以矣线程的数量。 All active threads : 设置的target Throughput 将分配在每个活跃线程上,每个活跃线程在上一次运行结束后等待合理的时间后再次运行。活跃线程指同一时刻同时运行的线程。 All active threads in current thread group :设置的target Throughput将分配在当前线程组的每一个活跃线程上,当测试计划中只有一个线程组时,该选项和All active threads选项的效果完全相同。 All active threads (shared ):与All active threads 的选项基本相同,唯一的区别是,每个活跃线程都会在所有活跃线程上一次运行结束后等待合理的时间后再次运行。 All cative threads in current thread group (shared ):与All active threads in current thread group 基本相同,唯一的区别是,每个活跃线程都会在所有活跃线程的上一次运行结束后等待合理的时间后再次运行。 聚合报告分析 图形报表 图表底部参数的含义如下: 样本数目是总共发送到服务器的请求数。 最新样本是代表时间的数字,是服务器响应最后一个请求的时间。 吞吐量是服务器每分钟处理的请求数。 平均值是总运行时间除以发送到服务器的请求数。 中间值是代表时间的数字,有一半的服务器响应时间低于该值而另一半高于该值。 偏离表示服务器响应时间变化、离散程度测量值的大小,或者,换句话说,就是数据的分布。 Badboy,只支持ie浏览器,很没意思。 ========================================================= 使用Badboy录制Web性能测试脚本 http://book.51cto.com/art/201204/327317.htm 综合 ========================================== badboy + jmeter并发性能测试 http://www.cnblogs.com/java-koma/archive/2010/07/10/1774685.html 注意: 1. 安装文档中的说法,ext目录存放对JMeter的扩展,用户的扩展所依赖的包则要直接放在lib下   from:http://panyongzheng.iteye.com/blog/2107998

JMeter入门

Jmeter简介 Jmeter的基本概念 百度百科: Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性,JMeter允许使用正则表达式创建断言   我们为什么使用Jmeter 开源免费,基于Java编写,可集成到其他系统可拓展各个功能插件 支持接口测试,压力测试等多种功能,支持录制回放,入门简单 相较于自己编写框架或其他开源工具,有较为完善的UI界面,便于接口调试 多平台支持,可在Linux,Windows,Mac上运行   Jmeter安装配置 Windows下Jmeter下载安装 登录 http://jmeter.apache.org/download_jmeter.cgi ,根据自己平台,下载对应文件 安装JDK,配置环境变量(具体步骤不做介绍) 将下载Jmeter文件解压,打开/bin/jmeter.bat   其他平台安装Jmeter 与Windows平台一致,除入口文件不同,例如linux平台下为/bin/jmeter.sh Jmeter的目录结构 /bin 目录(常用文件介绍) examples:目录下包含Jmeter使用实例 ApacheJMeter.jar:JMeter源码包 jmeter.bat:windows下启动文件 jmeter.sh:Linux下启动文件 jmeter.log:Jmeter运行日志文件 jmeter.properties:Jmeter配置文件 jmeter-server.bat:windows下启动负载生成器服务文件 jmeter-server:Linux下启动负载生成器文件 /docs目录——Jmeter帮助文档 /extras目录——提供了对Ant的支持文件,可也用于持续集成 /lib目录——存放Jmeter依赖的jar包,同时安装插件也放于此目录 /licenses目录——软件许可文件,不用管 /printable_docs目录——Jmeter用户手册   Jmeter相关插件安装: 插件安装: Jmeter的插件安装很简单,只需要下载对应插件解压即可。 下载地址:http://jmeter-plugins.org/downloads/all/ 下载后解压放入:apache-jmeter-2.12\lib\ext\目录下 重启jmeter ps:数据库链接驱动如果需要需要专门下载,例如mysql需要jdbc的jar包,地址:http://dev.mysql.com/downloads/file/?id=462850 使用注意事项:添加第三方插件并使用后保存的jmx文件在未添加该插件的运行环境下会导致无法打开该文件并报错,请保持环境一致性。 用例生成与导出: Jmeter的用例格式为jmx文件,实际为xml格式,感兴趣可以学习下自己定制生成想要的jmx文件。 生成原则: 每个功能模块为一个独立的jmx文件。增加可维护性。(尽量不要将一个jmx文件放入太多功能,后期维护成本会很高。) 模块的私有变量保存在模块中,多模块共有的(例如服务器ip端口等)可以考虑存在单独的文件中读取。 接口测试不要放太多线程,毕竟不是做压力测试,意义也不大。 导出方法: 编写测试用例 文件——保存为——确定:   Jmeter常用文件类型 Jmx文件 文件的实际类型:xml 文件样本: <jmeterTestPlan version="1.2" properties="1.8"> <hashTree> <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test" enabled="true"> <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="TestPlan.user_define_classpath"></stringProp> <boolProp name="TestPlan.serialize_threadgroups">false</boolProp> <boolProp name="TestPlan.functional_mode">false</boolProp> <stringProp name="TestPlan.comments">Sample test for demonstrating JMeter Ant build script and Schematic stylesheet</stringProp> </TestPlan> <hashTree> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true"> <longProp name="ThreadGroup.start_time">1143889321000</longProp> <stringProp name="ThreadGroup.delay"></stringProp> <stringProp name="ThreadGroup.duration"></stringProp> <stringProp name="ThreadGroup.num_threads">3</stringProp> <boolProp name="ThreadGroup.scheduler">false</boolProp> <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> <stringProp name="LoopController.loops">5</stringProp> <boolProp name="LoopController.continue_forever">false</boolProp> </elementProp> <longProp name="ThreadGroup.end_time">1143889321000</longProp> <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> <stringProp name="ThreadGroup.ramp_time">1</stringProp> </ThreadGroup> <hashTree> <CounterConfig guiclass="CounterConfigGui" testclass="CounterConfig" testname="Counter" enabled="true"> <stringProp name="CounterConfig.start">1</stringProp> <stringProp name="CounterConfig.incr">1000</stringProp> <stringProp name="CounterConfig.name">C</stringProp> <boolProp name="CounterConfig.per_user">false</boolProp> <stringProp name="CounterConfig.end">1000000</stringProp> </CounterConfig> <hashTree/> <JavaSampler guiclass="JavaTestSamplerGui" testclass="JavaSampler" testname="Sample 1" enabled="true"> <elementProp name="arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="Sleep_Time" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">100</stringProp> <stringProp name="Argument.name">Sleep_Time</stringProp> </elementProp> <elementProp name="Sleep_Mask" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">0xFF</stringProp> <stringProp name="Argument.name">Sleep_Mask</stringProp> </elementProp> <elementProp name="Label" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value"></stringProp> <stringProp name="Argument.name">Label</stringProp> </elementProp> <elementProp name="ResponseCode" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">200</stringProp> <stringProp name="Argument.name">ResponseCode</stringProp> </elementProp> <elementProp name="ResponseMessage" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">OK</stringProp> <stringProp name="Argument.name">ResponseMessage</stringProp> </elementProp> <elementProp name="Status" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">OK</stringProp> <stringProp name="Argument.name">Status</stringProp> </elementProp> <elementProp name="SamplerData" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">Request</stringProp> <stringProp name="Argument.name">SamplerData</stringProp> </elementProp> <elementProp name="ResultData" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">Response C=${C}</stringProp> <stringProp name="Argument.name">ResultData</stringProp> </elementProp> </collectionProp> </elementProp> <stringProp name="classname">org.apache.jmeter.protocol.java.test.JavaTest</stringProp> </JavaSampler> <hashTree> <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> <collectionProp name="Asserion.test_strings"> <stringProp name="51">3</stringProp> </collectionProp> <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> <intProp name="Assertion.test_type">6</intProp> <stringProp name="Assertion.assume_success">false</stringProp> </ResponseAssertion> <hashTree/> </hashTree> <JavaSampler guiclass="JavaTestSamplerGui" testclass="JavaSampler" testname="Sample 2" enabled="true"> <elementProp name="arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="Sleep_Time" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">100</stringProp> <stringProp name="Argument.name">Sleep_Time</stringProp> </elementProp> <elementProp name="Sleep_Mask" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">0xFF</stringProp> <stringProp name="Argument.name">Sleep_Mask</stringProp> </elementProp> <elementProp name="Label" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value"></stringProp> <stringProp name="Argument.name">Label</stringProp> </elementProp> <elementProp name="ResponseCode" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">200</stringProp> <stringProp name="Argument.name">ResponseCode</stringProp> </elementProp> <elementProp name="ResponseMessage" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">OK</stringProp> <stringProp name="Argument.name">ResponseMessage</stringProp> </elementProp> <elementProp name="Status" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">OK</stringProp> <stringProp name="Argument.name">Status</stringProp> </elementProp> <elementProp name="SamplerData" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">Request</stringProp> <stringProp name="Argument.name">SamplerData</stringProp> </elementProp> <elementProp name="ResultData" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">Response C=${C} Tn=${__threadNum}</stringProp> <stringProp name="Argument.name">ResultData</stringProp> </elementProp> </collectionProp> </elementProp> <stringProp name="classname">org.apache.jmeter.protocol.java.test.JavaTest</stringProp> </JavaSampler> <hashTree/> </hashTree> </hashTree> </hashTree> </jmeterTestPlan> Jtl文件 文件的实际类型:自定义 定义方法: 修改{jmeterhome}/bin/jmeter.profile,可选择格式:csv,xml,db # legitimate values: xml, csv, db. Only xml and csv are currently supported. #jmeter.save.saveservice.output_format=csv Jmeter运行模式及参数 GUI模式 打开已有的jmx文件(文件——打开) 点击启动按钮运行 由于GUI模式本身就是带界面的,也有中文版,就不在此详细介绍了。 命令行模式 依赖: 配置jmeter环境变量(windows下为将${jmeterhome}/bin加入Path变量) 如果未加入环境变量,在执行的时候可以直接给出全路径或在${jmeterhome}/bin下执行 命令: jmeter -n -t <testplan filename> -l <listener filename> 参数: -h 帮助 -> 打印出有用的信息并退出 -n 非 GUI 模式 -> 在非 GUI 模式下运行 JMeter -t 测试文件 -> 要运行的 JMeter 测试脚本文件 -l jtl文件 -> 记录结果的文件 -r 远程执行 -> 启动远程服务 -H 代理主机 -> 设置 JMeter 使用的代理主机 -P 代理端口 -> 设置 JMeter 使用的代理主机的端口号 -j 日志文件->设置JMeter日志文件的名称 实例: JMeter -n -t my_test.jmx -l log.jtl -H my.proxy.server -P 8000 执行步骤: JMeter 默认去当前目录寻找脚本文件,并把日志记录在当前目录。比如你在 C:\tools\apache-jmeter-2.11\bin 目录下执行以上命令,JMeter 会去该目录下寻找 test.jmx 脚本并把执行结果放在该目录。如果你的脚本在其他目录,而且想要把执行结果放在另外文件夹,可以使用绝对路径告诉 JMeter。 执行过程查看: D:\apache-jmeter-3.0\bin>jmeter -n -t D:\共享\bpintocpin.jmx -l D:\共享\test.jtl Writing log file to: D:\apache-jmeter-3.0\bin\jmeter.log Creating summariser <summary> Created the tree successfully using D:\共享\bpintocpin.jmx Starting the test @ Fri Jun 17 15:12:21 CST 2016 (1466147541295) Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445 summary = 1 in 00:00:01 = 0.8/s Avg: 1178 Min: 1178 Max: 1178 Err: 0 […]

性能测试工具 wrk 安装与使用

介绍 今天给大家介绍一款开源的性能测试工具 wrk,简单易用,没有Load Runner那么复杂,他和 apache benchmark(ab)同属于性能测试工具,但是比 ab 功能更加强大,并且可以支持lua脚本来创建复杂的测试场景。 wrk 的一个很好的特性就是能用很少的线程压出很大的并发量, 原因是它使用了一些操作系统特定的高性能 I/O 机制, 比如 select, epoll, kqueue 等。 其实它是复用了 redis 的 ae 异步事件驱动框架. 确切的说 ae 事件驱动框架并不是 redis 发明的, 它来至于 Tcl的解释器 jim, 这个小巧高效的框架, 因为被 redis 采用而更多的被大家所熟知. wrk GitHub 源码:https://github.com/wg/wrk 安装 wrk只能运行于 Unix 类的系统上,也只能在这些系统上便宜,所以我们需要一个Linux或者macOs。 不得不说,使用了 Win10之后方便很多。 必备条件: Win10 RS及以上版本 启用Ubuntu子系统 1、Win10 系统通过bash命令,切换到Ubuntu子系统。 然后需要安装一下编译工具,通过运行下面命令来安装工具:

安装 gcc 编译环境的时候最好挂一下VPN,速度会快些。 2、安装完成之后使用 git 下载 wrk 的源码到本地:

3、切换到git的wrk目录,然后使用make命令:

编译完成之后,目录下面会多一个 wrk 的文件。 测试 使用以下命令来测试一下:

简单说一下wrk里面各个参数什么意思? -t 需要模拟的线程数 -c 需要模拟的连接数 --timeout 超时的时间 -d 测试的持续时间 结果: Latency:响应时间 Req/Sec:每个线程每秒钟的完成的请求数 Avg:平均 Max:最大 Stdev:标准差 +/- Stdev: 正负一个标准差占比 标准差如果太大说明样本本身离散程度比较高. 有可能系统性能波动很大. 如果想看响应时间的分布情况可以加上--latency参数 我们的模拟测试的时候需要注意,一般线程数不宜过多,核数的2到4倍足够了。 多了反而因为线程切换过多造成效率降低, 因为 wrk 不是使用每个连接一个线程的模型, 而是通过异步网络 I/O 提升并发量。 所以网络通信不会阻塞线程执行,这也是 wrk 可以用很少的线程模拟大量网路连接的原因。 在 wrk 的测试结果中,有一项为Requests/sec,我们一般称之为QPS(每秒请求数),这是一项压力测试的性能指标,通过这个参数我们可以看出应用程序的吞吐量。 总结 关于 wrk 已经介绍完毕了,之所以写这篇文章的目的是为了接下来对 ASP.NET Core做一个性能对比测试(Java,NodeJS,Python等)时需要用到该工具,敬请大家期待。 本文地址:http://www.cnblogs.com/savorboard/p/wrk.html 作者博客:Savorboard 欢迎转载,请在明显位置给出出处及链接