公司从事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倍)。
分享到:
相关推荐
Java SpringBoot 整合Mina框架,涉及到的核心技术主要包括Java NIO(非阻塞I/O)、Mina框架以及SpringBoot的集成应用。本教程旨在帮助开发者深入理解和掌握这些技术,并提供了一个可直接使用的基础平台框架。 Java ...
综上所述,Java NIO框架不仅解决了电信业务应用软件在高性能和高并发场景下的技术难题,还促进了电信软件架构的不断演进和发展。未来,随着5G和物联网等新兴技术的崛起,Java NIO框架及其衍生技术将继续在电信领域...
5. **Java NIO与Mina**:Mina是一个高性能、轻量级的网络应用框架,它利用了Java NIO的特性来构建网络服务。Mina提供了一套高级API,简化了基于NIO的网络编程,包括TCP和UDP协议的支持,以及过滤器链机制,方便实现...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,专为开发基于TCP/IP和UDP/IP协议的应用程序而设计。MINA的目标是简化网络编程,使得开发者...
Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的BIO(Blocking I/O)模型相比,NIO具有更高的并发性能和更有效的资源管理能力。NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和...
jaca视频教程 jaca游戏服务器端开发 Netty NIO AIO Mina视频教程 课程目录: 一、Netty快速入门教程 01、第一课NIO 02、第二课netty服务端 03、第三课netty客户端 04、第四课netty线程模型源码分析(一) 05、...
Java Mina框架是一款高度可扩展且高性能的网络应用开发框架,专为开发网络服务和协议处理应用程序而设计。它提供了一种简洁、高效的API,使得开发者可以轻松地创建基于TCP/IP和UDP/IP协议的服务器和客户端应用。Mina...
本文介绍了一种基于高性能Java NIO的MINA框架,用以构建高性能的即时通讯系统服务器。MINA框架(Multipurpose Infrastructure for Network Applications)是基于Java NIO设计的网络应用程序框架,其特点是采用松耦合...
Ioserver java Nio socket 框架 是个不错的NIO 通讯框架,本来想学习mina框架,看了看mina的源码太头痛,本人觉得看懂了Ioserver 再看mina的框架,想多的学习 java NIO 的也可以下载 看看,很值得学习啊!!!
Mina的核心特性是其事件驱动、异步(基于Java NIO)的编程模型,使得处理网络通信变得更加高效。 Mina分为1.x和2.x两个主要分支,推荐使用最新的2.0版本。框架中包含了Server和Client的封装,简化了网络通信结构。...
#### 五、Mina与Java NIO框架的关系 Mina实际上是基于Java NIO(Non-blocking I/O)技术构建的一个高级框架。Java NIO为Java应用程序提供了非阻塞I/O操作的能力,使得程序可以在等待I/O操作完成的同时继续执行其他...
java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...
资源名称:Java_NIO框架Netty教程资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道...Java NIO系列教程(十二) Java NIO与IO
MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。MINA由Apache软件基金会开发,并且是其顶级项目之一...
**Android Java Socket框架 Mina2.0** Mina2.0是Apache软件基金会的一个开源项目,它是一个网络通信框架,主要应用于Java环境。Mina旨在简化高性能、高可用性和高可扩展性的网络应用开发,特别适合于处理大量并发...
Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(IO)相比,提供了更加高效的数据传输方式。在Java NIO中,"新"主要体现在非阻塞和多路复用这两个特性上,这使得NIO更适合于...
《深入剖析MINA:构建高性能Java网络框架》 MINA(Multi-purpose Infrastructure for Network Applications)是一个用Java编写的高性能、跨平台的网络应用程序框架。它主要用于简化开发人员创建网络服务和应用的...
标题"基于Java的实例源码-高性能Java网络框架 MINA.zip"表明,这是一个关于Java网络编程的实例源代码包,使用的框架是MINA(Multipurpose Infrastructure for Network Applications)。MINA是一个高性能、异步事件...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统的I/O模型的新技术。自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发...