From 522c0bb7065d603fffd189261bf74f2050553bb5 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Wed, 30 Sep 2020 10:24:27 +0200 Subject: [PATCH] benchmark --- .../uring/example/EchoIOUringServer.java | 15 ++--- .../channel/uring/example/EchoNioServer.java | 63 +++++++++++++++++++ ...verHandler.java => EchoServerHandler.java} | 16 ++++- 3 files changed, 84 insertions(+), 10 deletions(-) create mode 100644 transport-native-io_uring/src/test/java/io/netty/channel/uring/example/EchoNioServer.java rename transport-native-io_uring/src/test/java/io/netty/channel/uring/example/{EchoIOUringServerHandler.java => EchoServerHandler.java} (69%) diff --git a/transport-native-io_uring/src/test/java/io/netty/channel/uring/example/EchoIOUringServer.java b/transport-native-io_uring/src/test/java/io/netty/channel/uring/example/EchoIOUringServer.java index ead233f47c..082e58be0a 100644 --- a/transport-native-io_uring/src/test/java/io/netty/channel/uring/example/EchoIOUringServer.java +++ b/transport-native-io_uring/src/test/java/io/netty/channel/uring/example/EchoIOUringServer.java @@ -18,27 +18,28 @@ package io.netty.channel.uring.example; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; import io.netty.channel.ChannelPipeline; import io.netty.channel.EventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.uring.IOUringEventLoopGroup; import io.netty.channel.uring.IOUringServerSocketChannel; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; + +import java.util.concurrent.ThreadFactory; //temporary prototype example public class EchoIOUringServer { - private static final int PORT = Integer.parseInt(System.getProperty("port", "8080")); + private static final int PORT = Integer.parseInt(System.getProperty("port", "8081")); public static void main(String []args) { - EventLoopGroup bossGroup = new IOUringEventLoopGroup(1); - EventLoopGroup workerGroup = new IOUringEventLoopGroup(1); - final EchoIOUringServerHandler serverHandler = new EchoIOUringServerHandler(); + EventLoopGroup bossGroup = new IOUringEventLoopGroup(1, (ThreadFactory) null, 0, false); + EventLoopGroup workerGroup = new IOUringEventLoopGroup(1, (ThreadFactory) null, 0, true); + final EchoServerHandler serverHandler = new EchoServerHandler(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) + .option(ChannelOption.SO_REUSEADDR, true) .channel(IOUringServerSocketChannel.class) - .handler(new LoggingHandler(LogLevel.INFO)) .childHandler(new ChannelInitializer() { @Override public void initChannel(SocketChannel ch) throws Exception { diff --git a/transport-native-io_uring/src/test/java/io/netty/channel/uring/example/EchoNioServer.java b/transport-native-io_uring/src/test/java/io/netty/channel/uring/example/EchoNioServer.java new file mode 100644 index 0000000000..e93073efcc --- /dev/null +++ b/transport-native-io_uring/src/test/java/io/netty/channel/uring/example/EchoNioServer.java @@ -0,0 +1,63 @@ +/* + * Copyright 2020 The Netty Project + * + * The Netty Project licenses this file to you under the Apache License, + * version 2.0 (the "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package io.netty.channel.uring.example; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; + +//temporary prototype example +public class EchoNioServer { + private static final int PORT = Integer.parseInt(System.getProperty("port", "8088")); + + public static void main(String []args) { + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + EventLoopGroup workerGroup = new NioEventLoopGroup(1); + final EchoServerHandler serverHandler = new EchoServerHandler(); + try { + ServerBootstrap b = new ServerBootstrap(); + b.group(bossGroup, workerGroup) + .option(ChannelOption.SO_REUSEADDR, true) + .channel(NioServerSocketChannel.class) + .childHandler(new ChannelInitializer() { + @Override + public void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline p = ch.pipeline(); + //p.addLast(new LoggingHandler(LogLevel.INFO)); + p.addLast(serverHandler); + } + }); + + // Start the server. + ChannelFuture f = b.bind(PORT).sync(); + + // Wait until the server socket is closed. + f.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + // Shut down all event loops to terminate all threads. + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } +} diff --git a/transport-native-io_uring/src/test/java/io/netty/channel/uring/example/EchoIOUringServerHandler.java b/transport-native-io_uring/src/test/java/io/netty/channel/uring/example/EchoServerHandler.java similarity index 69% rename from transport-native-io_uring/src/test/java/io/netty/channel/uring/example/EchoIOUringServerHandler.java rename to transport-native-io_uring/src/test/java/io/netty/channel/uring/example/EchoServerHandler.java index d203843dd3..7869e87db5 100644 --- a/transport-native-io_uring/src/test/java/io/netty/channel/uring/example/EchoIOUringServerHandler.java +++ b/transport-native-io_uring/src/test/java/io/netty/channel/uring/example/EchoServerHandler.java @@ -19,9 +19,8 @@ import io.netty.channel.ChannelHandler.Sharable; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; -//temporary prototype example @Sharable -public class EchoIOUringServerHandler extends ChannelInboundHandlerAdapter { +public class EchoServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { @@ -36,8 +35,19 @@ public class EchoIOUringServerHandler extends ChannelInboundHandlerAdapter { @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { // Close the connection when an exception is raised. - cause.printStackTrace(); ctx.close(); } + @Override + public void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception { + // Ensure we are not writing to fast by stop reading if we can not flush out data fast enough. + if (ctx.channel().isWritable()) { + ctx.channel().config().setAutoRead(true); + } else { + ctx.flush(); + if (!ctx.channel().isWritable()) { + ctx.channel().config().setAutoRead(false); + } + } + } }