前天客户要求给他提供一份性能测试报告,说:“我们的系统将来的用户数量可以达到800人左右,所以我希望系统能够支持的最大用户并发数可以达到1000” 。⊙﹏⊙b汗
我用的测试工具是Jmeter2.2。需要测试的是一个OA系统办公平台。主要遇到的以下几个问题:(jmeter的基本使用网上很多)
问题1、系统的所有功能必要要登录以后才能使用,那么使用Jmeter测试时,登录问题如何解决?
我想要测试的是用户登录系统之后,看到的首页。因为这个这个页面的访问量是最大的而且也是最能体现系统速度的。
我想的方法是首先访问登录页面让Jmeter登录,然后并发访问首页。
这里加“if控制器”的目的是让第一个线程可以做登录动作。
关于控制器中的条件的写法,帮助文档中说支持JS脚本,但是又有这几个例子:
- ${COUNT}<10
- "${VAR}" == "abcd"
- "${JMeterThread.last_sample_ok}" == "true" (check if last sample succeeded)
说明用${}来取得系统中的变量(有些变量要通过调用jmeter中的函数来取得);除了数字以外,其他的技术类型都要用字符串的形式如:true要写成"true"。看来和JS脚本还是不一样啊。
__threadNum是jmeter中的函数,用来取得当前线程的编号,返回的是一个数字。对于jmeter中的函数介绍,可以看这里http://jakarta.apache.org/jmeter/usermanual/functions.html
“HTTP Cookie管理器”在这里的作用是使得同一个线程中的多个请求都是同一个session,就像是从同一个浏览器向服务器发出的请求一样。但是“HTTP Cookie管理器”好像无法使得同一个线程组中的多个线程里的请求都为同一个session。
当设置线程数为10时,第一个线程的测试结果没有问题,但从第二个线程开始,“首页”都只能返回错误的结果。
所以这里虽然解决了登录的问题,但是却带来了新的问题:我的目的只是测试“首页”,但现在却不得不连“登录”也一起测试。
这个问题我最终还是无法解决,如果那位高人知道,请留言说明一下,谢谢。
问题2、java.io.IOException: Error writing to server和java.net.SocketException: Connection reset 异常;我测试500个并发时,系统没有问题;可当我把线程数加到800时,就出现错误了,在“查看结果树”中,打开出错的请求,看到如下异常:
java.io.IOException: Error writing to server
at sun.reflect.GeneratedConstructorAccessor24.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at org.apache.jmeter.protocol.http.sampler.HTTPSampler.readResponse(HTTPSampler.java:222)
at org.apache.jmeter.protocol.http.sampler.HTTPSampler.sample(HTTPSampler.java:433)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:658)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:647)
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:247)
at java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: Error writing to server
at sun.net.www.protocol.http.HttpURLConnection.writeRequests(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.writeRequests(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getHeaderField(Unknown Source)
at java.net.URLConnection.getContentEncoding(Unknown Source)
at org.apache.jmeter.protocol.http.sampler.HTTPSampler.readResponse(HTTPSampler.java:213)
... 5 more乍一看我还以为是服务器出了什么问题了,可是到服务器上一看,却没有发现什么异常。于是就还以是不是本机出了什么问题,可能是本机的JVM太晓了,于是修改了/bin/jmeter.bat文件:找到这2行
set HEAP=-Xms256m -Xmx256m
set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m改为:
set HEAP=-Xms256m -Xmx1024m
set NEW=-XX:NewSize=128m -XX:MaxNewSize=512m然后就不在报错了。