Номер экземпляра Vertx http-сервера не улучшает пропускную способность
Я использую Vertx 3.8.0 для создания http-сервера. Процессор не может быть использован (может использоваться только около 25% процессорного времени), даже когда я устанавливаю экземпляр вертикали с числом больше 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 Benchmark для тестирования пропускной способности сервера.
ab -c 150 -n 100000 http://10.32.31.35:8080/api/values/
Пропускная способность составляет около 8 Кбит / с. Сервер использует только около 25% процессорного времени. Если я использую Keepalive HTTP, пропускная способность составляет около 48 КБ с около 50% процессора.
Я использовал JMX для мониторинга серверной программы. Кажется, что установка количества экземпляров действительно работает. Существует более 1 событийных циклов, обрабатывающих запросы, но, скорее всего, цикл принятия событий является узким местом.
Есть ли способ улучшить это? Я думаю, что несколько экземпляров vertx могли бы помочь (например, docker), но нет ли более элегантного способа использования вычислительного ресурса?
1 ответ
Есть несколько неверных предположений с этим тестом:
- Вы думаете, что развертываете 3 сервера, но они развернуты на одном и том же порту, поэтому на самом деле слушает только один. И развертывание большего количества серверов не увеличивает ваш параллелизм в любом случае
- Ваш тест не использует цикл обработки событий. Большая часть вашего времени тратится на установление новых связей. Вот почему вы видите "улучшение" при использовании
keepalive
, Это чистая сеть, а не Vert.x - Убедитесь, что вы бежите
ab
на отдельной машине, или вы конкурируете на тех же ресурсах - В любом случае не ожидайте увидеть какую-то 100% загрузку ЦП, так как вы не делаете ничего, требующего значительных ресурсов ЦП.