Posted on 2006-09-14 22:57
Jackei 阅读(4516)
评论(42) 编辑 收藏 网摘 所属分类:
04.软件性能测试18.开源技术 & 开源文化
作为一个纯 JAVA 的GUI应用,JMeter 对于CPU和内存的消耗还是很惊人的,所以当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至还会引起JAVA内存溢出的错误。不过,JMeter 也可以像 LoadRunner 一样通过使用多台机器运行所谓的 Agent 来分担 Load Generator 自身的压力,并借此来获取更大的并发用户数。根据 JMeter官方文档的署名,你需要自己完成这个配置,不过不用担心,这将非常简单 ^_^
1. 在所有期望运行 JMeter 作为 Load Generator 的机器上安装 JMeter,并确定其中一台机器作为 Controller,其他的机器作为 Agent。然后运行所有 Agent 机器上的JMeter-server.bat文件——假定我们使用两台机器 192.168.0.1 和 192.168.0.2 作为 Agent;
2. 在Controller 机器的 JMeter 安装目录下找到 bin 目录,再找到 JMeter.properties 这个文件,使用记事本或者其他文字编辑工具打开它;
3. 在打开的文件中查找“remote_hosts=”这个字符串,你可以找到这样一行“remote_hosts=127.0.0.1”。其中的 127.0..0.1 表示运行 JMeter Agent 的机器,这里需要修改为“remote_hosts=192.168.0.1:1664,192.168.0.2:1664”——其中的 1664 为 JMeter 的 Controller 和 Agent 之间进行通讯的默认 RMI 端口号;
4. 保存文件,并重新启动 Controller 机器上的 JMeter.bat,并进入 Run -> Remote Start 菜单项。看到啥了?^_^

