我一直在使用JMeter为生产服务器生成负载以测试我的应用程序。 该测试计划具有13个以上的HTTP采样器以发出不同的请求,并具有一个正则表达式提取器以从响应中提取一些值。 此值在连续的HTTP Sampler中使用。 这个测试用例简单而直接。 最初,我使用200个JMeter线程来模拟200个用户。 Server能够轻松处理许多请求,但是当线程数增加时,它就无法无限地处理和等待。 当然发生了什么事。 JMeter线程正在等待连接,因此无法无限等待它。 为了避免这种情况,我引入了“ HTTP Request default”来添加一些连接和响应超时。 解决了一个问题,现在线程没有无限地挂在那里,但它们因以下异常而超时。
java.net.SocketTimeoutException: Read timed outat java.net.SocketInputStream.socketRead0(Native Method)at java.net.SocketInputStream.read(SocketInputStream.java:129)at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)at java.io.BufferedInputStream.read(BufferedInputStream.java:237)at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:78)at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:106)at org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1116)at org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1973)at org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1735)at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1098)at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)at org.apache.jmeter.protocol.http.sampler.HTTPHC3Impl.sample(HTTPHC3Impl.java:258)at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:62)at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1088)at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1077)at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:428)at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:256)at java.lang.Thread.run(Thread.java:662)
肯定是服务器(Apache 2.2.14 + Apache-tomcat-7.0.11)的一部分正在崩溃,但不确定是哪一部分。 当然设置中存在一些瓶颈。 在当前设置中,Apache服务器正在将请求转发到Tomcat引擎。 因此,可以肯定的是,它们之一都不能一次处理200多个请求。 我做了一些更改,将所有请求直接转发到Tomcat引擎。 它能够处理它,这意味着Apache在懈怠。 我Swift检查了/var/log/apache2/error.log
存在的Apache error.log文件,发现以下几行。
[Wed Jun 26 16:46:19 2013] [error] server is within MinSpareThreads of MaxClients, consider raising the MaxClients setting
[Wed Jun 26 16:46:20 2013] [error] server reached MaxClients setting, consider raising the MaxClients setting
[Wed Jun 26 17:24:42 2013] [error] server is within MinSpareThreads of MaxClients, consider raising the MaxClients setting
[Wed Jun 26 17:24:43 2013] [error] server reached MaxClients setting, consider raising the MaxClients setting
这清楚地表明MaxClients数应该增加,这反过来又会增加Apache线程数。 我通过放置以下配置快速编辑了apache2.conf文件以增加MaxClients数量,并执行"apache2ctl -t"
以确认在配置文件中所做的更改是正确的。
<IfModule mpm_worker_module>StartServers 2MinSpareThreads 25 MaxSpareThreads 100 ThreadLimit 800ThreadsPerChild 800 MaxClients 2400MaxRequestsPerChild 0
</IfModule>
我有些放松,以为现在Apache一定会处理现在的负载。 但是令我惊讶的是,它不能一次又一次地碰到JMeter。 在这一点上,我想通过启用服务器状态来检查Apache的性能。 此功能可以使您清楚地了解连接状态。 我将以/etc/apache2/mods-available/status.conf
放在/etc/apache2/mods-available/status.conf
<Location /server-status>SetHandler server-statusOrder deny,allowDeny from allAllow from .your.domain.here.com localhost
</Location>
我通过执行以下命令重新启动了Apache和服务器
/> sudo service apache2 restart; sudo service tomcat restart;
Apache重新启动后,我点击以下URL获取服务器状态。
http://your.server.name/server-status?refresh=3
在为200多个线程运行JMeter之后,我在状态页面上注意到了这一点。
状态页指示"W"
(发送答复)状态下有大量连接。 这可能是由其他原因引起的。 我试图用Google搜索它,但找不到任何确定的解决方案。 但是有一件事可以肯定,Apache不会引起问题。 它必须在Apache和tomcat之间。 我意识到JMeter测试计划适用于200个线程,甚至Tomcat默认情况下也具有200个线程。 我只是碰巧通过编辑"<APACHE_TOMCAT_HOME>/conf/server.xml"
文件将线程数增加到400。
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" maxThreads="400" minSpareThreads="20" />
现在,服务器可以轻松处理JMeter负载,即使完成测试计划,Apache连接也处于良好状态。
尽管问题已解决,但是当JMeter配置为直接将所有请求发送给Tomcat时,我无法理解为什么Tomcat能够处理负载,但是当Apache将请求转发至Tomcat时,却无法处理负载。 如果您对此行为有任何解释,请在评论部分中分享。
翻译自: https://www.javacodegeeks.com/2013/07/apache-server-and-jmeter-debugging.html