51Testing软件测试论坛

标题: hessian服务压力测试 [打印本页]

作者: 八戒你干嘛    时间: 2019-2-19 14:54
标题: hessian服务压力测试
需求:现在的系统有一部分业务是通过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请求,我会创建一个对象收集信息;然后创建一个监控线程,监控这些线程是否都执行完了,如果执行完了就对收集到的数据进行分析。

信息收集对象:

  1. public class StopWatch {
  2.        
  3.         private long startTime;
  4.         private long endTime;
  5. // 一次hessian请求耗时
  6.         private long elapsedTime;
  7. //成功失败
  8.         private boolean status;
  9.        
  10.         public StopWatch(){
  11.                 this.startTime = 0L;
  12.                 this.endTime = 0L;
  13.                 this.elapsedTime = 0L;
  14.                 this.status = false;
  15.         }
  16.        
  17.         public long getStartTime() {
  18.                 return startTime;
  19.         }
  20.         public void setStartTime(long startTime) {
  21.                 this.startTime = startTime;
  22.         }
  23.         public long getEndTime() {
  24.                 return endTime;
  25.         }
  26.         public void setEndTime(long endTime) {
  27.                 this.endTime = endTime;
  28.         }
  29.         public boolean isStatus() {
  30.                 return status;
  31.         }
  32.         public void setStatus(boolean status) {
  33.                 this.status = status;
  34.         }
  35.         public long getElapsedTime() {
  36.                 return elapsedTime;
  37.         }
  38.         public void setElapsedTime(long elapsedTime) {
  39.                 this.elapsedTime = elapsedTime;
  40.         }

  41. }
复制代码


压力测试主程序:
  1. public class StressTest {
  2.        
  3.         private final static String url1 = "XXXXXXX";
  4.        
  5.         public static void main(String args[]) throws Throwable{
  6.                
  7.                 HessianProxyFactory hpf = new HessianProxyFactory();
  8.                 hpf.setChunkedPost(false);
  9.                 final UserManagerRemote userManagerRemote = (UserManagerRemote)hpf.create(url1);

  10. // 创建收集信息list
  11.                 final List<StopWatch> list = new ArrayList<StopWatch>(10000);
  12. //线程数量
  13.                 int count = 150;       
  14.                 final long start1 = System.currentTimeMillis();
  15. //创建循环栅栏,第一版我是创建了一个监控线程
  16.                 final CyclicBarrier barrier = new CyclicBarrier(count, new Runnable(){
  17.                                 @Override
  18.                                 public void run() {
  19.                                         long end1 = System.currentTimeMillis();
  20. //分析收集到的信息
  21.                                         analyseStopWatch(list, (end1-start1));
  22.                                 }
  23.                         }
  24.                 );
  25.                 for(int i=0; i<count; i++){
  26.                         Thread t = new Thread(
  27.                                 new Runnable(){
  28.                                         @Override
  29.                                         public void run() {
  30.                                                 for(int j=0; j<100; j++){
  31. //创建收集信息对象
  32.                                                         StopWatch sw = new StopWatch();
  33.                                                         long startTime = System.currentTimeMillis();
  34.                                                         sw.setStartTime(startTime);
  35.                                                         try {
  36.                                                                 userManagerRemote.get(****L);
  37.                                                                 sw.setStatus(true);
  38.                                                         } catch (Throwable e) {
  39.                                                                 sw.setStatus(false);
  40.                                                         }
  41.                                                         long endTime = System.currentTimeMillis();
  42.                                                         sw.setEndTime(endTime);
  43.                                                         sw.setElapsedTime(endTime-startTime);
  44. //将收集信息对象添加到list中
  45.                                                         list.add(sw);
  46.                                                 }
  47.                                                 try {
  48.                                                         barrier.await();
  49.                                                 } catch (InterruptedException e) {
  50.                                                         e.printStackTrace();
  51.                                                 } catch (BrokenBarrierException e) {
  52.                                                         e.printStackTrace();
  53.                                                 }
  54.                                         }
  55.                                        
  56.                                 }
  57.                         );
  58.                         if(i < 29){
  59.                                 t.setDaemon(true);
  60.                         }
  61.                         t.start();
  62.                 }
  63.                
  64.         }
  65.        
  66.         private static void analyseStopWatch(List<StopWatch> stopWatchs, long totalSpend){
  67.                
  68.                 System.out.println("size = "+stopWatchs.size());
  69.                 Collections.sort(stopWatchs, new Comparator<StopWatch>(){
  70.                         @Override
  71.                         public int compare(StopWatch o1, StopWatch o2) {
  72.                                 Long elapsedTime1 = o1.getElapsedTime();
  73.                                 Long elapsedTime2 = o2.getElapsedTime();
  74.                                 return elapsedTime1.compareTo(elapsedTime2);
  75.                         }
  76.                 });
  77.                 int size = stopWatchs.size();
  78.                 long min = 0;
  79.                 for(StopWatch sw : stopWatchs){
  80.                         if(sw.getElapsedTime() > 0){
  81.                                 min = sw.getElapsedTime();
  82.                                 break;
  83.                         }
  84.                 }
  85.                 System.out.println("spend time min = "+min+"MS   |   max = "+stopWatchs.get(size-1).getElapsedTime()+"MS");
  86.                 int failCount = 0;
  87.                 long spendTime = 0L;
  88.                 for(StopWatch sw : stopWatchs){
  89.                         spendTime +=sw.getElapsedTime();
  90.                         if(!sw.isStatus()){
  91.                                 failCount += 1;
  92.                         }
  93.                 }
  94.                 System.out.println("total spend time = "+totalSpend+"MS");
  95.                 System.out.println("total request count = "+size);
  96.                 double d1 = totalSpend;
  97.                 double d2 = size;
  98.                 double averageST = d1/d2;
  99.                 System.out.println("average spend time = "+spendTime/size+"MS");
  100.                 System.out.println("Transaction Per Second = "+(1000/averageST));
  101.                 System.out.println("total fail count = "+failCount);
  102.         }

  103. }
复制代码



作者: qqq911    时间: 2019-4-16 11:13
感谢分享
作者: Miss_love    时间: 2020-12-25 16:38
感谢分享




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2