Netty 以 100% CPU 运行

2022-09-04 03:32:20

我见过关于这个问题的其他参考资料,例如这里这里,尽管这些参考资料引用了Netty的不同版本。使用4.0分支(4.0.29)和5.0 alpha分支(5.0-Alpha3)中的最新方法尝试了此操作。本地(非 Linux)jdk 1.8.040,很好。Remote (Linux) with java jdk 1.8.025-b17 获得 100% cpu。Linux 内核版本 2.6.32。

尝试使用EpollEventLoopGroup();

已尝试呼叫

workerGroup = new NioEventLoopGroup();
workerGroup.rebuildSelectors();

任何人都可以提供任何建议吗?我看到过对这个错误的引用,其中包含不同版本的Netty。Jdk bug?网蒂虫子?进程在启动时立即进入100%,并保持在那里。

更新:升级到java 1.8.045,相同的差异。

所有可运行线程的JStack输出(那里有一些rabbymq的东西,只是为了完整性而包含的 - 这在其他应用程序中很常见,不是问题的原因)。


答案 1

正如我们在注释中确定的那样,消耗 CPU 的线程在以下堆栈中正忙:

"pool-9-thread-1" #49 prio=5 os_prio=0 tid=0x00007ffd508e8000 nid=0x3a0c runnable [0x00007ffd188b6000]
   java.lang.Thread.State: RUNNABLE
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.poll(ScheduledThreadPoolExecutor.java:809)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1066)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

我设法通过创建一个 来重现类似的行为,将其配置为允许核心线程超时,并在短延迟的情况下安排许多重复任务。它在我的机器上产生了大量的CPU,并且输出是相似的(有时深入到方法中)。此代码再现它:ScheduledThreadPoolExecutorjstackpoll

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
executor.setKeepAliveTime(1, TimeUnit.MINUTES);
executor.allowCoreThreadTimeOut(true);
for (long i = 0; i < 1000; i++) {
    executor.scheduleAtFixedRate(new Runnable() {

        @Override
        public void run() {
        }
    }, 0, 1, TimeUnit.NANOSECONDS);
}

现在我们只需要确定哪些代码设置了一个 破碎的 .我搜索了RabbitMQ和Netty的源代码,没有找到任何遗漏。这可能是你在自己的代码中做的事情吗?ScheduledThreadPoolExecutor

编辑:如评论中提到的,根本原因是初始化,显然可以导致某些平台的CPU旋转。这是在OP的代码中完成的。ScheduledThreadPoolExecutor0


答案 2

推荐