Номер экземпляра 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 ответ

Решение

Есть несколько неверных предположений с этим тестом:

  1. Вы думаете, что развертываете 3 сервера, но они развернуты на одном и том же порту, поэтому на самом деле слушает только один. И развертывание большего количества серверов не увеличивает ваш параллелизм в любом случае
  2. Ваш тест не использует цикл обработки событий. Большая часть вашего времени тратится на установление новых связей. Вот почему вы видите "улучшение" при использовании keepalive, Это чистая сеть, а не Vert.x
  3. Убедитесь, что вы бежите ab на отдельной машине, или вы конкурируете на тех же ресурсах
  4. В любом случае не ожидайте увидеть какую-то 100% загрузку ЦП, так как вы не делаете ничего, требующего значительных ресурсов ЦП.
Другие вопросы по тегам