自己实现的附带文件的压力测试方法

前段时间做了一个服务器端接口,是附带文件上传的;后来我们要对这个接口进行压力测试

  其实很多现成的方式可以做压力测试,但是附带文件的的压力测试缺不怎么符合我的需求,jmeter是可以做附带文件上传的压力测试的,只是它是图形界面,而我目前的需求是要在测试机器上面去跑测试,而测试服务器是不能带图形界面的,所以jmeter的方案否决掉;

  apache ab test,也是一个压力测试的好工具,只是研究了好久老搞不掂怎么做附带文件上传的压力测试(备注:在本文的最后我附带一下我研究的结果,说多了都是泪)

  好了,现在我说下我自己的这个测试工具:

  它依赖于赖于httpclient相关的包,包括:commons-codec-1.6.jar、commons-logging-1.1.3.jar、fluent-hc-4.3.4.jar、httpclient-4.3.4.jar、httpclient-cache-4.3.4.jar、httpcore-4.3.2.jar、httpmime-4.3.4.jar、httpmime-4.3.4.jar;

  大家可以到apache的官方网站:http://hc.apache.org/downloads.cgi  去下载相关的包;

import java.io.File;

import java.io.IOException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.atomic.AtomicInteger;

import org.apache.http.HttpEntity;

import org.apache.http.client.methods.CloseableHttpResponse;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.entity.ContentType;

import org.apache.http.entity.mime.MultipartEntityBuilder;

import org.apache.http.entity.mime.content.FileBody;

import org.apache.http.entity.mime.content.StringBody;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.util.EntityUtils;

