netty服務端ServerBootstrap 啟動的時候,默認有兩個eventloop分別是
bossGroup和 workGroup. (其實大部分人這么叫的.並沒有明確這個名字).
一般服務端啟動的時候會使用下面的代碼
1 NioEventLoopGroup bossGroup1 = new NioEventLoopGroup(1);//boss 2 NioEventLoopGroup workerGroup = new NioEventLoopGroup();//worker 3 4 try { 5 ServerBootstrap b = new ServerBootstrap(); 6 ((ServerBootstrap)((ServerBootstrap)((ServerBootstrap)b.group(bossGroup1, workerGroup).channel(NioServerSocketChannel.class)).option(ChannelOption.SO_BACKLOG, Integer.valueOf(100))).handler(new LoggingHandler(LogLevel.INFO))).childHandler(new ChannelInitializer() { 7 public void initChannel(SocketChannel ch) throws Exception { 8 ChannelPipeline p = ch.pipeline(); 9 if(sslCtx != null) { 10 p.addLast(new ChannelHandler[]{sslCtx.newHandler(ch.alloc())}); 11 } 12 13 p.addLast(new ChannelHandler[]{new EchoServerHandler()}); 14 } 15 }); 16 ChannelFuture f = b.bind(PORT).sync(); 17 f.channel().closeFuture().sync();
其中boss用來監控tcp鏈接,worker用來處理io事件. 具體的說,boss執行 server.accept()操作 .worker處理事件的讀寫到業務邏輯處理等后續操作.
NioEventLoopGroup 和NioEventLoop 都可以.但是前者使用的是線程池. 其實bossgroup如果服務端開啟的是一個端口(大部分都是一個),單線程即可.
worker大部分情況需要多線程處理了 .因為 一個eventloop綁定了一個selector,事件都是通過selector輪詢處理的. 一萬個情況讓一個select處理和讓100個selector處理
肯定是多線程效率要高一些(因為有io).
那么下面就討論一下 ,eventloopgroup的默認線程個數.
請看下面代碼
//----開始調用--- NioEventLoopGroup workerGroup = new NioEventLoopGroup(); //默認調用方法 public NioEventLoopGroup() { this(0); } //-----鏈1 public NioEventLoopGroup(int nEventLoops, Executor executor) { this(nEventLoops, executor, SelectorProvider.provider()); } //------連2 public NioEventLoopGroup(int nEventLoops, Executor executor, SelectorProvider selectorProvider) { super(nEventLoops, executor, new Object[]{selectorProvider}); } //連3------ /** * @see {@link MultithreadEventExecutorGroup#MultithreadEventExecutorGroup(int, Executor, Object...)} */ protected MultithreadEventLoopGroup(int nEventLoops, Executor executor, Object... args) { super(nEventLoops == 0 ? DEFAULT_EVENT_LOOP_THREADS : nEventLoops, executor, args); } //---------連4 private static final int DEFAULT_EVENT_LOOP_THREADS; static { DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt( "io.netty.eventLoopThreads", Runtime.getRuntime().availableProcessors() * 2)); if (logger.isDebugEnabled()) { logger.debug("-Dio.netty.eventLoopThreads: {}", DEFAULT_EVENT_LOOP_THREADS); } }
跟蹤一下就可以發現
其實默認線程數是 cpu核心數的2倍. 但是也可以通過
-Dio.netty.eventLoopThreads 參數在服務端啟動的時候指定 .