Repository: quarkusio/quarkus
Issue: Should start a single Vertx instance, or guarantee unique thread names

### Describe the bug

When starting Quarkus in dev mode, there are two independent Vert.x engined started:
 
1. One by `VertxCoreRecorder#initialize` triggered by `ResteasyStandaloneRecorder`
2. One by `DevConsoleProcessor#initializeVirtual`.

This doesn't seem efficient (is it necessary?) and is extremely confusing, as both instances are starting threads which have overlapping names; so for example I now have two different copies of `vert.x-eventloop-thread-0`, making it puzzling to resolve some of the memory leaks.



### Expected behavior

Ideally, start a single vert.x. (Is the second start by design @stuartwdouglas , @FroMage  ?)

If that's not possible, let's try at least to have them produce unambiguous thread names.


### Quarkus version or git rev

`cf73c98c5b`

Changed files:
extensions/vertx-http/deployment/src/main/java/io/quarkus/vertx/http/deployment/devmode/console/DevConsoleProcessor.java

diff --git a/extensions/vertx-http/deployment/src/main/java/io/quarkus/vertx/http/deployment/devmode/console/DevConsoleProcessor.java b/extensions/vertx-http/deployment/src/main/java/io/quarkus/vertx/http/deployment/devmode/console/DevConsoleProcessor.java
index 0af391b45bf..8a84e13f6da 100644
--- a/extensions/vertx-http/deployment/src/main/java/io/quarkus/vertx/http/deployment/devmode/console/DevConsoleProcessor.java
+++ b/extensions/vertx-http/deployment/src/main/java/io/quarkus/vertx/http/deployment/devmode/console/DevConsoleProcessor.java
@@ -28,6 +28,7 @@
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionStage;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -103,13 +104,18 @@
 import io.quarkus.vertx.http.runtime.logstream.LogStreamRecorder;
 import io.vertx.core.Handler;
 import io.vertx.core.Vertx;
+import io.vertx.core.VertxOptions;
 import io.vertx.core.http.HttpMethod;
 import io.vertx.core.http.HttpServerOptions;
 import io.vertx.core.http.HttpServerRequest;
 import io.vertx.core.http.impl.Http1xServerConnection;
 import io.vertx.core.impl.EventLoopContext;
+import io.vertx.core.impl.VertxBuilder;
 import io.vertx.core.impl.VertxInternal;
+import io.vertx.core.impl.VertxThread;
 import io.vertx.core.net.impl.VertxHandler;
+import io.vertx.core.net.impl.transport.Transport;
+import io.vertx.core.spi.VertxThreadFactory;
 import io.vertx.ext.web.Route;
 import io.vertx.ext.web.Router;
 import io.vertx.ext.web.RoutingContext;
@@ -134,7 +140,7 @@ public static void initializeVirtual() {
         if (virtualBootstrap != null) {
             return;
         }
-        devConsoleVertx = Vertx.vertx();
+        devConsoleVertx = initializeDevConsoleVertx();
         VertxInternal vertx = (VertxInternal) devConsoleVertx;
         QuarkusClassLoader ccl = (QuarkusClassLoader) DevConsoleProcessor.class.getClassLoader();
         ccl.addCloseTask(new Runnable() {
@@ -213,6 +219,35 @@ public void handle(HttpServerRequest event) {
 
     }
 
+    /**
+     * Boots the Vert.x instance used by the DevConsole,
+     * applying some minimal tuning and customizations.
+     * 
+     * @return the initialized Vert.x instance
+     */
+    private static Vertx initializeDevConsoleVertx() {
+        final VertxOptions vertxOptions = new VertxOptions();
+        //Smaller than default, but larger than 1 to be on the safe side.
+        int POOL_SIZE = 2;
+        vertxOptions.setEventLoopPoolSize(POOL_SIZE);
+        vertxOptions.setWorkerPoolSize(POOL_SIZE);
+        vertxOptions.getMetricsOptions().setEnabled(false);
+        //Not good for development:
+        vertxOptions.getFileSystemOptions().setFileCachingEnabled(false);
+        VertxBuilder builder = new VertxBuilder(vertxOptions);
+        builder.threadFactory(new VertxThreadFactory() {
+            @Override
+            public VertxThread newVertxThread(Runnable target, String name, boolean worker, long maxExecTime,
+                    TimeUnit maxExecTimeUnit) {
+                //Customize the Thread names so to not conflict with the names generated by the main Quarkus Vert.x instance
+                return new VertxThread(target, "[DevConsole]" + name, worker, maxExecTime, maxExecTimeUnit);
+            }
+        });
+        builder.transport(Transport.JDK);
+        builder.init();
+        return builder.vertx();
+    }
+
     protected static void newRouter(Engine engine,
             NonApplicationRootPathBuildItem nonApplicationRootPathBuildItem) {