java NIO框架Mina与C++ ACE框架之性能比较

公司从事webgame和手机网游研发,webgame服务器采用C++开发,PC用户网关采用ACE实现,手机用户网关准备采用java 实现(本人对java的熟悉胜过C++),但最近的一次性能测试报告让我有点慌乱,测试结果为Mina和ACE开发的agent性能比较:

注:以下测试客户端以每秒2个包的速度发送,每包大小为132byte。过程为,模拟客户端连接网关(agent),网关连接echo(相当于逻辑处理服务),agent收到数据包后将其转发至echo,而echo将原包发送5次响应给agent,agent再将其转发给客户端,也就是说,客户端的发送和相应比=1:5(该值主要是按照对RPG游戏网络数据包的一个经验值进行的设定)

java Mina:


硬件配置:
机器1 CPU Pentium(R) Dual-Core  CPU      E2210  @ 2.20GHz
内存 2GB
机器2 CPU "Pentium(R) Dual-Core CPU E2210 @ 2.20GHz
(双核)"
内存 2GB

软件环境:
操作系统 Ubuntu 10.04 32位
Java版本 1.6.0_20-b02

测试方案说明: echo,client运行在机器1上
agent运行在机器2上
client通过百兆网卡连接到agent上,agent通过百兆网卡连接到echo上。"

测试数据:
连接数 接收(KB/sec) 发送(KB/sec) CPU
100 26.40         132.00          5
200 52.80         264.00          11
400 105.60         528.00          20
800 211.16         1055.70 31
1000 263.84         1319.20 38
2000 528.10         2640.70 77
2500 659.89         3302.18 92
3000 747.86         1782.27 98以上

说明: "CPU数据通过top获得,因为测试机是双核,该数值由top的数值的基础上除以2获得


结论: 2000人时,cpu到达77,但cpu摆动幅度仍然稳定在5%以内,且网络流量以及cpu仍然与人数成正比,2500时,虽仍与人数成正比,但cpu已到达瓶颈;3000人时,网络流量和cpu均不正常,且自动掉连接。故2000人为稳定值。


C++ ACE:

硬件配置:
机器1 CPU "Intel(R) Pentium(R) Dual CPU E2220 @ 2.40GHz
(双核)"
内存 2GB
机器2 CPU "Pentium(R) Dual-Core CPU E2210 @ 2.20GHz
(双核)"
内存 2GB

软件环境:
操作系统 Windows 2003 Server 32位

测试方案说明: "echo,client运行在机器1上
agent运行在机器2上
client通过百兆网卡连接到agent上,agent通过千兆网卡连接到echo上。"

测试数据:
连接数 接收(KB/sec) 发送(KB/sec) CPU
100 62.43         152.66         0
200 123.17         305.43         0
400 258.83         625.44         3
800 489.10         1217.37 4
1000 612.43         1520.48 5
2000 1204.34 3023.19 10
3000 1425.95 2927.76 40

说明: "CPU数据通过Windows性能计数器获得。
网络数据通过Windows性能计数器获得机器2上百兆网卡速度。"


结论: 在3000人时,发送的数量量与2000人时持平,故单线程网关处理能力已到瓶颈。


以上测试结果,虽说只是基于普通PC的测试结果,但是对于java和C++的agent都是部署到了相同配置的机器上,所以还是能明显表达两者的性能差。java版的虽说在2000人时已到达了一个较高的cpu值,但始终保持人数与cpu的正比增长;C++的结果令我很吃惊(C++版由公司另外部门所开发,测试结果也是由该部门给出),在1000人时竟然只有5%的cpu,要知道客户端可是以每秒2包,且1000并发的速率在执行,且这只是一台PC机。我后来对C++版做过简单测试,发现报告中数值基本属实,但cpu不稳定,例如在1000并发时,虽说cpu稳定在10%以下,但偶尔(大约每间隔10-30秒)会跳到30%,而后迅速降至10%以下。

补充:以上测试只针对网络性能测试,无逻辑处理,只是数据包的转发或增大倍数转发。虽说两个版本在PC机的测试都是2000人并发稳定的结果,大家可能觉得两者只是在cpu上的差别,但最终能承载人数相当,我开始也是这么认为,后将问题发送给C++部门,他们给出的答复是,他们的C++网络处理为单线程,故对双核CPU的利用最多到50%,未来更改为多线程后会有大幅度提升~ 而熟悉Mina的人都知道,Mina的processor线程默认会采用cpu核心数+1的线程数量进行网络收发,也就是说java版的已经是多线程处理了。我对java的测试结果并不是觉得有多差,但看到C++的结果,我才伤心的问自己:难道有这么大的差距吗?~~以前的用java开发的webgame同时在线做到2000多人,当时觉得已经是不错的结果,但毕竟游戏承载能力还是很关键的因素,故希望有所突破。

对于以上结果,不知道有没有高手做过类似的测试,或多java NIO和C++ IO有较深入理解,希望给出一个评定,因为基于java Mina的Agent网关,我实在看不到优化余地了(本人只专注java,C++高手不要告诉我改用C++)。我无法相信java的NIO和C++在网络编程领域会有如此大的性能差距(按cpu计算大约在7-8倍)。


你可能感兴趣的:(C++,c,框架,C#,Mina)