2016-06-17 5 views
1

Я запускаю сервер на netty и выяснил, что некоторые потоки, инициализированные приложением Java-сервера, через некоторое время начинают есть 100% CPU. Я попытался инициализировать группу босса и рабочего с различным количеством потоков, но результат такой же.netty ест 100% CPU

В чем причина этого?

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); 
+0

Какие темы потребляют 100% -ный процессор? Это поток Netty? Также почему 50 нитей для рабочей группы? – Sneh

+0

Я вижу, что количество потоков постоянно увеличивается и никогда не уменьшается. 50 тем для рабочей группы были настроены для более быстрой обработки многочисленных параллельных соединений. Однако уменьшилось до 5 работает очень хорошо. – George

+0

Вы пробовали создавать дампы потоков, чтобы увидеть, какой код выполняет? –

ответ

0

я выяснил, что потоки, потребляющие большую часть времени процессора являются nioEventLoopGroup -3-2,1,4 и образцы показывают CPU io.netty.channel.nio.NioEventLoop.select() к быть на вершине потребления процессора.

Я сделал нить дамп nioEventLoopGroup-3-2 и результаты заключаются в следующем:

"nioEventLoopGroup-3-2" #15 prio=10 os_prio=2 tid=0x00000000135ba800 nid=0x61c runnable [0x00000000142fe000] 
    java.lang.Thread.State: RUNNABLE 
    at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method) 
    at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(Unknown Source) 
    at sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(Unknown Source) 
    at sun.nio.ch.WindowsSelectorImpl.doSelect(Unknown Source) 
    at sun.nio.ch.SelectorImpl.lockAndDoSelect(Unknown Source) 
    - locked <0x00000000e097abc8> (a io.netty.channel.nio.SelectedSelectionKeySet) 
    - locked <0x00000000e097abb8> (a java.util.Collections$UnmodifiableSet) 
    - locked <0x00000000e097ab38> (a sun.nio.ch.WindowsSelectorImpl) 
    at sun.nio.ch.SelectorImpl.select(Unknown Source) 
    at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:622) 
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:310) 
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:110) 
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137) 
    at java.lang.Thread.run(Unknown Source) 

    Locked ownable synchronizers: 
    - None 

Я также вижу постоянно растущее число потоков заняты в sun.nio.ch.WindowsSelectorImpl $ SubSelector , Есть предположения?

0

Googling for sun.nio.ch.WindowsSelectorImpl$SubSelector high cpu показывает несколько хитов с последнего в 2015 году. Вы используете старую версию Netty?

См. Также https://github.com/netty/netty/issues/3857 - вы можете попробовать бегать с помощью: -Dorg.jboss.netty.epollBugWorkaround=true.

+0

Этот jstack показан на Windows 2012 R2, однако под ubuntu 12 он очень похож (если на 100% тот же), как указано здесь https://github.com/netty/netty/issues/327 Вопрос в том, могу ли я настроить systemproperty право в коде, как это? public static void main (String [] args) throws Exception { \t System.setProperty ("org.jboss.netty.epollBugWorkaround", "true"); ... – George

+0

Вы должны иметь возможность установить свойство в коде, но, вероятно, это нужно сделать как можно раньше, прежде чем загрузятся классы Netty. Первая строка в main(), вероятно, самая простая. – AngerClown

+0

Спасибо за ответ. – George

0

Спасибо за ответ. Я также заметил, что число потоков растет, и оно никогда не уменьшается. Один из потоков потребляющих jstack CPU (под убунтом 12) показывает следующее:

"nioEventLoopGroup-11-4" #84 prio=10 os_prio=0 tid=0x00007f9fb0057000 nid=0x4307 runnable [0x00007f9fa4f79000] 
    java.lang.Thread.State: RUNNABLE 
     at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) 
     at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269) 
     at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79) 
     at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) 
     - locked <0x00000000c303e988> (a io.netty.channel.nio.SelectedSelectionKeySet) 
     - locked <0x00000000c303ffa8> (a java.util.Collections$UnmodifiableSet) 
     - locked <0x00000000c303e8f0> (a sun.nio.ch.EPollSelectorImpl) 
     at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97) 
     at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:622) 
     at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:310) 
     at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:110) 
     at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137) 
     at java.lang.Thread.run(Thread.java:745) 

Я предполагаю, что проблема похожа на этот вопрос DefaultEventExecutorGroup threads are keep growing and server is slow responding to requests

Но я не уверен, что именно неправильно в моем код и как реализовать исправление.