【问题标题】:Why is my Netty based TCP server hanging up with 100% CPU usage?为什么我的基于 Netty 的 TCP 服务器以 100% 的 CPU 使用率挂起?
【发布时间】:2012-07-08 03:18:29
【问题描述】:

我开发了一个基于 Netty 的 TCP 服务器来接收与基于 GSM/GPRS 的设备的保持连接,并将这些数据保存在 MySql 数据库中。当前处理 5K 连接。设备以 30-60 秒的间隔发送周期性消息,但连接保持活动状态以保持双工通信。

服务器应用程序在正常运行中消耗 1-2% 的 CPU,峰值高达 10%,平均负载非常低。但是在正常运行 6 小时到 48 小时后,服务器应用程序挂起并持续 100% 的 CPU 消耗,线程转储表明 epoll 选择器是高 CPU 使用率的原因。应用程序仍然保持连接几个小时,然后 CPU 消耗增加到 200%,并且大部分连接被释放。

在项目开始时,我们使用了 MINA,并且在 1K 活动连接时遇到了同样的问题,这就是我们切换到 Netty 的原因。在 5K 连接之前,Netty 更加稳定,挂机时间为 1-2 周。

我们的服务器配置:

  • I7-2600 四核 CPU,
  • 8 GB 内存,Centos 5.0,
  • 打开JDK 6.0,
  • Netty 3.2.4(Netty 几小时前更新到 3.5.2)

为了克服这个问题,我们会将JDK 更新到 7.0(JDK 具有针对异步操作优化的新 I/O 实现)并尝试不同的操作系统,包括 FreeBSD、Windows Server,因为每个操作系统都有不同的策略处理 I/O。

任何帮助将不胜感激,谢谢..

【问题讨论】:

  • 我认为如果没有代码副本,任何人都无法查明错误。
  • 我会先尝试升级 java 版本。使用 nio 时,拥有最新的 java 版本很重要。不确定您使用的是什么版本的 openjdk 6..
  • 谢谢Norman,我用的是OpenJDK "1.6.0_20",我会更新OpenJDK并分享我的经验。

标签: java centos nio netty openjdk


【解决方案1】:

这听起来像 Epoll 错误。

该应用程序正在代理与后端系统的连接。代理有一个通道池,可用于向后端系统发送请求。如果池中的通道不足,则会生成新通道并将其放入池中,以便可以为发送到代理的请求提供服务。这些池在应用程序启动时填充,这就是为什么 CPU 不需要很长时间就能达到峰值的原因(应用程序生命周期的 22 秒)。 Source

Netty 有一个内置的解决方法。不知道是哪个版本的,以后会更新的。

System.setProperty("org.jboss.netty.epollBugWorkaround", "true");

【讨论】:

  • 在我的类似情况下,大约 24 小时后,netty epoll 线程消耗了大约 50% 的 CPU(在否则基本上处于空闲状态的服务器上)。设置epollBugWorkaround 属性似乎没有任何效果。 Java 是 Amazon Correto 11,Netty 是 4.1.19
  • 更新:看起来,与 Netty 4.0.0 发行说明会让您认为的相反,从 Netty 4.0.0 开始,解决方法已完全集成并默认启用 - 但具有非常高的阈值 - 不是答案中链接的错误报告中提到的 10,而是 512。要启用原始解决方法行为,请将系统属性 io.netty.selectorAutoRebuildThreshold 设置为您想要的阈值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 2019-01-31
  • 1970-01-01
相关资源
最近更新 更多