zoukankan      html  css  js  c++  java
  • JAVA + LR实现apache流媒体的性能测试(JAVA部分)

    最近的一个项目,视频点播系统,使用apache实现的流媒体服务器。
    其实准确的说叫做伪流(HTTP Pseudo-Streaming),基本原理和概念自行了解吧。
    让我简单的描述就是仍然是HTTP下载,播放器播放本地缓存。只不过它也实现了一些和正规流媒体服务类似的功能。

    视频点播类系统的性能测试,说简单了主要就是模拟大量用户去看视频。
    服务端监控整体性能,客户端关注各自表现。
    这里难点主要在于如何模拟大量用户观看视频?如何判断各客户端展现?

    多客户端的模拟无外乎3种方法:
    1.全公司总动员,一起看。
    2.一台机器开多个播放页面(或者是一个页面上嵌入多个播放器),调用多台机器。
    3.抛弃客户端的解码播放过程,直接想法下载视频文件。

    第一种方法不用说,虽然最真实,但太原始没有技术含量,如果是小公司人还不一定够。
    第二种方法在需要测试的用户数不大时还可以,否则会占用较多资源,而且技术含量也较低。这种方式,一台机器上能模拟的用户数很有限,因为CPU会很快成为瓶颈。
    第三种方法最高效,在千兆网环境下,一台机器可以模拟很多路用户,此时网络带宽是瓶颈(如果带宽更大,估计硬盘IO就是瓶颈了)。但是没有解码和播放,如何判断客户端的效果呢?两种方式,一是对比下载速度和码率,理论上只要下载速度足够就可以了;二是测试过程中也可以打开几个真实的播放窗口来验证播放效果,因为压力在服务端,可以认为每个客户端都是等价的。

    本文要讲的就是第三种测试方法。
    以前还测过FMS的流媒体,网上可以找到现成的工具来实现本方法,只要调用就可以了。
    但HTTP的这次也搜了两天,好像还真没有,只好自己动手了。
    看来最高效的方法,实现起来却是最麻烦的。

    基本思路是JAVA实现下载功能,用LR的JAVA Vuser实现多用户的控制。
    动手前先给自己整理了一个需求

    功能:
    模拟下载√
    播放列表√
    下载速度记录:总平均速度、每秒速度√
    *伪装成播放器进行连接
    *客户端限速

    测试结果:
    apache限速
    下载速度
    文件完整

    功能扩展
    jar包或者exe文件传参(播放列表)

    打对钩的是已经实现了,带星号的是未实现、也不一定需要实现的高级功能。
    通过测试程序,需要得到的结果是下载是否正确完成?下载速度是否足够?apache的限速模块是否起作用(如果开启)?
    这里可能会有个问题,如果下载程序突破了apache的限速,那有可能是测试程序的问题,这就引出了上面的高级功能“伪装成播放器”。

    下面直接贴代码,说明尽量放到注释里。

    下载类,提供静态方法。

     1 package com.test;
     2 import java.io.*;
     3 import java.net.*;
     4 import java.util.*;
     5 
     6 public class DownloadFile {
     7 
     8     /*
     9      *下载指定URL的文件
    10      *userid是用于保存本地文件的标识
    11      **/
    12     public static int getHttpFileByUrl(String address, String userid) {
    13         int bufferSize = 1024;
    14         int size = 0;
    15         byte[] buf = new byte[bufferSize];
    16         
    17         /*
    18          *下载时间字符串
    19          *用于文件标识
    20          *格式201210260130
    21          **/        
    22         Date date = new Date();
    23 SimpleDateFormat formatDate = new SimpleDateFormat("yyyyMMddHHmmss"); 24 String downloadTime = formatDate.format(date);
    30 31 /* 32 *计算下载速度相关 33 */ 34 int totalDownloadSize = 0; 35 int lastDownloadSize = 0; 36 long lastCheckTime = 0; 37 long startDownloadTime = 0; 38 int sec = 0; 39 40 /* 41 *下载和计算过程 42 */ 43 try { 44 URL url = new URL(address); 45 URLConnection conn = url.openConnection(); 46 BufferedInputStream bis = new BufferedInputStream(conn.getInputStream()); 47 FileOutputStream fos = new FileOutputStream("e:\\test\\testvideo" + "_" + downloadTime + "_" + userid); 48 49 System.out.println("File Size:" + conn.getContentLength()/1024 + "KB"); 50 51 startDownloadTime = System.currentTimeMillis(); 52 lastCheckTime = startDownloadTime; 53 54 while ((size = bis.read(buf)) != -1) 55 { 56 fos.write(buf,0,size); 57 totalDownloadSize += size; 58 59 /* 60 *计算每秒下载速度 61 */ 62 if (System.currentTimeMillis() - lastCheckTime > 1000) { 63 System.out.println(sec + ": " + (totalDownloadSize - lastDownloadSize)/1024 + "KB"); 64 lastCheckTime = System.currentTimeMillis(); 65 lastDownloadSize = totalDownloadSize; 66 sec++; 67 } 68 } 69 70 System.out.println("Vuser " + userid + " Download Completed!"); 71 System.out.println("Average Download Speed: " + (totalDownloadSize/1024)/((System.currentTimeMillis() - startDownloadTime)/1000) + "KB/s"); 72 73 fos.close(); 74 bis.close(); 75 76 }catch (MalformedURLException e) { 77 e.printStackTrace(); 78 }catch (IOException e) { 79 e.printStackTrace(); 80 } 81 82 return totalDownloadSize/1024; 83 } 84 }

    测试驱动。

     1 import com.test.*;
     2 import java.util.*;
     3 import java.io.*;
     4 
     5 public class DownloadDrive {
     6 
     7     public static void main (String[] args) {
     8         
     9         //System.out.println("test");
    10         //DownloadFile.test();
    11         
    12         /*
    13          *调用者测量
    14          *自行实现
    15          */
    16         int DownLoadSize = 0;
    17         double DownLoadTime = 0;
    18         int Speed = 0;
    19                 
    20         String url;
    21         ArrayList urlList = new ArrayList();
    22 
    23         /*
    24          *读取待下载的URL地址
    25          *保存到list中
    26          */
    27         try{
    28             BufferedReader br = new BufferedReader(new FileReader("url.txt"));
    29             while((url = br.readLine()) != null){
    30                 urlList.add(url);
    31             }    
    32         }catch(IOException ie){
    33             ie.printStackTrace();
    34         }
    35         
    36         System.out.println("Total URLs: " + urlList.size());
    37         
    38         /*
    39          *依次下载list中的文件
    40          */
    41         for(int i = 0; i < urlList.size(); i++){
    42             url = (String)urlList.get(i);
    43             System.out.println(url);            
    44             //传入url和每个调用者的标识
    45             DownloadFile.getHttpFileByUrl(url, "1");
    46         }
    47     }    
    48     
    49 }

    将待下载的URL保存到url.txt中,每行一个地址。文件放到DownloadDrive.class同目录中。

    http://www.ospreypacks.com/user_manuals/S12_Kestrel_OM_SCh1.pdf
    http://desktop.youku.com/youkuclient/youkuclient_setup.exe
    http://download.get.live.cn/components/pinyin/EngkooPinyinSetup_1.0.382.02.exe

    运行测试,结果如图

    Total URLs: 3
    http://www.ospreypacks.com/user_manuals/S12_Kestrel_OM_SCh1.pdf
    File Size:1979KB
    0: 85KB
    1: 333KB
    2: 396KB
    3: 370KB
    4: 254KB
    5: 318KB
    6: 151KB
    7: 7KB
    8: 5KB
    9: 11KB
    10: 7KB
    11: 7KB
    12: 7KB
    13: 7KB
    14: 7KB
    Vuser 1 Download Completed!
    Average Download Speed: 116KB/s
    http://desktop.youku.com/youkuclient/youkuclient_setup.exe
    File Size:8970KB
    0: 505KB
    1: 253KB
    2: 405KB
    3: 210KB
    4: 366KB
    5: 325KB
    6: 312KB
    7: 352KB
    8: 355KB
    9: 288KB
    10: 352KB
    11: 185KB
    12: 454KB
    13: 341KB
    14: 292KB
    15: 354KB
    16: 337KB
    17: 379KB
    18: 345KB
    19: 194KB
    20: 404KB
    21: 281KB
    22: 10KB
    23: 511KB
    24: 332KB
    25: 258KB
    26: 328KB
    Vuser 1 Download Completed!
    Average Download Speed: 299KB/s
    http://download.get.live.cn/components/pinyin/EngkooPinyinSetup_1.0.382.02.exe
    File Size:24290KB
    0: 362KB
    1: 273KB
    2: 292KB
    3: 329KB
    4: 307KB
    5: 325KB
    6: 329KB
    7: 295KB
    8: 312KB
    9: 295KB
    10: 329KB
    11: 332KB
    12: 275KB
    13: 271KB
    14: 361KB
    15: 313KB
    16: 275KB
    17: 372KB
    18: 314KB
    19: 369KB
    20: 323KB
    21: 350KB
    22: 354KB
    23: 340KB
    24: 342KB
    25: 349KB
    26: 317KB
    27: 354KB
    28: 303KB
    29: 345KB
    30: 345KB
    31: 354KB
    32: 328KB
    33: 330KB
    34: 305KB
    35: 304KB
    36: 310KB
    37: 352KB
    38: 347KB
    39: 286KB
    40: 194KB
    41: 292KB
    42: 350KB
    43: 286KB
    44: 433KB
    45: 330KB
    46: 295KB
    47: 319KB
    48: 358KB
    49: 301KB
    50: 302KB
    51: 304KB
    52: 295KB
    53: 312KB
    54: 311KB
    55: 280KB
    56: 310KB
    57: 304KB
    58: 273KB
    59: 320KB
    60: 288KB
    61: 294KB
    62: 351KB
    63: 354KB
    64: 296KB
    65: 354KB
    66: 362KB
    67: 361KB
    68: 296KB
    69: 329KB
    70: 246KB
    71: 411KB
    72: 270KB
    73: 327KB
    74: 321KB
    Vuser 1 Download Completed!
    Average Download Speed: 299KB/s
    
    Process completed.

    到这,主要代码已经实现了。下一步需要做的是和LR整合,用LR的Java Vuser对下载功能进行控制,模拟多用户。
    其实也就是重写一个测试驱动,只不过这个驱动是需要LR内部方法了,应该没有什么技术上的难点了。
    明天再补充。

    作者:CaliforniaDream

    出处:http://www.cnblogs.com/twocats/

    邮件:cyj86@163.com

    如果您想进一步交流,请邮件联系我

  • 相关阅读:
    【Uvalive4960】 Sensor network (苗条树,进化版)
    【UVA 1151】 Buy or Build (有某些特别的东东的最小生成树)
    【UVA 1395】 Slim Span (苗条树)
    【UVA 10600】 ACM Contest and Blackout(最小生成树和次小生成树)
    【UVA 10369】 Arctic Network (最小生成树)
    【UVA 10816】 Travel in Desert (最小瓶颈树+最短路)
    【UVA 11183】 Teen Girl Squad (定根MDST)
    【UVA 11865】 Stream My Contest (二分+MDST最小树形图)
    【UVA 11354】 Bond (最小瓶颈生成树、树上倍增)
    【LA 5713 】 Qin Shi Huang's National Road System (MST)
  • 原文地址:https://www.cnblogs.com/twocats/p/2740509.html
Copyright © 2011-2022 走看看