为什么我的基于Netty的TCP服务器挂起了100%的CPU使用率?

时间:2012-07-08 11:55:55

标签: java centos nio netty openjdk

我开发了一个基于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 Ram,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的策略。

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

1 个答案:

答案 0 :(得分:0)

这听起来像是Epoll的错误。

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

Netty内置了一种解决方法。不知道从哪个版本,将来必须更新。

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