我开发了一个基于 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 的策略。
任何帮助将不胜感激,谢谢..