需求:如今的系统有一部分业务是经过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请求,我会建立一个对象收集信息;而后建立一个监控线程,监控这些线程是否都执行完了,若是执行完了就对收集到的数据进行分析。
信息收集对象:java
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; } }
压力测试主程序:web
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); } }