public class ClientMultipartFormPostTest {

private static ExecutorService pool = Executors.newFixedThreadPool(300);

public static void main(String[] args) throws Exception {

final String path = args[0];//文件地址

final String url = args[1]; //调用的URL

final int i_len = Integer.parseInt(args[2]);//线程总数

final int j_len = Integer.parseInt(args[3]);//每个线程的请求数(暂时没用到)

final AtomicInteger c = new AtomicInteger(0);

final long s = System.currentTimeMillis();

for (int i = 0; i < i_len; i++) {

new Thread(new Runnable() {

@Override

public void run() {

while (true) {

try {

upLoadLogMultiThread(url,path);

int cc = c.addAndGet(1);

if (cc % 1000 == 0) {

System.out.println(String.format("c: %d, t: %d", cc, (System.currentTimeMillis() - s)));

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}).start();

}

}

public static void upLoadLogMultiThread(String url,String path) throws IOException{

CloseableHttpClient httpclient = HttpClients.createDefault();

try {

HttpPost httppost = new HttpPost(url);

FileBody bin = new FileBody(new File(path));

StringBody comment = new StringBody("A binary file of some kind", ContentType.TEXT_PLAIN);

HttpEntity reqEntity = MultipartEntityBuilder.create()

.addPart("bin", bin)

.addPart("comment", comment)

.build();

httppost.setEntity(reqEntity);

CloseableHttpResponse response = httpclient.execute(httppost);

try {

HttpEntity resEntity = response.getEntity();

EntityUtils.consume(resEntity);

} finally {

response.close();

}

} finally {

httpclient.close();

}

}

}

 测试结果,如图所示:

  我们程序的逻辑是每请求1000次,打印一次;

  上面的结果翻译的结果就是:

  1----请求1000次,耗费时间为3727毫秒;

  1----请求2000次,耗费时间为6253毫秒;

  1----请求3000次,耗费时间为8713毫秒;

  1----请求4000次,耗费时间为11028毫秒;

  1----请求5000次,耗费时间为13340毫秒;

  …

  依据上面的结果,我们可以做个预估:每秒可以承受的4000次请求;也就是说我们可以大大预估一天有3千万次请求数,这个程序都是可以应付对的;

  但是上面的结论并没说明文件,考虑到并发用户的情况,好!那我们分1个并发,10个并发,100个并发,1000个并发,(我的并发是以线程来区分级别,估计大多数测试工具也是以这样的一种方式去区分,备注:线程并非同一时刻,据本人了解,线程的区分度大概纳秒级别的,还是在同一个进程里面去处理;而进程是可以利用上多核CPU的,举例:4个核的CPU,开4个进程是可以时刻并行的运行,也就是说这4个进程是同一时刻在跑。)

  10线程并发:

  也就是说10个并非,每秒执行9千+;

  100个线程并非:

  也就是说100并非,每秒执行1.5万次;

  1000个并非:

  已经挂掉了,也就是说这个小的后端程序能够承受的并非级别是100~1000之间(一台主机的情况,如果是集群的话,100万台服务器的话,相当于并发在1亿~10亿之间,如果按照业界传闻facebook的几十万台,Google级百万台,在还没考虑主机CPU、内存的这个测试结果是非常可观,目前主机是双核2G内存的主机);

  测试方法就是:java -jar errlogClient.jar path url n c

  各个参数的标识:path = 目标文件路径 ; url = 请求的地址 ; n = 线程总数 ; c = 每个线程调用请求的次数(备注目前上面的程序我是做循环跑的,所以暂时没用上,大家觉得如果需要用上的话可以改改上面的程序)

  这个工具如果大家觉得还凑合用的话就尽管拿去用吧~

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2025-01-20 17:04:48

自己实现的附带文件的压力测试方法的相关文章

c#调用outlook[align=left]发送邮件到邮件服务[/align]器上,并且要附带文件。怎么做啊?

问题描述 c#调用outlook 发送邮件到邮件服务器上,并且要附带文件.怎么做啊?求大神指导.求源码. 解决方案

MySQL压力测试方法 如何使用mysqlslap测试MySQL的压力?_Mysql

其实mysql测试也没有这么复杂,除了一些常用的select\insert\update\deletc这些外,其实测试他的并发量才是最重要的.比如在连接数1K的时候,并发量能否满足当前请求\服务器性能.内存CPU使用情况.说白了,测试mysql就是测试他的配置文件和并发量及服务器性能. 一.工具 首选工具mysql自带的:mysqlslap –auto-generate-sql, -a 自动生成测试表和数据 –auto-generate-sql-load-type=type 测试语句的类型.取值

用RAW文件合成HDR 好照片MAC版轻松实现

传统的摄影师都认为,摄影是一门减法艺术:削减世界的纷繁,过滤出自己想要的.直到HDR的出世,让众多摄影师惊呼:原来摄影还可以用加法的--对光影和色彩没有任何逃避,反之将它们全部收集起来,将还原的世界本貌毫无保留地展现在观者眼前. 这也是HDR能够颠覆整个领域,独创出一个新摄影时代的原因.请注意到一个关键词:图片信息.图片携带的信息越丰富,HDR的合成效果就越好.因此,相对于携带图片信息较少JPG格式来说,俗称"数字底片"的RAW文件合成的HDR效果会更佳. 这种最佳效果需要电脑处理系统

压力测试中存在的问题

压力测试中存在的问题 (What) 什么是压力测试 软件压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分.软件压力测试的基本思路很简单: 不是在常规条件下运行手动或自动测试,而是在计算机数量较少或系统资源匮乏的条件下运行测试. 通常要进行软件压力测试的资源包括内部内存.CPU 可用性.磁盘空间和网络带宽. 压力测试涵盖,性能测试,负载测试,并发测试等等,这些测试点常常交织耦合在一起. 压力测试存在那些问题 我归纳一下又几点: 操作系统默认安装,在未做任何优化的情况下实施压力测试

什么样的平台定义一个多长的压力测试时间让其稳定运行才是科学的?

  负载测试(Load testing).压力测试(Stress Test,应称为强度测试)和性能测试,这三个概念常常引起混淆,难以区分,从而造成不正确的理解和错误的使用. 目前对性能测试没有明确的定义,一般地,它主要是针对系统的性能指标制定性能测试方案,执行测试用例,得出测试结果来验证系统的性能指标是否满足既定值.性能指标里可能包括系统各个方面的能力,如系统并发处理能力,批量业务处理能力等. 负载测试.压力测试和性能测试的测试目的不同,但其手段和方法在一定程度上比较相似,通常会使用相同的测试环

房贷压力测试需五项修炼

文 /周 源 近期,银监会组织对国内7个城市的银行业金融机构开展房地产贷款压力测试,这是继2010年5月之后,银监会布置的第二轮房贷压力测试. 全球金融危机爆发之后,金融机构的压力测试开始变得"时髦"起来,先是2009年5月美国联邦储备银行对美国最大的19家金融机构进行压力测试:2010年7月,欧洲 银行监管委员会也公布了欧洲银行业压力测试的结果. 这几次压力测试都引起了公众的广泛关注,然而,正如巴塞尔银行监管委员会在2009年发布的<正确压力测试实践和监管的原则>中提出的

php 文件上传简单实例代码

<?php教程 if($_FILES['file']){  // ----------------------------------------------------------------------------------------------// // // 说明:文件上传   日期:2004-5-2 // // --------------------------------------------------------------------------------------

利用Java 编写手机应用程序(续)

程序 █对MIDlet进行调试     编写PalmOS上的Spotlet时,我们可以利用System.out.println()函式帮我们印出一些讯息以帮助调试,那幺在手机上的MIDlet呢? 原则上,我们还是可以利用System.out.println()函式做一些输出.当模拟器执行时,就会在命令列上输出一些讯息.    另外,在PalmOS上,有KVMutil.prc可以帮助我们纪录程序所输出的讯息.那手机上呢? 因为没有实际的机器可以测试,因此这个问题到现在还不得而知,相信Motorol

利用Java 编写手机应用程序--Motorola iDEN篇(2) (转)

程序 █对MIDlet进行调试     编写PalmOS上的Spotlet时,我们可以利用System.out.println()函式帮我们印出一些讯息以帮助调试,那幺在手机上的MIDlet呢? 原则上,我们还是可以利用System.out.println()函式做一些输出.当模拟器执行时,就会在命令列上输出一些讯息.    另外,在PalmOS上,有KVMutil.prc可以帮助我们纪录程序所输出的讯息.那手机上呢? 因为没有实际的机器可以测试,因此这个问题到现在还不得而知,相信Motorol