Feedback
今天借到一位朋友的 email 投诉,说偶 blog 中文章的字体太小,不方便查阅,所以偶从这篇文章开始加大了字号,希望可以对大家的阅读感受有所改善。
对于以前的文章,因为实在没有时间一篇篇的修改字体字号——博客园没有提供统一调整字体的功能,而 400 多篇也是一个不小的工作量。所以只能想到两个方法暂时解决一下这个问题:
1.请大家注意浏览器的字体设置。IE 在“查看→文字大小”菜单下可以调整;Firefox 可以提供无限制的字体缩小放大功能;
2.把感兴趣的文章 copy 到 word 之类的文字处理工具中阅览。
如果大家有其他好的建议和意见,可以留言或者 email 我,谢谢 ^_^
我晕!
按住CTRL键,动动鼠标滚轮,字体就变大了。我这里IE和OPERA都可以这样操作的。
别告诉我你鼠标没滚轮啊!
@tomatoes
应该可以的,因为图片是从别的地方链过来的,所以如果看不到可能要刷新几次。
@冷月
其实作多了就会发现性能测试工具只不过是用来锦上添花的,而不是最关键的。多看看性能测试方面的资料吧。哪天有空可以小聚一下聊聊 ^_^
jackei 你好,很感谢,你跟大伙分享的心得体会。我在工作遇到一个问题,想和你讨论一下:
前不久我用Jmeter 3 Agent, 1 Contrl 模拟300个并发进程进行测试,结果测试通过了。后来改用LoadRunner 模拟300个并发进程对同一server进行测试,服务器59sec时候挂掉了,查看日志,连接池超过150个,导致Java虚拟机挂了。by the way,我查看了网络连接的日志,jmeter模拟并发连接数,峰值大约是60个。http://bbs.51testing.com/thread-50486-1-1.html
所以我对Jmeter 分布测试的可靠性表示怀疑,不知你有没有做过相关的比较和验证。
@liyoukebit@sina.com.cn
应该说不排除 LR 和 JMeter 模拟多用户并发时存在差异的可能。
建议先用 JMeter 单机模拟 300 个并发用户和 3 agant + 1 control 对比一下,再跟 LR 的测试结果对比一下。
另外,看了你在 51 上面的帖子,建议你对比一下 LR 和 JMeter 如下几项的区别:
1.脚本包含的内容;
2.平均事务响应时间;
3.每秒事务数。
我想有你的问题有可能是因为脚本所包含的内容存在差异造成的,如果你这个脚本是用 JMeter 的 Proxy Server 的方式录制的,建议换用 Badboy 重新录制再测试一下看看。
关于如何使用 Badboy 录制生成 JMeter 脚本,可以参考下面这篇文章:
http://www.cnblogs.com/jackei/archive/2006/11/10/557160.html">http://www.cnblogs.com/jackei/archive/2006/11/10/557160.html
希望可以解决你的疑问 ^_^
呵呵,很感谢 jackei的及时回复。
因为我做以上工作只是评价工具的可用性,所以我录制的操作很简单,登陆,退出。所以可以排除脚本内容的问题。也许是我有一个地方误解了,我设置的Jmeter Contrl 100个进程启动,原来我理解其它Agent各做100个,总共100*3个。现在怀疑是Contrl 把100个分摊到每个Agent上。后天上班,做个试验,呵呵。周末愉快。
@liyoukebit@sina.com.cn
呵呵,不客气,回头确认了问题的根源记得回来和大家通报一声 ^_^
顺便说一下,你原来的理解没错,的确是“Agent各做100个,总共100*3个”。
jmeter解出来后,没有进行环境设置,端口用1664,提示bad call;改用1099,OK!
@janezhang815
嗯,默认应该是 1099 端口的。
@Jackei
不好意思,前段时间忙,耽搁了,没有及时给大家汇报结果,写了个脚本分析一下连接情况,确认“Agentg各做100个,总共100*3个”。但是并不是并发做,我有三个Agent42,21,220,由220做Server,三个Agent并不是并发开始,做了几次都是21,220先开始执行,大约2分钟后,42才开始。恰巧我的脚本比较短,所以21,220执行结束了 42连结数才达到最大,所以出现上述的疑问。谢谢你的帮忙
by the way,想请教一个Loadrunner的问题。性能测试工具我是Jmeter先入手的,经常遇到这样一个场景,电信行业资源管理,集团用户下工作单,让省和地市公司用户干活,表现为在web上操作一系列工单。比如输入工单号orderCode="中国移动网资[2006]",生成一条工单记录,然后web通过,工单ID来操作,比如http://192.9.100.200?orderID=343132323,在Jmeter中 orderCode采用文件变量进行输入,而orderID从新建定单返回网页中使用正则表达式匹配orderID,以变量形式代替orderID。这样就可以模拟多个新建定单操作。
问题:LoadRuner如何处理,或者说技术支持推荐做法,有些人建议从数据库读出orderID,我认为这样不是加重服务器端的负载了,我觉得还是可以采用和Jmeter相似的方法,我想听听你的建议。
有些长,辛苦了,能和高手交流,挺好的,哈
@liyoukebit@sina.com.cn
呵呵,多谢你的回复 ^_^
对于你提到的问题,建议你参考一下 LR 中的 web_reg_save_param 函数。
有机会多交流 ^_^
jackei 你好:想问一个问题:
1、模拟并发用户时,Agent上分别设置用户的数量,那这台机是不是不用设置用户数量(只需在Agent上设置用户的数)
jackei 你好:想问一个问题:
1、模拟并发用户时,Agent上分别设置用户的数量,那Controller这台机是不是不用设置用户数量(只需在Agent上设置用户的数)
@angel[匿名]
1.所谓的 Agent,是指运行了 jmeter-server.bat 的那台机器;
2.所谓的 Controller,是指运行了 JMeter(UI 客户端或者命令行方式)的那台机器;
3.Agent 可以和 Controller 运行在同一台机器上,也可以运行多个 Agent 在同一台机器上;
4.JMeter 中不能对单个 Agent 设置并发用户数量,例如:有三个 Agent,你在 JMeter 中定义了 100 个并发用户,那么就是 3 个 Agent 每个都模拟 100 个用户,一共是 300 个。
我在两台Agent机器上,执行了JMeter-server.bat文件
在Controller 上 Run -> Remote Start 菜单项 里选择那两台Agent
这时通过查看Agent上的jmeter.log文件,也确定已经连接上了。
这个时候,我在Controller上运行脚本,我想知道怎么判断,Agent是在工作?
另外:在远程停止和远程退出菜单项里,两个Agent的IP始终都是灰色的状态。
所以我一直担心,Controller和Agent之间虽然连上了,但是Agent没有在工作
有个最简单有效的方法。在服务器上装一个 Apache,然后通过 JMeter 访问 Apache 的默认页面。执行完成后看看 Apache 的访问日志,就知道哪些 IP 的机器访问过了,也就知道 Agent 工作是否正常了。
呵呵,上次做过一个这样的实验,不过也不知到底道算是把复杂问题简单化,还是把简单问题复杂化了 ^_^
谢谢,Jackei !
我虽然没有安装Apache,但是你启发了我
我在服务器(linux服务器)上执行了netstat -ant 命令,看Agent 机器有没有在
服务器上建立tcp连接。
结果只发现了Controller的机器的IP,没有发现Agent 机器的IP。
我搞了半天,也不知道问题出在那里!
另外:如果Agent机器能正常工作的话,在聚合报告里能体现出来吗?
@七夜
如果Agent机器能正常工作的话,在聚合报告里能体现出来吗?
——>如果我没有记错,应该是不会体现出来的。
结果只发现了Controller的机器的IP,没有发现Agent 机器的IP
——>暂时没有想到答案,或者你自己再查查吧,参考一下 JMeter 的手册,在 %JMETER_HOME%/printable_docs 目录下有比较详细的文档介绍。
请问,我的控制机器(就是运行脚本的机器,在中国),跟agenet机器(在美国)不在一个网段上,ping的时候网络延迟是200多毫秒呢,这样是否会影响测试结果?
remote_hosts字段是否可以将controller的ip添加进去?127.0.0.1可以吗?
Jackei我有个一问题,如果选择了分布式,那么Jmeter的Controller报告是包含了Agent 的结果 还是仅仅是controller自身的结果?
sorry~!刚刚才注意到七夜的问题,原来和我是同一个问题...
@grace
应该会的,远程控制最好是在同一网段的。我也不清楚。。。
Jackei 你好,我想用ant 来驱动jmeter来做分布式测试,一直没找到相关资料,只能在本地执行用例没办法远程启动agent,谢谢Jackei帮忙解答一下
@wujianping
不好意思,没有试过用 ant 驱动的方法,不过可以先确认一下远端的agent是否已经启动了,能否手工通过 JMeter GUI 连过去并正常测试,OK 了以后再尝试 ant 吧 :)
如果还有问题,建议找个开发高手帮忙看看 :)
# Remote Hosts - comma delimited
remote_hosts=10.0.38.74
# RMI port to be used by the server (must start rmiregistry with same port)
server_port=1664
我测试时候要如上才正常执行
@liangjz
hi,JZ. 上次看你blog说开始引入JMeter,现在大规模使用JMeter了吗?
在使用2.3.1版本时,
server_port=这一行可以不填,
remote_hosts后面也不必加端口号,加了反而连不上。
另agent要设置一个JMETER_HOME的环境变量。
Hi 博主,
我现在遇到2个问题,按照我的理解在聚合报告里面,troughput=average(sec)*samples/60,可是我先在得到的结果是举个例子,我的sample是311.average是29383ms,可是对应的throughput只有2.6/min,如果我的理解没错的话,按照上面的计算公式,算出的throughput应该是150/min.这相差也太远了吧?麻烦你帮我解答!谢谢!
还有个问题,我测试的系统是个供应链管理平台,需要在网页上查看单证,例如每天有几千个注册用户要查看他们的电子订单和发票,可是每张单证都有个guid是唯一的,这样我参数化用户后,每次登陆打开的单证都不一样,我用badboy录制的脚本,我是否还需要把单证的guid也参数化?
HI,Jackei,我又遇到个很急的问题,我把loginId参数化以后每次登陆都失败,请求上看到的是“loginId=%24%7BloginId%7D&password=123456”,响应数据是“login failed”,开发的说这个请求里的loginId是错的,可是我明明是用一个正确的txt文件里的loginId区登陆的,为什么参数化后会失败?
有没有人 遇到过这个问题:
我在一个test plan 里面添加了12个线程组,可是在我执行这个testplan时,发现其中一个线程组里居然执行了其他线程组里的http request,我只好用最笨的办法,把他们全都分开,到时候分别执行test plan,不好这样好像很麻烦,要同时打开n个jmeter。还有没有更好的办法呢?