From bbdb060121e271c1e23b9e1828cae0b7822b7f82 Mon Sep 17 00:00:00 2001 From: judasn Date: Thu, 12 Apr 2018 15:31:02 +0800 Subject: [PATCH] =?UTF-8?q?2018-04-12=20=E8=A1=A5=E5=85=85=20JMeter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + SUMMARY.md | 1 + TOC.md | 1 + markdown-file/JMeter-Install-And-Settings.md | 158 ++++++++++++++----- 4 files changed, 123 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 6638bcf2..5453a63f 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,7 @@ - [ELK 日志收集系统安装和配置](markdown-file/ELK-Install-And-Settings.md) - [Dubbo 安装和配置](markdown-file/Dubbo-Install-And-Settings.md) - [GitLab 安装和配置](markdown-file/Gitlab-Install-And-Settings.md) +- [JMeter 安装和配置](markdown-file/JMeter-Install-And-Settings.md) - [Docker 安装和使用](markdown-file/Docker-Install-And-Usage.md) - [LDAP 安装和使用](markdown-file/LDAP-Install-And-Settings.md) - [Alfresco 安装和使用](markdown-file/Alfresco-Install-And-Usage.md) diff --git a/SUMMARY.md b/SUMMARY.md index 77f1cc93..d52a9599 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -65,6 +65,7 @@ * [ELK 日志收集系统安装和配置](markdown-file/ELK-Install-And-Settings.md) * [Dubbo 安装和配置](markdown-file/Dubbo-Install-And-Settings.md) * [GitLab 安装和配置](markdown-file/Gitlab-Install-And-Settings.md) +* [JMeter 安装和配置](markdown-file/JMeter-Install-And-Settings.md) * [Docker 安装和使用](markdown-file/Docker-Install-And-Usage.md) * [LDAP 安装和使用](markdown-file/LDAP-Install-And-Settings.md) * [Alfresco 安装和使用](markdown-file/Alfresco-Install-And-Usage.md) diff --git a/TOC.md b/TOC.md index 9a21c617..c2044c28 100644 --- a/TOC.md +++ b/TOC.md @@ -63,6 +63,7 @@ - [ELK 日志收集系统安装和配置](markdown-file/ELK-Install-And-Settings.md) - [Dubbo 安装和配置](markdown-file/Dubbo-Install-And-Settings.md) - [GitLab 安装和配置](markdown-file/Gitlab-Install-And-Settings.md) +- [JMeter 安装和配置](markdown-file/JMeter-Install-And-Settings.md) - [Docker 安装和使用](markdown-file/Docker-Install-And-Usage.md) - [LDAP 安装和使用](markdown-file/LDAP-Install-And-Settings.md) - [Alfresco 安装和使用](markdown-file/Alfresco-Install-And-Usage.md) diff --git a/markdown-file/JMeter-Install-And-Settings.md b/markdown-file/JMeter-Install-And-Settings.md index a086d68f..3fd087b9 100644 --- a/markdown-file/JMeter-Install-And-Settings.md +++ b/markdown-file/JMeter-Install-And-Settings.md @@ -3,33 +3,12 @@ ## JMeter 介绍 -- 用 Java 开发,需要 JDK 环境,最新版至少需要 JDK 8 +- JMeter 用 Java 开发,需要 JDK 环境,当前最新版至少需要 JDK 8 - 官网: - 官网下载: - 官网插件库: - 官网 Github 源码: - 当前(201804)最新版本为 4.0 -- 关于介绍,这位童鞋写得很好,我无法超越,所以借用下: - -``` -Jmeter 是纯 java 应用,对于 CPU 和内存的消耗比较大,并且受到 JVM 的一些限制; - -一般情况下,依据机器配置,单机的发压量为 300~600,因此,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就容易卡死,引起 JAVA 内存溢出错误;(在 1.4GHz~3GHz 的 CPU、1GB 内存的 JMeter 客户端上,可以处理线程 100~300 -单台机器模拟的时候,如果并发数量较多且发送的网络包较大时,单机的网络带宽就会成为测试瓶颈,无法真正模拟高并发,导致测试结果失真(例如在要一秒内发送 3000 个请求,合计 512kb,但是测试电脑只有 256 的上传带宽,那么实际测试的时候只是模拟了在一秒内发送 1500 个请求(256kb)的场景,导致测试结果失真。下载带宽的影响也是类似的);即:如果所有负载由一台机器产生,网卡和交换机端口都可能产生瓶颈,所以一个 JMeter 客户端线程数不应超过 100。 -真正的业务场景并发,我觉得应该是用户数大,每个用户的请求数小。如:更可能是 1000 个用户在 2 秒内各发起 2 个请求,而不是 200 个用户在 2 秒内各发起 10 个请求,虽然总的请求数都是 2000 个。 - -为避免以上问题,更合理地进行性能测试,我们可以使用 Jmeter 提供的分布式测试功能。 - -注意: - -(1)每一台 jmeter 远程服务器(slave 机器)都执行相同的测试计划,jmeter 不会在执行期间做负载均衡,每一台服务器都会完整地运行测试计划; - -(2)采用 JMeter 远程模式并不会比独立运行相同数目的非 GUI 测试更耗费资源。但是,如果使用大量的 JMeter 远程服务器,可能会导致客户端过载,或者网络连接发生拥塞; - -(3)默认情况下,master 机器是不执行参与生成并发数据的; - -(4)调度机 (master) 和执行机 (slave) 最好分开,由于 master 需要发送信息给 slave 并且会接收 slave 回传回来的测试数据,所以 mater 自身会有消耗,所以建议单独用一台机器作为 mater。 -``` ## JMeter Windows 安装 @@ -43,12 +22,84 @@ Jmeter 是纯 java 应用,对于 CPU 和内存的消耗比较大,并且受 ## JMeter Linux 安装 +- 解压 zip 包,假设我放在 +- 增加环境变量:`vim ~/.zshrc`(我用的是 zsh) + +``` +# JMeter +JMETER_HOME=/usr/local/apache-jmeter-4.0 +PATH=$PATH:$JMETER_HOME/bin +export JMETER_HOME +export PATH +``` + +- 刷新配置:`source ~/.zshrc` +- 测试:`jmeter -v`,输出结果: + +``` +Apr 12, 2018 10:14:24 AM java.util.prefs.FileSystemPreferences$1 run +INFO: Created user preferences directory. + _ ____ _ ____ _ _ _____ _ __ __ _____ _____ _____ ____ + / \ | _ \ / \ / ___| | | | ____| | | \/ | ____|_ _| ____| _ \ + / _ \ | |_) / _ \| | | |_| | _| _ | | |\/| | _| | | | _| | |_) | + / ___ \| __/ ___ \ |___| _ | |___ | |_| | | | | |___ | | | |___| _ < +/_/ \_\_| /_/ \_\____|_| |_|_____| \___/|_| |_|_____| |_| |_____|_| \_\ 4.0 r1823414 + +Copyright (c) 1999-2018 The Apache Software Foundation +``` + +## JMeter Linux 测试 + +- Windows 是 GUI 操作,测试方便,Linux 只能用命令,所以这里进行记录 +- 准备好 jmx 测试脚本文件(可以在 Windows 上使用后,保存的脚本就是 jmx 后缀文件) +- 测试:`jmeter -n -t /opt/myTest.jmx -l /opt/myReport.jtl` + - 参数 n 表示以 nogui 方式运行测试计划 + - 参数 t 表示指定测试计划 + - 参数 l 表示生成测试报告 +- 显示 ... end of run 即脚本运行结束 +- 如果要后台运行 JMeter 可以:`setsid jmeter -n -t /opt/myTest.jmx -l /opt/myReport.jtl` +- 将上一步运行结束后生成的.jtl 文件拷贝到 win 上,打开 win 上的 Jmeter,随便新建一个项目,也可以用之前的项目,添加监听器,在监听器界面点击浏览,选择该.jtl 文件,就可以查看结果了 + + +## JMeter 分布式安装 + +- 分布式环境:分为 server、client + - server 等同于 controller、master(server 其实也可以作为 Client 使用,但是不推荐这样做) + - client 等同于 agent、slave +- **注意事项** + - 1、保持 controller 和 agent 机器的 JDK、jmeter 以及插件等配置版本一致; + - 2、如果测试数据有用到 CSV 或者其他方式进行参数化,需要将 data pools 在每台 Agent 上复制一份,且读取路径必须保持一致; + - 3、确保 controller 和 agent 机器在同一个子网里面; + - 4、检查防火墙是否被关闭,端口是否被占用(防火墙会影响脚本执行和测试结构收集,端口占用会导致 Agent 机报错); + - 5、分布式测试中,通过远程启动代理服务器,默认查看结果树中的响应数据为空,只有错误信息会被报回; + - 6、如果并发较高,建议将 controller 机设置为只启动测试脚本和收集汇总测试结果,在配置文件里去掉 controller 机的 IP; + - 7、分布式测试中,如果 1S 启动 100 个模拟请求,有 5 个 Agent 机,那么需要将脚本的线程数设置为 20,否则模拟请求数会变成 500,和预期结果相差太大。 +- 分布式测试流程: + - 运行所有 agent 机器上的 jmeter-server.bat 文件 + - 假定我们使用两台机器 192.168.0.1 和 192.168.0.2 作为 agent + - 修改 controller 机器的 JMeter /bin/jmeter.properties 文件 + +``` +默认值是: +remote_hosts=127.0.0.1 + +修改为: +remote_hosts=192.168.0.1:1099,192.168.0.2:1099 + +其中默认 RMI 端口是 1099,如果被占用,可以看 http://jmeter.apache.org/usermanual/remote-test.html 进行修改 +``` + +- 启动 Controller 机器上的 JMeter.bat,进入 Run -> Remote Start + + ## JMeter 基础知识 ### 线程组 - Ramp-up Period(in seconds) -- 决定多长时间启动所有线程。如果使用 10 个线程,ramp-up period 是 100 秒,那么 JMeter 用 100 秒使所有 10 个线程启动并运行。每个线程会在上一个线程启动后 10 秒(100/10)启动。Ramp-up 需要要充足长以避免在启动测试时有一个太大的工作负载,并且要充足小以至于最后一个线程在第一个完成前启动。一般设置 ramp-up 等于线程数,有需求再根据该值进行调整。 + - 决定多长时间启动所有线程。如果使用 10 个线程,ramp-up period 是 100 秒,那么 JMeter 用 100 秒使所有 10 个线程启动并运行。每个线程会在上一个线程启动后 10 秒(100/10)启动。Ramp-up 需要要充足长以避免在启动测试时有一个太大的工作负载,并且要充足小以至于最后一个线程在第一个完成前启动。一般设置 ramp-up 等于线程数,有需求再根据该值进行调整。 + - 一般不要设置为 0,不然 JMeter 一启动就会发送大量请求,服务器可能瞬间过载,测试不出平时那种因为平均访问带来的高负载情况。 + - 估值方法:假设线程数为 100, 估计的点击率为每秒 10 次, 那么估计的理想 ramp-up period 就是 100/10 = 10 秒。每秒点击率需要自己获取系统数据,或是自己估值。 ### 定时器 @@ -69,8 +120,45 @@ Jmeter 是纯 java 应用,对于 CPU 和内存的消耗比较大,并且受 - constant throughput timer 常数吞吐量定时器可以让 jmeter 以指定数字的吞吐量(即指定 tps,只是这里要求指定每分钟的执行数,而不是每秒)执行。吞吐量计算的范围可以为指定为当前线程、当前线程组、所有线程组,并且计算吞吐量的依据可以是最近一次线程的执行时延。 + +### 聚合报告 + +- `Label`:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值 +- `Samples`:表示你这次测试中一共发出了多少个请求,如果模拟 10 个用户,每个用户迭代 10 次,那么这里显示 100 +- `Average`:平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,也可以以 Transaction 为单位显示平均响应时间(单位是毫秒) +- `Median`:中位数,也就是 50% 用户的响应时间(单位是毫秒) +- `90% Line`:90% 用户的响应时间 +- `Note`:关于 50% 和 90% 并发用户数的含义,请参考下文 +- `http://www.cnblogs.com/jackei/archive/2006/11/11/557972.html +- `Min`:最小响应时间 +- `Max`:最大响应时间 +- `Error%`:本次测试中出现错误的请求的数量 / 请求的总数(怎么测试出整个系统的压力了? 如果 Error% 里面开始出现大量的错误,那就说明系统开始有瓶颈了,基本这时候就是最大压力节点,也就可以得到系统最大并发数是多少了。一般错误率不高于 1%,优秀的情况是不高于 0.01%)(若出现错误就要看服务端的日志,查找定位原因) +- `Throughput`:吞吐量——默认情况下表示每秒完成的请求数(Request per Second),当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数 +- `KB/Sec`:每秒从服务器端接收到的数据量,相当于 LoadRunner 中的 Throughput/Sec,主要看网络传输能力 + + +## 常见问题 + +- 个人经验: + - 对开发机中的项目测试:一般 100 线程,循环 10 次即可。 + - 对服务器上的小项目测试:一般 300 线程,循环 10 次即可。 + - 对服务器上的中大型项目测试:采用分布式测试,分别测试:300 ~ 5000 线程情况。 + - 假设好一点的机子设置 500 线程,一般的机子设置 300 线程。预计总 5000 线程需要 5 台好机子, 9 台一般机子。 + - 也可以通过修改 JVM 方式来调整每台机子性能上限,修改 /bin/jmeter 的合适值 +``` +: "${HEAP:="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"}" +``` + +- JMeter 即使加了 cookie manage 也没有保存 session 的,一个原因是:HTTP 请求默认值,中服务器 IP,只能填 IP 或是域名,一定不要在这里面在加上某个后缀地址,这样没办法保存的 session 的 +- 测试多用户的同时测试的效果,一种是用 jmeter 的 csv 功能,一种是复制几个脚本,每个脚本里面的登录信息不一样。或者是创建两个不同的线程组,每个线程组的登录信息不一样,然后每个线程组都有自己的 HTTP Cookie 管理器 +- 在压力测试过程中,要监控服务器情况,可以使用 [nmon 系统性能监控工具的使用](Nmon.md) + ## JMeter 资料 +- 图文: + - [官网 User's Manual](http://jmeter.apache.org/usermanual/) + - [快速学习Jmeter性能测试工具](http://gitbook.cn/books/58de71a8be13fa66243873ef/index.html) + - [jmeter:菜鸟入门到进阶系列](http://www.cnblogs.com/imyalost/p/7062784.html) - 国内视频教程: - [JMeter 性能测试入门篇 - 慕课网](https://www.imooc.com/learn/735) - [JMeter 之 HTTP 协议接口性能测试 - 慕课网](https://www.imooc.com/learn/791) @@ -80,24 +168,18 @@ Jmeter 是纯 java 应用,对于 CPU 和内存的消耗比较大,并且受 - 国外视频教程: - [JMeter Beginner](https://www.youtube.com/playlist?list=PLhW3qG5bs-L-zox1h3eIL7CZh5zJmci4c) - [JMeter Advanced](https://www.youtube.com/playlist?list=PLhW3qG5bs-L_Eosy1Nj1tKHC5jcBAVkPb) - - []() - - []() - ## 资料 +- - - -- <> -- <> -- <> -- <> -- <> -- <> -- <> -- <> -- <> -- <> -- <> -- <> +- +- +- +- +- +- +- +