性能测试梳理

来源:互联网 发布:以前qq网络硬盘 编辑:程序博客网 时间:2024/06/06 05:24

在开发人员完成代码编写,并功能测试无误后,开始着手准备性能测试。
//说明:R表示应用;U表示仿真;

阶段一:
将R部署到一个tomcat。使用jmeter进行并发200测试。无问题。
阶段二:
将R部署到两个tomcat。使用jmeter进行并发400测试。发现数据库连接池有问题,将连接池由proxool改为c3p0。
阶段三:
将R部署到四个tomcat。使用jmeter进行并发800测试。
问题一:现象:R的日志中出现数据库session错误。
处理:排查后,发现是因为数据库连接池设置和db2设置不合适。
解决:做了如下的调整:
1.数据库设置: 将LOCKLIST参数和MAXLOCKS参数调节为合适值。(这两个参数通过db2 get db cfg|grep -i lock可以抓取出来)
2.数据库连接池优化:
1)将数据库连接池的最大连接数、最小连接数、初始化连接数均改为最大连接数;
2)调整数据库连接池的以下参数:maxIdleTime, numHelperThreads, checkoutTimeout, maxIdeleTimeExcessConnections, idleConnectionTestPeriod, preferredTestQuery.
问题二:现象:R的log中报错:
1)java.net.SocketException: A connection with a remote socket was reset by that socket.
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:383)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:245)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:225)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:377)
at java.net.Socket.connect(Socket.java:539)
at sun.net.NetworkClient.doConnect(NetworkClient.java:170)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:407)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:542)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:246)
at sun.net.www.http.HttpClient.New(HttpClient.java:319)
at sun.net.www.http.HttpClient.New(HttpClient.java:336)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:980)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:865)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:846)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1024)
2)java.net.SocketException: A system call received a parameter that is not valid.
at java.net.PlainSocketImpl.socketSetOption(Native Method)
at java.net.PlainSocketImpl.setOption(PlainSocketImpl.java:314)
at java.net.Socket.setTcpNoDelay(Socket.java:874)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:415)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:542)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:246)
at sun.net.www.http.HttpClient.New(HttpClient.java:319)
at sun.net.www.http.HttpClient.New(HttpClient.java:336)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:980)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:865)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:846)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1024)
at com.cup.nocard.appproto.util.HttpUtil.doPostCmd(HttpUtil.java:64)
3)java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:383)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:245)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:225)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:377)
at java.net.Socket.connect(Socket.java:539)
at sun.net.NetworkClient.doConnect(NetworkClient.java:170)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:407)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:542)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:246)
at sun.net.www.http.HttpClient.New(HttpClient.java:319)
at sun.net.www.http.HttpClient.New(HttpClient.java:336)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:980)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:865)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:846)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1024)
处理:问题均指向R中的一个函数,遂抽象出该函数,针对该函数做测试。
1)为该函数写了一个servlet部署在tomcatA中,后面连接仿真U(部署在tomcatB)。
2)用jmeter对tomcatA做并发1000的测试,发现依旧报错,错误提示如下:
java.net.SocketException: A system call received a parameter that is not valid.
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:383)
3)仔细查看这个函数,都是简单的处理,遂怀疑是tomcat的设置是否合适。
用jmeter对tomcatB做并发1000的测试,发现会报错。怀疑是tomcat在启动线程后会快速的回收线程。
对tomcat的线程控制进行调整:删除原先设置的调度器。将对线程数的设置放在Connector节点里(server.xml)。
测试后,问题不再复现。
解决:调整仿真U的tomcat设置。
问题三:现象:用jmete测试时,发现jmeter发起请求的前面几十个请求的average time较长。怀疑是由于刚开始发请求时,tomcat需要时间去建立这些连接。
处理:在正式的测试开始之前,将仿真的tomcat和R应用的tomcat均启动到最大线程数。

问题四:现象:jmeter测试时,总能发现MAX Time的值比averaget Time的值大出10倍,乃至50倍。
处理:怀疑是jmeter调度的问题。
1)使用了非界面的方式进行jmeter测试,结果与有GUI的差不多;
2)在服务器上进行jmeter测试,MAX Time的值比averaget Time的值大出10倍左右。有优化。
解决:在服务器上使用jmeter用非GUI的方式模拟客户端发起请求。

总结:
1.做性能测试时,最开始的时候环境会有些复杂,各种因素都会参杂。必须要静下心来慢慢的排查。是个问题,就能有解决方法。
2.1)测试的第一步首先要找出出错的点,即产生异常的代码。
2)为该代码做一个简单的模型,对该模型进行测试。
3)在测试的过程中一步一步的简化测试的重点。从测试一个流程到测试一个block,再到测试block里的一段,直到找出那个测试点为止。


简化,再简化。最简单的东西里才能找问题。一步一步排除。