Netty 运行 100% CPU
Netty running at 100% CPU
我看到过其他关于此问题的引用,例如 here and here,尽管这些引用了不同版本的 Netty。使用 4.0 分支 (4.0.29) 和 5.0 alpha 分支 (5.0-Alpha3) 中的最新版本进行了尝试。本地(非linux)jdk 1.8.040,很好。远程 (Linux) 与 java jdk 1.8.025-b17 获得 100% cpu。
Linux 内核版本 2.6.32。
尝试使用 EpollEventLoopGroup();
尝试调用
workerGroup = new NioEventLoopGroup();
workerGroup.rebuildSelectors();
谁能提供一些建议?我已经看到对 Netty w/different 版本的这个错误的引用。 Jdk 错误?网虫?进程在启动时立即达到 100% 并保持在那里。
更新:升级到java1.8.045,区别相同。
JStack output 所有可运行的线程(里面有一些 rabbitmq 的东西,只是为了完整性而包含 - 这对其他应用程序很常见,并不是问题的原因)。
正如我们在评论中指出的那样,消耗 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)
我已经通过创建 ScheduledThreadPoolExecutor
、将其配置为允许核心线程超时并以短延迟安排大量重复任务来重现类似的行为。它在我的机器上产生了很多 CPU 并且 jstack
输出是相似的(有时更深入 poll
方法)。此代码重现它:
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);
}
现在我们只需确定哪个代码设置了损坏的 ScheduledThreadPoolExecutor
。我搜索了 RabbitMQ 和 Netty 的源代码,但没有发现任何明显的问题。这可能是您在自己的代码中做的事情吗?
编辑:正如评论中提到的,根本原因是 ScheduledThreadPoolExecutor
用 0
初始化,这显然会导致 CPU旋转一些平台。这是在 OP 的代码中完成的。
我看到过其他关于此问题的引用,例如 here and here,尽管这些引用了不同版本的 Netty。使用 4.0 分支 (4.0.29) 和 5.0 alpha 分支 (5.0-Alpha3) 中的最新版本进行了尝试。本地(非linux)jdk 1.8.040,很好。远程 (Linux) 与 java jdk 1.8.025-b17 获得 100% cpu。 Linux 内核版本 2.6.32。
尝试使用 EpollEventLoopGroup();
尝试调用
workerGroup = new NioEventLoopGroup();
workerGroup.rebuildSelectors();
谁能提供一些建议?我已经看到对 Netty w/different 版本的这个错误的引用。 Jdk 错误?网虫?进程在启动时立即达到 100% 并保持在那里。
更新:升级到java1.8.045,区别相同。
JStack output 所有可运行的线程(里面有一些 rabbitmq 的东西,只是为了完整性而包含 - 这对其他应用程序很常见,并不是问题的原因)。
正如我们在评论中指出的那样,消耗 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)
我已经通过创建 ScheduledThreadPoolExecutor
、将其配置为允许核心线程超时并以短延迟安排大量重复任务来重现类似的行为。它在我的机器上产生了很多 CPU 并且 jstack
输出是相似的(有时更深入 poll
方法)。此代码重现它:
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);
}
现在我们只需确定哪个代码设置了损坏的 ScheduledThreadPoolExecutor
。我搜索了 RabbitMQ 和 Netty 的源代码,但没有发现任何明显的问题。这可能是您在自己的代码中做的事情吗?
编辑:正如评论中提到的,根本原因是 ScheduledThreadPoolExecutor
用 0
初始化,这显然会导致 CPU旋转一些平台。这是在 OP 的代码中完成的。