1

我正在使用 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 没有显示任何错误。

知道如何为生成的请求实现 0% 的失败率。

4

2 回答 2

2

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

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

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

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

  • io-threads="8"

  • 任务最大线程=“64”

于 2014-08-27T16:59:01.703 回答
0

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

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

奇怪的是,只有当我使用打开连接的 java 客户端时,我才会拒绝连接。我用 java 打开了 800 个并发连接,其中许多都被拒绝了。即使套接字超时为 1000 毫秒,我也尝试了测试。这是我的 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 的 node.js 客户端运行相同的测试会产生 0% 的失败。

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

我又做了一个测试。我改变的是把 nginx 放在 wildfly 前面,以便更好地理解请求。java 测试再次抛出“java.net.ConnectException:连接被拒绝:连接”,这里有趣的是 nginx 根本没有注册失败的请求。

这是场景:

  1. nginx的访问日志是空的。
  2. 我从一起开始的 java 线程发出 1100 个请求。
  3. 我有来自客户端的 177 个请求,它们抛出“java.net.ConnectException”
  4. 在 nginx 访问日志中,我有 923 个使用 HTTP CODE 200 注册的请求 - 好的,我没有注册其他请求。

这让我想到在 java 中从同一台机器打开客户端套接字存在一些问题。也许 Undertow 没有问题,只是客户端失败了。

对我来说,谜团在于为什么针对 nodejs 运行的相同测试没有失败,但经过几次运行后,它在纯 nodejs HelloWorld 上失败,并出现“java.net.ConnectException:连接被拒绝:连接”。

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

于 2014-09-14T20:23:19.213 回答