Hello,
I am trying to examine a throughput of OpenHFT networking in version 1.12.2 to compare it with my toy.
My test works in the following way:
I have few concurrent clients that send (by loopback) to the server (written with OpenHFT networking) 131`072 messages of size 4KB and blocking-wait for a (1-byte) response that confirms that message was processed by the server.
I've run a test with -DServerThreadingStrategy=CONCURRENT, MULTI_THREADED_BUSY_WAITING
and SINGLE_THREADED
.
number of clients OpenHFT: avg. Messages per second: my toy
(run on different threads) CONCURRENT SINGLE_THREADED MULTI_THREADED_BUSY_WAITING CONCURRENT (no single threaded strategy)
1 52.47 50.4 49.95
41.4
2 40.21 48.57 39.54 44.65
4 21.92 23.68 21.51 32.04
8 10.78 12.83 10.91 23.06
16 5.53 6.02 5.57 11.77
32 2.68 2.79 2.76 6.46
________________________________________________________________________________________________________________________________________________________________
I suppose that the problem is with my
usage of that library, but I cannot figure out what is wrong- it is not
so easy to write a test because of lack/obsolete documentation/examples.
The server is run as follows: (I skipped not important details to make it shorter)
private static EventLoop eg;
public static void starServer() {
eg = new EventGroup(true);
eg.start();
TCPRegistry.createServerSocketChannelFor(desc);
AcceptorEventHandler eah = new AcceptorEventHandler(desc, LegacyHanderFactory.legacyTcpEventHandlerFactory(nc -> new Confirmer()), VanillaNetworkContext::new);
// Confirmer send one-byte message to a client to confirm processing of message
eg.addHandler(eah);
}
class Confirmer implements TcpHandler<NetworkContext> {
@Override
public void process(@NotNull final Bytes in, @NotNull final Bytes out, NetworkContext nc) {
if (in.readRemaining() == 0){
return;
}
out.write(in, in.readPosition(), 1); // send a confirmation
in.readSkip(Math.min(in.readRemaining(), out.writeRemaining()));
}
}
}
A client code (run on different threads):
private void sender(long numberOfMessage, int sizeOfMessage) {
SocketChannel sc = TCPRegistry.createSocketChannel(desc);
sc.configureBlocking(true);
ByteBuffer buffer = ByteBuffer.allocateDirect(sizeOfMessage);
ByteBuffer recv = ByteBuffer.allocateDirect(1);
buffer.putInt(64); // required bytes. To be frankly, I don't understand exactly why 64.
buffer.put(bytes.getBytes()); // nearly 4KB-text-message
long start = System.nanoTime();
for(int i = 0; i < numberOfMessage; i++){
buffer.clear();
recv.clear();
sc.write(buffer);
sc.read(recv);
}
times.add(System.nanoTime() - start); // use it to compute an average after
sc.close();
}
And I use times to get an average throughput.
P.S. I see that system is loaded (in the sense of threads and kernel network stack) but results seems to be low though. I don't have an experience and I cannot decide whether that results are normal.
P.S.2 I also know that my test is primitive