我正在使用 Vertx 3.8.0 构建一个 http 服务器。即使我将verticle的实例设置为大于1,也无法使用CPU(只能使用大约25%的CPU)。值得一提的是,当我将实例编号设置为时,我可以获得的最佳性能是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 benchmark 来测试服务器的吞吐量。
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),但没有更优雅的方式来利用计算资源吗?