2

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

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

4

1 回答 1

0

这听起来像 Epoll 错误。

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

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

System.setProperty("org.jboss.netty.epollBugWorkaround", "true");
于 2015-05-15T14:50:09.403 回答