Vertx http 服务器实例数量不会提高吞吐量
Vertx http server instance number does not improve throughput
我正在使用 Vertx 3.8.0 构建一个 http 服务器。 CPU 无法使用(只有大约 25% 的 CPU 可以使用)即使我将 Verticle 的实例设置为大于 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,约占 50% CPU.
我使用JMX 来监控服务器程序。实例数设置似乎确实有效。有超过 1 个事件循环处理请求,但很可能接受器事件循环是瓶颈。
有什么可以改进的吗?
我认为 vertx 的多个实例会有所帮助(如 docker)但是没有更优雅的方式来利用计算资源吗?
这个测试有一些无效的假设:
- 您认为您正在部署 3 台服务器,但它们部署在同一端口上,因此实际上只有一台服务器在侦听。无论如何部署更多服务器并不会增加并发性
- 您的测试没有那么多地使用事件循环。您的大部分时间都浪费在建立新的联系上。这就是您在使用
keepalive
时看到 "improvement" 的原因。这是纯粹的网络,而不是 Vert.x
- 确保你 运行
ab
在不同的机器上,否则你正在竞争相同的资源
- 无论如何不要期望看到某种 100% CPU 的利用率,因为实际上您没有做任何 CPU 密集的事情
我正在使用 Vertx 3.8.0 构建一个 http 服务器。 CPU 无法使用(只有大约 25% 的 CPU 可以使用)即使我将 Verticle 的实例设置为大于 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,约占 50% CPU.
我使用JMX 来监控服务器程序。实例数设置似乎确实有效。有超过 1 个事件循环处理请求,但很可能接受器事件循环是瓶颈。
有什么可以改进的吗? 我认为 vertx 的多个实例会有所帮助(如 docker)但是没有更优雅的方式来利用计算资源吗?
这个测试有一些无效的假设:
- 您认为您正在部署 3 台服务器,但它们部署在同一端口上,因此实际上只有一台服务器在侦听。无论如何部署更多服务器并不会增加并发性
- 您的测试没有那么多地使用事件循环。您的大部分时间都浪费在建立新的联系上。这就是您在使用
keepalive
时看到 "improvement" 的原因。这是纯粹的网络,而不是 Vert.x - 确保你 运行
ab
在不同的机器上,否则你正在竞争相同的资源 - 无论如何不要期望看到某种 100% CPU 的利用率,因为实际上您没有做任何 CPU 密集的事情