【发布时间】: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