Enable 4 selectors, add reproducer without JMH
diff --git a/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/thin/JmhThinClientCacheBenchmark.java b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/thin/JmhThinClientCacheBenchmark.java
index acdd0d0..3beeb24 100644
--- a/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/thin/JmhThinClientCacheBenchmark.java
+++ b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/thin/JmhThinClientCacheBenchmark.java
@@ -1,8 +1,11 @@
 package org.apache.ignite.internal.benchmarks.jmh.thin;
 
+import java.util.ArrayList;
+import java.util.concurrent.ForkJoinPool;
+import java.util.concurrent.ForkJoinTask;
 import java.util.concurrent.ThreadLocalRandom;
 
-import org.apache.ignite.internal.benchmarks.jmh.runner.JmhIdeBenchmarkRunner;
+import org.apache.ignite.IgniteSystemProperties;
 import org.openjdk.jmh.annotations.Benchmark;
 
 public class JmhThinClientCacheBenchmark extends JmhThinClientAbstractBenchmark {
@@ -34,60 +37,40 @@
      */
     public static void main(String[] args) throws Exception {
         // TODO: Benchmark hangs when GridNioServer.selectorCount > 1
-        // This goes away with -DIGNITE_IO_BALANCE_PERIOD=0
-        // TODO: File ticket for IGNITE_IO_BALANCE_PERIOD issue
-        // TODO: Exception with multiple selectors - race condition?
-//        class org.apache.ignite.binary.BinaryObjectException: Invalid flag value: 0
-//        at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1964)
-//        at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1716)
-//        at org.apache.ignite.internal.binary.GridBinaryMarshaller.deserialize(GridBinaryMarshaller.java:319)
-//        at org.apache.ignite.internal.client.thin.ClientBinaryMarshaller.deserialize(ClientBinaryMarshaller.java:74)
-//        at org.apache.ignite.internal.client.thin.ClientUtils.readObject(ClientUtils.java:579)
-//        at org.apache.ignite.internal.client.thin.ClientUtils.readObject(ClientUtils.java:569)
-//        at org.apache.ignite.internal.client.thin.TcpClientCache.readObject(TcpClientCache.java:783)
-//        at org.apache.ignite.internal.client.thin.TcpClientCache.readObject(TcpClientCache.java:788)
-//        at org.apache.ignite.internal.client.thin.TcpClientChannel.receive(TcpClientChannel.java:261)
-//        at org.apache.ignite.internal.client.thin.TcpClientChannel.service(TcpClientChannel.java:187)
-//        at org.apache.ignite.internal.client.thin.ReliableChannel.lambda$affinityService$5(ReliableChannel.java:321)
-//        at org.apache.ignite.internal.client.thin.ReliableChannel.applyOnNodeChannelWithFallback(ReliableChannel.java:820)
-//        at org.apache.ignite.internal.client.thin.ReliableChannel.affinityService(ReliableChannel.java:320)
-//        at org.apache.ignite.internal.client.thin.TcpClientCache.cacheSingleKeyOperation(TcpClientCache.java:711)
-//        at org.apache.ignite.internal.client.thin.TcpClientCache.get(TcpClientCache.java:111)
-//        at org.apache.ignite.internal.benchmarks.jmh.thin.JmhThinClientCacheBenchmark.get(JmhThinClientCacheBenchmark.java:26)
-//
-//
-//        JmhThinClientCacheBenchmark b = new JmhThinClientCacheBenchmark();
-//        b.setup();
-//        b.put();
-//        b.get();
-//
-//        ArrayList<ForkJoinTask> tasks = new ArrayList<>();
-//        for (int i =0; i < 4; i++) {
-//            int finalI = i;
-//            ForkJoinTask<?> task = ForkJoinPool.commonPool().submit(() -> {
-//                for (int j = 0; j < 1000; j++) {
-//                    System.out.println(">> " + finalI + " - " + j);
-//                    b.get();
-//                }
-//            });
-//
-//            tasks.add(task);
-//        }
-//
-//        for (ForkJoinTask t: tasks) {
-//            t.join();
-//            System.out.println("JOINED");
-//        }
-//
-//        b.tearDown();
+        System.setProperty(IgniteSystemProperties.IGNITE_IO_BALANCE_PERIOD, "0");
 
-        JmhIdeBenchmarkRunner.create()
-                .forks(1)
-                .threads(4)
-                .warmupIterations(5)
-                .measurementIterations(10)
-                .benchmarks(JmhThinClientCacheBenchmark.class.getSimpleName())
-                .jvmArguments("-Xms4g", "-Xmx4g")
-                .run();
+        JmhThinClientCacheBenchmark b = new JmhThinClientCacheBenchmark();
+        b.setup();
+        b.put();
+        b.get();
+
+        ArrayList<ForkJoinTask> tasks = new ArrayList<>();
+        for (int i = 0; i < 4; i++) {
+            int threadIdx = i;
+            ForkJoinTask<?> task = ForkJoinPool.commonPool().submit(() -> {
+                for (int j = 0; j < 1000; j++) {
+                    System.out.println(">> " + threadIdx + " - " + j);
+                    b.get();
+                }
+            });
+
+            tasks.add(task);
+        }
+
+        for (ForkJoinTask t : tasks) {
+            t.join();
+            System.out.println("JOINED");
+        }
+
+        b.tearDown();
+
+//        JmhIdeBenchmarkRunner.create()
+//                .forks(1)
+//                .threads(4)
+//                .warmupIterations(5)
+//                .measurementIterations(10)
+//                .benchmarks(JmhThinClientCacheBenchmark.class.getSimpleName())
+//                .jvmArguments("-Xms4g", "-Xmx4g")
+//                .run();
     }
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java
index 3519fa8..a0b76ad 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java
@@ -83,7 +83,7 @@
                     .logger(gridLog)
                     // TODO: Review settings below
                     // TODO: Buffer sizes from settings - check them
-                    .selectorCount(1) // TODO: Do we need a setting? Run a benchmark.
+                    .selectorCount(4) // TODO: Do we need a setting? Run a benchmark.
                     .byteOrder(ByteOrder.nativeOrder())
                     .directBuffer(true)
                     .directMode(false)