Vertx http服务器实例号不能提高吞吐量

时间:2019-08-27 02:50:07

标签: vert.x vertxoptions

我正在使用Vertx 3.8.0构建http服务器。即使我将顶点的实例设置为大于1的数字,也无法利用CPU(只能使用大约25%的CPU)。有趣的是,当我将实例号设置为1时,我可以获得的最佳性能。 1。

public class Runner {
    public static void main(String[] args) {

        VertxOptions vertxOptions = new VertxOptions().setPreferNativeTransport(true);
        vertxOptions.setEventLoopPoolSize(6);
        final HttpServerOptions options = new HttpServerOptions()
                .setTcpFastOpen(true)
                .setTcpNoDelay(true)
                .setTcpQuickAck(true);

        final Vertx vertx = Vertx.vertx(vertxOptions);

        DeploymentOptions deploymentOptions;
        deploymentOptions = new DeploymentOptions().setInstances(3);
        vertx.deployVerticle(() -> new AbstractVerticle() {
                    @Override
                    public void start(Future<Void> startFuture) {


                        vertx.createHttpServer(options)
                                .requestHandler(req -> {
                                    req.response().end("1");
                                })
                                .listen(8080, "0.0.0.0");
                    }
                }, deploymentOptions
        );
        System.out.println("Deployment done with pooling");
    }

}

我使用apache基准测试服务器的吞吐量。

 ab -c 150 -n 100000 http://10.32.31.35:8080/api/values/

吞吐量大约每秒8k。服务器仅使用大约25%的CPU。 如果我使用http的keepalive,则吞吐量约为48k,CPU约为50%。

我使用JMX监视服务器程序。看来实例编号设置确实有效。有超过1个处理请求的事件循环,但是接受者事件循环可能是瓶颈。

是否有改善的方法? 我认为vertx的多个实例会有所帮助(例如docker),但没有其他更优雅的方式来利用计算资源吗?

1 个答案:

答案 0 :(得分:1)

此测试有一些无效的假设:

  1. 您认为您正在部署3台服务器,但是它们部署在同一端口上,因此实际上只有一台服务器在监听。而且部署更多服务器并不会增加您的并发性
  2. 您的测试没有充分利用事件循环。您的大部分时间都浪费在建立新的连接上。这就是使用keepalive时看到“改进”的原因。这是纯网络,而不是Vert.x
  3. 确保您在单独的计算机上运行ab,或者您在相同的资源上竞争
  4. 无论如何,您都不会期望CPU利用率达到100%,
相关问题