为什么我的基于Netty的TCP服务器在CPU使用率为100%的情况下挂断了



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

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

在项目开始时,我们使用了MINA,在1K活动连接方面也遇到了同样的问题,这就是我们改用Netty的原因。在5K连接之前,Netty要稳定得多,挂断时间为1-2周。

我们的服务器配置:

  • I7-2600四核CPU
  • 8GB内存,Centos 5.0
  • 打开JDK6.0
  • Netty 3.2.4(几小时前Netty更新为3.5.2)

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

任何帮助都将不胜感激,谢谢。。

这听起来像Epoll错误。

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

Netty内置了一个解决方法。但不确定是哪个版本,以后必须更新。

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

最新更新