在wildfly8.1.0.Final上部署的RestFul服务不处理30%的请求

时间:2014-08-26 05:42:32

标签: rest jmeter performance-testing wildfly-8 undertow

我正在使用Undertow网络服务器。 这是我的下行子系统配置:

<subsystem xmlns="urn:jboss:domain:undertow:1.1">
            <buffer-cache name="default"/>
            <server name="default-server">
                <http-listener name="default" socket-binding="http"/>
                <host name="default-host" alias="localhost">
                    <location name="/" handler="welcome-content"/>
                    <filter-ref name="limit-connections"/>
                    <filter-ref name="server-header"/>
                    <filter-ref name="x-powered-by-header"/>
                </host>
            </server>
            <servlet-container name="default">
                <jsp-config/>
            </servlet-container>
            <handlers>
                <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
            </handlers>
            <filters>
                <connection-limit name="limit-connections" max-concurrent-requests="15000" queue-size="1000"/>
                <response-header name="server-header" header-name="Server" header-       value="WildFly/8"/>
                <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
            </filters>
        </subsystem>

IO子系统配置(硬件:4核处理器和16 GB RAM):

  <subsystem xmlns="urn:jboss:domain:io:1.1">
            <worker name="default" task-keepalive="300" io-threads="8" task-max-threads="64"/>
            <buffer-pool name="default"/>
        </subsystem>

我的测试:

  1. 使用Jmeter,生成3000个并发请求。
  2. 其中25%-30%的请求因拒绝连接而失败。
  3. Server.log未显示任何错误。
  4. 知道如何为生成的请求获得0%的失败率。

2 个答案:

答案 0 :(得分:2)

如果拒绝连接意味着拒绝它们,它将不会记录在server.log中,可能在access.log中但不确定。

您应该尝试慢慢加速JMeter以查看开始出错的限制。

另外,我建议你增加迭代次数,因为这个模拟似乎并不现实。你试图重现什么行为?

修复将增加IO子系统中的一些值:

  • io-threads =“8”

  • 任务的最大线程= “64”

答案 1 :(得分:0)

我和Undertow有同样的问题。当我使用java客户端访问服务器时,大约30%的连接被拒绝。

当我使用ab.exe(ApacheBench)时,即使我使用1000个并发连接,我也有0%被拒绝(似乎这触及了Windows 7的限制)。

奇怪的是,只有当我使用打开连接的java客户端时才会拒绝连接。我用java打开了800个并发连接,其中很多都被拒绝了。即使插座超时为1000ms,我也尝试了测试。这是我的java客户端中打开连接的片段:

    URL url = new URL("http://localhost/testWeb/test2");
    URLConnection testConnection = url.openConnection();
    testConnection.setConnectTimeout(1000);
    testConnection.setReadTimeout(1000);
    InputStream is = testConnection.getInputStream();

我提到的奇怪的事情是ab.exe测试运行良好:

 c:\work\dotera\servers\apache\bin>ab -n 10000 -c 1000 http://localhost:8080/testWeb/test
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Finished 10000 requests


Server Software:        WildFly/8
Server Hostname:        localhost
Server Port:            8080

Document Path:          /testWeb/test
Document Length:        108 bytes

Concurrency Level:      1000
Time taken for tests:   5.302303 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      3620000 bytes
HTML transferred:       1080000 bytes
Requests per second:    1885.97 [#/sec] (mean)
Time per request:       530.230 [ms] (mean)
Time per request:       0.530 [ms] (mean, across all concurrent requests)
Transfer rate:          666.69 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0  12.2      0     998
Processing:    56  478 316.6    320    1319
Waiting:        9  320 327.2    198    1291
Total:         56  479 316.7    320    1319

Percentage of the requests served within a certain time (ms)
  50%    320
  66%    326
  75%    841
  80%    847
  90%    893
  95%   1302
  98%   1310
  99%   1314
 100%   1319 (longest request)

c:\work\dotera\servers\apache\bin>

我认为这可能有助于理解问题的本质。

还有一点要提到的是,使用java客户端和ab.exe运行相同的测试会再次运行带有0%failiure的node.js客户端。

=============================================== ===========================

我做了另一个测试。我改变的是将nginx放在野蝇面前以更好地理解请求。 java测试再次抛出&#34; java.net.ConnectException:连接被拒绝:连接&#34;这里有趣的是nginx根本没有注册失败的请求。

以下是该方案:

  1. nginx的访问日志为空。
  2. 我一起开始从java线程发出1100个请求。
  3. 我有来自客户端的177个请求抛出&#34; java.net.ConnectException&#34;
  4. 在nginx访问日志中,我有923个使用HTTP CODE 200注册的请求 - 好的,我没有注册其他请求。
  5. 这让我觉得在java中从同一台机器打开客户端套接字存在一些问题。也许Undertow没有ptoblem,它只是失败的客户。

    对我来说,神秘之处在于为什么运行针对nodejs的相同测试没有失败,但是经过多次运行后,它在纯粹的节点上失败了HelloWorld,带有&#34; java.net.ConnectException:连接被拒绝:连接&#34 ;

    对我来说,结论是在java下运行的客户端存在问题。 Undertow(Wildfly / 8.1)没有问题