Java netty吃掉了100%的CPU

Java netty吃掉了100%的CPU,java,multithreading,netty,epoll,Java,Multithreading,Netty,Epoll,我在netty上运行服务器,发现java服务器应用程序初始化的一些线程在一段时间后开始消耗100%的CPU。我尝试用不同的线程数初始化boss和worker组,但结果是一样的 原因可能是什么 EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(50); try { ServerBootstrap b = new ServerBoots

我在netty上运行服务器,发现java服务器应用程序初始化的一些线程在一段时间后开始消耗100%的CPU。我尝试用不同的线程数初始化boss和worker组,但结果是一样的

原因可能是什么

EventLoopGroup bossGroup = new NioEventLoopGroup(); 
EventLoopGroup workerGroup = new NioEventLoopGroup(50);
try {
    ServerBootstrap b = new ServerBootstrap();
    b.group(bossGroup, workerGroup)
    .channel(NioServerSocketChannel.class)
    .childHandler(new ChannelInitializer<SocketChannel>() { 
        @Override
        public void initChannel(SocketChannel ch) throws Exception {
            ch.pipeline().addLast("ReadTimeOutHandler", new ReadTimeoutHandler(20));
            ch.pipeline().addLast(new streamDecoder());
            ch.pipeline().addLast(new streamEncoder());

            ch.pipeline().addLast(new validationHandler());
            ch.pipeline().addLast(new streamDecryptor());
            ch.pipeline().addLast(new streamEncryptor());
            ch.pipeline().addLast(new msgValidatedHandler());
         }
     })
     .option(ChannelOption.SO_BACKLOG, 128)
     .childOption(ChannelOption.SO_KEEPALIVE, true);  
EventLoopGroup bossGroup=new NioEventLoopGroup();
EventLoopGroup workerGroup=新的NioEventLoopGroup(50);
试一试{
ServerBootstrap b=新的ServerBootstrap();
b、 组(bossGroup、workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(新的ChannelInitializer(){
@凌驾
public void initChannel(SocketChannel ch)引发异常{
ch.pipeline().addLast(“ReadTimeOutHandler”,新的ReadTimeOutHandler(20));
ch.pipeline().addLast(新的streamDecoder());
ch.pipeline().addLast(新的streamEncoder());
ch.pipeline().addLast(新的validationHandler());
ch.pipeline().addLast(新的streamDecryptor());
ch.pipeline().addLast(新的streamEncryptor());
ch.pipeline().addLast(新的msgValidatedHandler());
}
})
.option(ChannelOption.SO_BACKLOG,128)
.childOption(ChannelOption.SO_KEEPALIVE,true);

用谷歌搜索
sun.nio.ch.windowsselector或mpl$SubSelector高cpu
会从2015年的最后一次搜索中获得一些点击率。您运行的是旧版本的Netty吗


还可以看到-您可能想尝试使用
-Dorg.jboss.netty.epollBugWorkaround=true运行

什么线程占用了100%的CPU?它们是netty的线程吗?还有为什么workergroup需要50个线程?我可以看到线程的数量不断增加,而且从未减少过。为工作组设置了50个线程,以便更快地处理多个线程并发连接。但是减少到5非常有效。您是否尝试过生成线程转储以查看正在执行的代码?我发现占用大部分CPU时间的线程是nioEventLoopGroup-3-2,1,4(请参见屏幕截图),CPU示例显示io.netty.channel.nio.NioEventLoop.select()这是jstack在Windows 2012 R2上所展示的,但是在ubuntu 12下,它与这里所说的非常相似(如果100%相同),问题是我可以像这样在代码中设置systemproperty权限吗?public static void main(String[]args)抛出异常{System.setProperty(“org.jboss.netty.epollBugWorkaround”,“true”);…您应该能够在代码中设置属性,但可能需要在加载任何netty类之前尽早完成。main()中的第一行可能最简单。