`
zwbill
  • 浏览: 33618 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java远程调用性能测试

    博客分类:
  • Java
阅读更多

Java远程调用性能测试

http://zwbill.iteye.com/

- by zvane

现在,Java远程调用方法很多,各种方法的优缺点网络上也有很多的参考文章,这次我对几个典型的Java远程调用方法做了一个简单的性能分析比较,可供大家参考。

 

测试环境:CPU:奔腾双核 T4500,内存:DDR3-1067 2GWeb容器:Tomcat6.0.33,操作系统:WinXP-sp3

 

测试项目:

1.RMI:Spring3集成发布

2.hessian:用Spring3集成发布到Tomcat容器。

3.Java6 WebService:使用Java6原生WebService和注解,直接用Endpoint.publish发布服务。

4.CXF:用Spring3集成发布到Tomcat容器

 

测试结果:

 

测试案例 单线程访问 并发访问
请求数 耗时(s) 吞吐量
(每秒处理请求数)
总请求数
(每个线程1000)
并发线程数 耗时(s) 吞吐量
(每秒处理请求数)
RMI 10000 5.91 1693 100000 100 31.77 3148
Hessian 10000 11.13 899 100000 100 / /
Java6 WebService 10000 18.52 540 100000 100 134.52 743
CXF 10000 27.58 363 100000 100 194.74 514
 

说明:以上测试虽不是非常的精确,但基本能说明一定的问题。每项案例的服务端方法,都是简单方法,接收客户端传递的一个String类型参数,并打印到console。每轮测试取三次时间的平均值。所有单线程访问测试全部完成并正常处理请求,没有请求拒绝情况发生。而并发访问测试,除hessian中途抛异常无法完成,其余均正常完成测试。

 

结论:

1.RMI的性能最高,这已是公认,RMI底层基于Java远程方法协议(JRMP)和对象序列化技术,而JRMP是直接基于TCP/IP协议的封装,在网络上传输2 byte的有效数据,对于TCP而言,总共有478 byte被额外传输,而对于RMI, 1645byte被额外传输。可见RMI的效率还是相当不错的。JavaEE标准的EJB就是基于RMI的调用。

2. hessian是一个轻量级的remoting on http框架。Hessian没有采用WebService标准的SOAP协议,而是自己实现了一种二进制RPCRemote Procedure Call Protocol,远程过程调用协议)协议。Hessian的设计理念就是简单高效,使用 Hessian 传输数据量比Soap协议要小很多。这也是为什么Hessian的性能要高于WebService。但是,尽管它再简单高效,它始终是基于Http协议上封装的,所以还是比JavaRMI效率要差一些。我看过其他的一些研究测试报告称Hessian在传输少量对象时,比RMI还要快速高效,但传输数据结构复杂的对象或大量数据对象时,较RMI要慢20%左右。这个结论在我的测试中还真没有发现,也许与测试环境或方法有关系吧。

 

3.Java6WebService CXF的性能应该说是基本同级别,前者略高于后者。众所周知WebService是基于Soap协议实现的,而Soap协议是在Http协议基础上的XML定义和封装。所有的请求和响应都要被转化成符合SOAP标准的XML格式。显然这直接会导致效率的降低。

XML格式的协议是一种易读易理解的协议,但并不高效。解析和组装XML协议数据流都需要耗费系统的处理时间,所以,WebService的性能不如Hessian这里要说一下的是Java6原生的WebService,开发起来非常方便,而且无需额外引入一大堆的Jar包。性能又强于CXF至于Axis2Axis1就更不用说,已经有很多测试表明CXF的性能是Axis22倍以上,是Axis12-6倍。

 

4.那么既然RMI性能那么好,为什么我们需要那么多其他的远程调用方式呢?这个问题又引发到了一个原始的真理。越原始越底层的技术效率就越高,但局限性也就越大。RMIJava的特性,那么它必须基于JVM运行,也就是说RMI无法跨语言运行。而WebService就不同了,Soap是基于标准Http协议的,是一种与语言无关的字符级协议,所以它可以更好的实现异构系统的通信。这在我们现实环境中是非常有用的,相信大家还是WebService用的比较多点吧。

 

不足:这次的测试,还是存在很多不足之处。

1.Hessian的并发测试时,跑到中途大约300-400次调用时就抛异常中断了,具体原因还没来得及仔细分析。不知道是否与Spring集成或测试方法有关系。

2.另外,这次的远程方法都是简单处理方法,而在复杂方法调用环境下测试情况如何还需更进一步研究。

3.下一步,如果有时间,可以发布到Linux环境测试一下各项性能。

7
0
分享到:
评论
8 楼 rkikbs 2013-04-16  
一般都用apache-jmeter或者soapui
7 楼 Sean220 2012-05-07  
1.Hessian的并发测试时,跑到中途大约300-400次调用时就抛异常中断了,具体原因还没来得及仔细分析。不知道是否与Spring集成或测试方法有关系。

Hessian是http短连接,这种异常应该是大量并发线程下达到了系统可开的最大连接数,调低服务端的SO_LINGER数字,否则大量短连接在TIME_WAIT状态等待关闭。
6 楼 zwbill 2011-12-14  
这个我是直接写的测试用例代码进行测试的,这里引用另一篇文章中的结论补充一下,该文中说道:为了仅测试数据传输和编码、解码的时间,客户端和服务端都使用了缓存,对象只需实例化一次。但是,测试结果显示,web service的效率还是要比其他通讯协议慢10倍。
如果考虑到多个引用指向同一对象的传输情况,web service要落后更多。因为RMI,Hessian等协议都可以传递引用,而web service有多少个引用,就要复制多少份对象实体。
Web service传输的冗余信息过多是其速度慢的原因之一,监控发现,同样的访问请求,描述相同的数据,web service返回的数据量是hessian协议的6.5倍。另外,WEB SERVICE的处理也很毫时,目前的xml解析器效率普遍不高,处理xml <-> bean很毫资源。从测试结果看,异地调用比本地调用要快,也从侧面说明了其毫时主要用在编码和解码xml文件上。这比冗余信息更为严重,冗余信息占用的 只是网络带宽,而每次调用的资源耗费直接影响到服务器的负载能力。(MS的工程师曾说过,用WEB SERVICE不能负载100个以上的并发用户。)
5 楼 gjlping 2011-12-12  
如果lz能共享测试用例那就更好了。
4 楼 完善自我 2011-12-12  
不错
3 楼 minxinxin2010 2011-12-12  
[u][/u]
引用
[img][/img][url][/url]uo0;/pi9;/p[b][/b][i][/i]
2 楼 hngmduyi 2011-12-12  
楼主是用什么测试工具啊??
1 楼 hngmduyi 2011-12-12  

相关推荐

    java 远程调用工具

    Java远程调用工具是开发过程中不可或缺的利器,尤其在处理分布式系统和服务之间的交互时。本文将深入探讨如何利用Java技术进行远程调用,特别是针对WebService和RESTful接口的调用,以及一个常用的工具——SoapUI。 ...

    java+hessian 远程调用

    Java Hessian远程调用是一种高效的、轻量级的RPC(Remote Procedure Call)解决方案,它允许Java应用程序通过网络进行跨语言的通信。Hessian是BEA Systems开发的一种二进制Web服务协议,它提供了序列化和远程方法...

    java远程调用kettle说明与代码

    ### Java远程调用Kettle说明与代码 #### 概述 Kettle是一款强大的开源ETL工具,用于数据清洗和加载。随着数据量的增长以及对数据处理能力的需求提升,分布式执行ETL任务变得越来越重要。Kettle为此提供了名为Carte...

    Java调用本地的远程桌面连接

    总之,Java调用本地的远程桌面连接是一种结合操作系统功能和Java编程的技术,它在自动化运维、远程支持等领域有着广泛的应用。然而,使用时需要注意安全性和稳定性,确保数据的保密性,并考虑在不同环境下的兼容性。

    JAVA实现简单分布式,JAVA调用远程方法

    总之,通过Java实现分布式系统和远程方法调用是一项强大的技术,可以极大地提升应用程序的性能和可扩展性。通过深入理解RMI的工作机制和最佳实践,开发者可以构建出健壮且高效的分布式应用。而提供的资源文件可以...

    spring远程调用简单实例

    本实例将深入探讨Spring的远程调用功能,通过一个简单的例子来帮助理解其工作原理和实施步骤。 首先,我们要明确Spring远程调用(Remoting)的基本概念。远程调用是指应用程序的不同组件或服务之间,通过网络进行...

    exchange/powershell,Java调用powershell开通邮箱

    标题 "exchange/powershell,Java调用powershell开通邮箱" 暗示了这是一个关于使用Java编程语言调用PowerShell脚本在Exchange服务器上创建邮箱的教程或项目。Exchange是微软提供的一款企业级电子邮件服务器软件,而...

    Java调用小票打印机打印小票

    在IT行业中,尤其是在开发零售或餐饮系统的背景下,Java调用小票打印机打印购物清单是一项常见的任务。这个过程涉及到几个关键的技术点,包括打印机驱动的处理、串口通信、文本格式化以及与硬件设备的交互。以下是对...

    Java远程桌面控制

    Java远程桌面控制是一种技术,允许用户通过网络连接到另一台计算机并进行实时的屏幕查看、键盘输入和鼠标操作。在Java中实现这种功能通常涉及到网络编程、多线程以及图形用户界面(GUI)的设计。本篇文章将深入探讨...

    AXIS2远程调用WebService示例(Eclipse+AXIS2)工具和所用包.rar

    AXIS2远程调用WebService是Java开发者在进行分布式服务交互时常用的一种技术。本文将详细介绍如何使用Eclipse集成开发环境和AXIS2框架创建并调用WebService。首先,我们需要准备以下基础工具: 1. Eclipse IDE:这...

    httpClient调用远程接口获取数据到本地文件夹

    提供一个测试类,可以直接运行以验证功能。测试类应包含初始化HttpClient、发送请求、处理响应并保存数据的逻辑。确保在测试前配置好所有必要的环境变量和依赖。 综上所述,这个例子展示了如何使用HttpClient从...

    java spring+rmi 的远程调用例子

    在这个“Spring+RMI”的示例中,开发者可能已经完成了上述步骤,并且经过测试确保了远程调用的正确性。通过学习和理解这些内容,你可以创建自己的Spring-RMI应用,实现不同节点间的分布式服务交互。

    dwr测试,java调用js

    首先,你需要在服务器上创建一个DWR配置文件(通常为`dwr.xml`),声明哪些Java方法可以被远程调用。然后,创建一个Java类并暴露需要访问的方法。最后,在JavaScript中,你可以使用DWR提供的API(如`DWREngine`或`...

    xfire实现的实例和远程调用的客户端代码

    在本实例中,我们将探讨如何利用XFire实现实时的远程调用,并查看提供的客户端代码(ClientFromInterface.java)和服务器端代码(WS_Server)。 首先,让我们深入了解XFire的基础知识。XFire是一个基于Java的Web...

    Web Services应用实例 -- Java Web App远程调用SAS程序的解决方案

    在本实例中,我们将探讨如何使用Java Web应用程序远程调用SAS程序,这涉及到Web服务技术与统计分析软件SAS的集成。以下是相关知识点的详细说明: 1. **Web服务**: Web服务是通过HTTP协议传输数据的服务,它使用...

    java远程调shell

    至于压缩包中的"java连接shell"文件,可能包含了示例代码、配置文件或者测试脚本,这些资源可以帮助开发者更好地理解和实践Java远程调用Shell的过程。通过学习和研究这些文件,可以加深对这个主题的理解,并能够将...

    Dubbo调用java接口程序

    它提供了一种服务治理、远程调用、集群容错、监控等全面功能,使得开发者可以方便地构建可扩展的服务架构。本篇文章将深入讲解如何使用Dubbo进行Java接口的调用。 首先,理解Dubbo的核心概念: 1. **服务(Service...

    java调用shell

    Java调用Shell脚本是IT专业人士必须掌握的一项技能,它不仅增强了程序的灵活性和功能,还提供了与操作系统底层交互的能力。熟练掌握这一技术,将极大地提升你在项目开发和系统管理中的效率和效果。通过本文的讲解,...

    java远程控制屏幕

    Java作为一种跨平台的编程语言,提供了丰富的API和库,使得开发者能够实现远程控制功能,包括屏幕共享和双向通信。以下将详细阐述如何使用Java实现远程控制屏幕以及实现互相通信的关键知识点。 1. **RMI(Remote ...

    java后台调用HttpURLConnection类模拟浏览器请求实例(可用于接口调用)

    在Java编程中,有时我们需要模拟浏览器发送HTTP请求,例如调用外部接口或API。`HttpURLConnection`是Java标准库提供的一种轻量级的HTTP客户端,它允许我们在后台代码中发送GET和POST请求。本篇文章将深入讲解如何...

Global site tag (gtag.js) - Google Analytics