需求:现在的系统有一部分业务是通过hessian的远程服务提供的,为了应对不断的增长的服务器压力,需要对这个提供hessian服务的工程能承受的压力有一个比较详细的了解。
hessian走的http的协议,但是其数据传输跟一般用户发起的http服务还是不一样的,做压力的测试的开源工具还是比较多的,类似jemeter,LoadRunner等都可以,但是这些都没法对hessian服务进行压力测试。
方案1:创建一个web工程,在web工程提供一些http的服务,每个服务会对应的发起一个hessian请求,然后使用某些压力测试工具对这些http进行并发访问。
方案2:自己写java程序,模拟压力测试,然后逐个测试hessian服务。
方案一就不多说了,创建web工程,压力测试我们用的apache的ab test。
方案二:
我的想法是一次性创建X个线程模拟X个并发,然后每个线程循环Y次,每次发起一个hessian的请求,每次执行一次hessian请求,我会创建一个对象收集信息;然后创建一个监控线程,监控这些线程是否都执行完了,如果执行完了就对收集到的数据进行分析。
信息收集对象:
public class StopWatch {
private long startTime;
private long endTime;
// 一次hessian请求耗时
private long elapsedTime;
//成功失败
private boolean status;
public StopWatch(){
this.startTime = 0L;
this.endTime = 0L;
this.elapsedTime = 0L;
this.status = false;
}
public long getStartTime() {
return startTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
public long getEndTime() {
return endTime;
}
public void setEndTime(long endTime) {
this.endTime = endTime;
}
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
public long getElapsedTime() {
return elapsedTime;
}
public void setElapsedTime(long elapsedTime) {
this.elapsedTime = elapsedTime;
}
}
压力测试主程序:
public class StressTest {
private final static String url1 = "XXXXXXX";
public static void main(String args[]) throws Throwable{
HessianProxyFactory hpf = new HessianProxyFactory();
hpf.setChunkedPost(false);
final UserManagerRemote userManagerRemote = (UserManagerRemote)hpf.create(url1);
// 创建收集信息list
final List<StopWatch> list = new ArrayList<StopWatch>(10000);
//线程数量
int count = 150;
final long start1 = System.currentTimeMillis();
//创建循环栅栏,第一版我是创建了一个监控线程
final CyclicBarrier barrier = new CyclicBarrier(count, new Runnable(){
@Override
public void run() {
long end1 = System.currentTimeMillis();
//分析收集到的信息
analyseStopWatch(list, (end1-start1));
}
}
);
for(int i=0; i<count; i++){
Thread t = new Thread(
new Runnable(){
@Override
public void run() {
for(int j=0; j<100; j++){
//创建收集信息对象
StopWatch sw = new StopWatch();
long startTime = System.currentTimeMillis();
sw.setStartTime(startTime);
try {
userManagerRemote.get(****L);
sw.setStatus(true);
} catch (Throwable e) {
sw.setStatus(false);
}
long endTime = System.currentTimeMillis();
sw.setEndTime(endTime);
sw.setElapsedTime(endTime-startTime);
//将收集信息对象添加到list中
list.add(sw);
}
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
);
if(i < 29){
t.setDaemon(true);
}
t.start();
}
}
private static void analyseStopWatch(List<StopWatch> stopWatchs, long totalSpend){
System.out.println("size = "+stopWatchs.size());
Collections.sort(stopWatchs, new Comparator<StopWatch>(){
@Override
public int compare(StopWatch o1, StopWatch o2) {
Long elapsedTime1 = o1.getElapsedTime();
Long elapsedTime2 = o2.getElapsedTime();
return elapsedTime1.compareTo(elapsedTime2);
}
});
int size = stopWatchs.size();
long min = 0;
for(StopWatch sw : stopWatchs){
if(sw.getElapsedTime() > 0){
min = sw.getElapsedTime();
break;
}
}
System.out.println("spend time min = "+min+"MS | max = "+stopWatchs.get(size-1).getElapsedTime()+"MS");
int failCount = 0;
long spendTime = 0L;
for(StopWatch sw : stopWatchs){
spendTime +=sw.getElapsedTime();
if(!sw.isStatus()){
failCount += 1;
}
}
System.out.println("total spend time = "+totalSpend+"MS");
System.out.println("total request count = "+size);
double d1 = totalSpend;
double d2 = size;
double averageST = d1/d2;
System.out.println("average spend time = "+spendTime/size+"MS");
System.out.println("Transaction Per Second = "+(1000/averageST));
System.out.println("total fail count = "+failCount);
}
}
分享到:
相关推荐
用LR对hessian接口做性能测试,使用JAVA协议,没有界面的性能测试
hessian 服务器 客户端 demo
c#实现的hessian的服务端和客户端,iis亲测可以通过,
使用eclipse maven工程搭建hessian远程服务demo 分服务端的整合和客户端 建议阅读相关博客http://blog.csdn.net/heisemuyangquan/article/details/79460528
hessian 写的 java服务端 c# 写的 客服端。包含.简单数据类型,自定义对象, List Map 流的数据传输测试。
使用hessian进行服务器和客户端通讯,此案例包括服务器和java客户端,参考博客:http://blog.csdn.net/tan313/article/details/49536163
Hessian多个版本下载,包括Hessian3.1.6,Hessian3.2.1,Hessian4.0.7
该案例有hessian java python,该案例有hessian java python,该案例有hessian java python
此代码展示了如何使用 springMVC 搭建 hessian 服务和 Controller 服务,里面还有如何使用的 readme 文件,告诉你如何使用它们。
Hessian实例 网站地址:http://hessian.caucho.com/#Java可以下载Hessian需要的jar包 2010.11.11上传
hessian源码
使用hessian进行两台服务器资源之间同步实例,里面是源代码加使用说明
hessian资料3hessian资料3hessian资料3hessian资料3hessian资料3
NULL 博文链接:https://lib.iteye.com/blog/392438
android端使用hessian跟web服务器通讯,导入即可运行,有问题请在博客留言。http://blog.csdn.net/tan313/article/details/49536891
Hessian服务端 入门程序
NULL 博文链接:https://paopaochao3.iteye.com/blog/550771
基于java实现hessian进行服务器之间数据交互demo项目 实现功能: 1.基于spring 2.5.6+hessian3.1.6带有签名安全机制 2.基于servlet代理机制实现HessianServlet,进行简单IP地址校验功能!
Hessian是一个由Caucho Technology开发的轻量级二进制RPC协议。本人做了一个简单的应用,大家可以往更深的方向研究,共同进步,msn:yang-yang-90@hotmail.com
Hessian一般是通过Web应用来提供服务,因此非常类似于平时我们用的 WebService。只是它不使用SOAP协议,但相比webservice而言更简单、快捷。这个文件可以是hessian在spring项目和web项目的简单配置