Stresstester源码分析

http://click.aliyun.com/m/1000005923/开启多线程去跑目标代码(每个线程访问的次数=总请求次数/并发数)

public StressResult test(int concurrencyLevel, int totalRequests, StressTask stressTask, int warmUpTime){if(stressTask ==null) {stressTask =this.emptyTestService;}warmUp(warmUpTime, stressTask);int everyThreadCount = totalRequests / concurrencyLevel;CyclicBarrier threadStartBarrier =newCyclicBarrier(concurrencyLevel);CountDownLatch threadEndLatch =newCountDownLatch(concurrencyLevel);AtomicInteger failedCounter =newAtomicInteger();StressContext stressContext =newStressContext();stressContext.setTestService(stressTask);stressContext.setEveryThreadCount(everyThreadCount);stressContext.setThreadStartBarrier(threadStartBarrier);stressContext.setThreadEndLatch(threadEndLatch);stressContext.setFailedCounter(failedCounter);ExecutorService executorService = Executors.newFixedThreadPool(concurrencyLevel);List workers =newArrayList(concurrencyLevel);for(int i =0; i < concurrencyLevel; i++){StressThreadWorker worker =newStressThreadWorker(stressContext, everyThreadCount);workers.add(worker);}for(int i =0; i < concurrencyLevel; i++){StressThreadWorker worker = (StressThreadWorker)workers.get(i);executorService.submit(worker);}try{threadEndLatch.await();}catch(InterruptedException e){log.error(“InterruptedException”, e);}executorService.shutdownNow();int realTotalRequests = everyThreadCount * concurrencyLevel;int failedRequests = failedCounter.get();StressResult stressResult =newStressResult();SortResult sortResult = getSortedTimes(workers);List allTimes = sortResult.allTimes;stressResult.setAllTimes(allTimes);List trheadTimes = sortResult.trheadTimes;long totalTime = ((Long)trheadTimes.get(trheadTimes.size() –1)).longValue();stressResult.setTestsTakenTime(totalTime);stressResult.setFailedRequests(failedRequests);stressResult.setTotalRequests(realTotalRequests);stressResult.setConcurrencyLevel(concurrencyLevel);stressResult.setWorkers(workers);returnstressResult;}

为什么要用2个同步辅助类CyclicBarrier,CountDownLatch

//设置线程集合点,等所有现存启动完毕在一起请求任务CyclicBarrier threadStartBarrier =newCyclicBarrier(concurrencyLevel);//控制所有线程做完任务后状态,数量为0的时间,所有任务执行完毕CountDownLatch threadEndLatch =newCountDownLatch(concurrencyLevel);

2.记录每次调用代码的时间,放到一个集合中

SortResult sortResult = getSortedTimes(workers);List allTimes = sortResult.allTimes;3.计算打印出tps /平均耗时/最短耗时/最长耗时

TPS=并发数/平均的相应时间

平均响应时间=测试总时间/总请求次数

package com.taobao.stresstester.core;importjava.io.IOException;importjava.io.Writer;importjava.util.List;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;publicclassSimpleResultFormaterimplementsStressResultFormater{protectedstaticLogger log = LoggerFactory.getLogger(SimpleResultFormater.class);publicvoidformat(StressResult stressResult, Writer writer){long testsTakenTime = stressResult.getTestsTakenTime();int totalRequests = stressResult.getTotalRequests();int concurrencyLevel = stressResult.getConcurrencyLevel();float takes = StatisticsUtils.toMs(testsTakenTime);List allTimes = stressResult.getAllTimes();long totaleTimes = StatisticsUtils.getTotal(allTimes);float tps =1.0E+009F * (concurrencyLevel * (totalRequests / (float)totaleTimes));float averageTime = StatisticsUtils.getAverage(totaleTimes,totalRequests);float onTheadAverageTime = averageTime / concurrencyLevel;int count_50 = totalRequests /2;int count_66 = totalRequests *66/100;int count_75 = totalRequests *75/100;int count_80 = totalRequests *80/100;int count_90 = totalRequests *90/100;int count_95 = totalRequests *95/100;int count_98 = totalRequests *98/100;int count_99 = totalRequests *99/100;long longestRequest = ((Long)allTimes.get(allTimes.size() –1)).longValue();long shortestRequest = ((Long)allTimes.get(0)).longValue();StringBuilder view =newStringBuilder();view.append(” Concurrency Level:\t”).append(concurrencyLevel).append(“–并发数”);view.append(“\r\n Time takenfortests:\t”).append(takes).append(” ms”).append(“–测试耗时”);view.append(“\r\n Complete Requests:\t”).append(totalRequests).append(“–完成测试次数”);

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容