Wildfly8.1.0.Final 上部署的 RestFul 服务未处理 30% 的请求

Posted

技术标签:

【中文标题】Wildfly8.1.0.Final 上部署的 RestFul 服务未处理 30% 的请求【英文标题】:30% Of Requests are not processed by RestFul Service deployed on wildfly8.1.0.Final 【发布时间】:2014-10-19 08:48:17 【问题描述】:

我正在使用 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>

我的测试:

    使用 Jmeter,生成了 3000 个并发请求。 其中 25 - 30 % 的请求因连接被拒绝而失败。 Server.log 未显示任何错误。

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

【问题讨论】:

您能否展示您的 JMeter 测试计划并解释如何执行 3000 个 conc 请求? @PMDUBIK-INGENIERIE 我无法添加屏幕截图,因为我的声誉很低。我创建了线程组并配置了线程属性,如下所示: 1. 线程数:3000 2. 加速周期:1 秒 3. 循环计数:1 我生成的 HTTP 请求是 POST 并且 PAYLOAD 是 Protobuf 我的问题是关于测试配置文件,你能显示 ThreadGroup 配置吗?谢谢 创建线程组并配置线程属性如下: 1. 线程数:3000 2. 加速周期:1 秒 3. 循环数:1 【参考方案1】:

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

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

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

解决方法是增加 IO 子系统中的一些值:

io-threads="8"

task-max-threads="64"

【讨论】:

如果您看到问题中提到的我的 io 子系统配置。我已经在使用相同的了。以undertow为基准,支持100万并发请求。但我没有看到这种情况发生,即使有 3000 个并发请求,也有 30% 的连接被拒绝 有 1000 个请求,它工作正常,失败率为 0%,如果我放的更多,那么我会看到失败 所以您正面临一个负载问题,这是您可以从测试中得到的。但是你真的应该确保你的测试配置文件是正确的,根据我的经验,它看起来真的很奇怪。如果答案是好的,你应该接受并投票,谢谢 我觉得Jmeter没有问题,因为它能够生成3000个线程。我了解您在答案中提到的配置,但它对我没有帮助,而且我还需要调整 Wildfly。如果我没有找到解决方案,我需要摆脱使用 undertow 网络服务器并使用其他网络服务器。感谢您有兴趣了解此问题。【参考方案2】:

我对 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: Connection refused: connect”,这里有趣的是nginx根本没有注册失败的请求。

这是场景:

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

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

对我来说,谜团在于为什么针对 nodejs 运行的相同测试没有失败,但经过多次运行后,它在纯 nodejs HelloWorld 上失败,并显示“java.net.ConnectException: Connection denied: connect”。

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

【讨论】:

此信息很有帮助。我会尽力回复您。谢谢

以上是关于Wildfly8.1.0.Final 上部署的 RestFul 服务未处理 30% 的请求的主要内容,如果未能解决你的问题,请参考以下文章

@DELETE 上的 Jersey 错误:“不支持的 HTTP 方法:DELETE”

camunda-webapp 和 JAAS 身份验证

在 Linux 上的 Azure 上部署 R (centos 8.2.2004)

使用 ECR 中部署的羽毛的 Docker R 脚本的 AWS 密钥和秘密

如何部署OSW运行?

在 Apache 上部署 Django - 目录布局