运行"空"时每秒HTTP请求的限制因素是什么?暗流?

时间:2014-12-03 16:34:28

标签: java windows http tcp undertow

我正在运行一个非常简单的Undertow配置。整个代码包括:

public class HelloWorldUndertow {
    public static void main(String[] args) {
        Undertow undertow = Undertow.builder()
                .addHttpListener(9090, "0.0.0.0")
                .setHandler(new HttpHandler() {
                    @Override
                    public void handleRequest(HttpServerExchange exchange) throws Exception {
                        exchange.setResponseCode(200);
                        exchange.getResponseSender().send("hello!");
                    }
                }).build();
        undertow.start();
    }
}

我尝试测试它可以处理的每秒请求数。我使用apache ab工具进行测量:

ab -n 100000 -c 10 http://localhost:9090/test

我设法获得的最大数字是10000左右/秒:

Concurrency Level:      10
    Time taken for tests:   10.664 seconds
    Complete requests:      100000
    Failed requests:        0
    Total transferred:      10000000 bytes
    HTML transferred:       600000 bytes
    Requests per second:    9377.69 [#/sec] (mean)
    Time per request:       1.066 [ms] (mean)
    Time per request:       0.107 [ms] (mean, across all concurrent requests)
    Transfer rate:          915.79 [Kbytes/sec] received

    Connection Times (ms)
    min  mean[+/-sd] median   max
    Connect:        0    0   0.2      0       1
    Processing:     0    1   0.5      1      11
    Waiting:        0    1   0.5      1      11
    Total:          0    1   0.5      1      11

    Percentage of the requests served within a certain time (ms)
    50%      1
    66%      1
    75%      1
    80%      1
    90%      2
    95%      2
    98%      2
    99%      2
    100%     11 (longest request)

我觉得它很大,但我在这种情况下是一个限制因素。它不是处理器(当使用Java Mission Control进行采样时应用程序运行低于20%)而不是内存。我在Windows上运行它 - 也许这就是原因?

1 个答案:

答案 0 :(得分:1)

我无法告诉您如何在Windows中运行时使其性能更佳,但如果您在Linux中运行它,则可以在此处执行Jetty推荐的调优:http://www.eclipse.org/jetty/documentation/current/high-load.html 总结:

sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 16384 16777216"
sysctl -w net.core.somaxconn=4096
sysctl -w net.core.netdev_max_backlog=16384
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
sysctl -w net.ipv4.tcp_tw_recycle=1
sysctl -w net.ipv4.tcp_congestion_control=cubic

运行代码时包含-server JVM参数。

然后尝试: ab -n 100000 -c 100 http://localhost:9090/test

(使用100个连接发出100,000个请求)

当我在我的Windows7笔记本电脑(3岁)上运行在VMWare Player中的Linux vm中尝试时,我每秒会收到超过100,000个请求。