壓力測試工具詳解

Apache Bench(AB)

小巧簡單

localhost:config-cache biguodong$ ab --help
ab: wrong number of arguments
Usage: ab [options] [http[s]://]hostname[:port]/path
Options are:
    -n requests     請求總數
    -c concurrency  請求并發(fā)數
    -t timelimit    Seconds to max. to spend on benchmarking
                    This implies -n 50000
    -s timeout      Seconds to max. wait for each response
                    Default is 30 seconds
    -b windowsize   Size of TCP send/receive buffer, in bytes
    -B address      Address to bind to when making outgoing connections
    -p postfile     File containing data to POST. Remember also to set -T
    -u putfile      File containing data to PUT. Remember also to set -T
    -T content-type Content-type header to use for POST/PUT data, eg.
                    'application/x-www-form-urlencoded'
                    Default is 'text/plain'
    -v verbosity    How much troubleshooting info to print
    -w              Print out results in HTML tables
    -i              Use HEAD instead of GET
    -x attributes   String to insert as table attributes
    -y attributes   String to insert as tr attributes
    -z attributes   String to insert as td or th attributes
    -C attribute    Add cookie, eg. 'Apache=1234'. (repeatable)
    -H attribute    Add Arbitrary header line, eg. 'Accept-Encoding: gzip'
                    Inserted after all normal header lines. (repeatable)
    -g filename     Output collected data to gnuplot format file.
    -e filename     Output CSV file with percentages served

舉個例子

ab -n 1000 -c 10 http://127/0.0.1:8080/test

返回結果

localhost:config-cache biguodong$ ab -n 1000 -c 10 http://127.0.0.1:8080/test
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:
Server Hostname:        127.0.0.1
Server Port:            8080

Document Path:          /test
Document Length:        4 bytes

Concurrency Level:      10//并發(fā)量
Time taken for tests:   6.699 seconds//整個測試使用時間
Complete requests:      1000//完成的請求數目
Failed requests:        0//失敗的請求書
Total transferred:      136000 bytes//標示所有請求的響應數據長度總和娘纷,包括每個http響應數據的頭信息和正文數據的信息塌忽,不包括http請求數據的長度,僅包括服務器流向用戶pc的數據總長度失驶;
HTML transferred:       4000 bytes//所有請求響應數據中正文數據的總和(除去頭信息)
Requests per second:    149.29 [#/sec] (mean)//吞吐率,是與并發(fā)數有關的枣购,是用Complete requests比上Time taken for tests即 1000/6.699
Time per request:       66.985 [ms] (mean)//用戶平均等待時間
Time per request:       6.699 [ms] (mean, across all concurrent requests)//服務器平均等待時間
Transfer rate:          19.83 [Kbytes/sec] received//單位時間內從服務器獲取到的數據長度Total transferred比上Time taken for tests即13600/6.699

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   1.0      0       8
Processing:     1   66 590.1      5    6059
Waiting:        0   35 417.3      4    5932
Total:          1   67 590.0      6    6059

Jmeter壓力測試

幾個參數

線程組的幾個概念:

  1. 線程數:即虛擬用戶數嬉探,有多少個虛擬用戶并發(fā)模擬,如果模擬100個用戶棉圈,輸入100就好了涩堤;
  2. Ramp-Up Period(in seconds)虛擬用戶增長時長:比如模擬一段時間的登錄時間段,比如20分鐘分瘾,但是胎围,一般測試肯定不會這么長,我們估計出登錄頻率最高的時間段德召,如果我們設置為300白魂,意思是100個用戶在5min中內登錄完畢;
  3. 循環(huán)次數:單個虛擬用戶執(zhí)行的次數上岗;

步驟

  1. 先添加一個http請求


    添加一個Http請求

效果如下:


效果圖
  1. 如果我們的請求需要添加header信息


    添加Header

效果如下:


效果圖
  1. 添加斷言查看結果
    響應斷言福荸,用來判斷你的請求響應是否達到預期


    響應斷言

效果如下:


效果圖

配置查看結果樹


查看結果樹

配置聚合報告,做統(tǒng)計信息處理肴掷;


聚合報告

響應斷言配合查看結果樹


響應斷言配合查看結果樹

可以查看每個請求的請求request 和 response
響應斷言配合聚合報告


響應斷言配合聚合報告

結果集中統(tǒng)計了所有測試的響應時間敬锐、錯誤率等聚合信息;
在配置一個圖形結果


圖形結果

效果如下:


效果圖

這里的各項數據含義自己要好好弄清楚奧,這里不贅述了
其他元件的使用自己去安裝一個jmeter壓力測試起來吧~~

代碼來做壓力測試

CountDownLatch

(字面的意思是計數器往下減的一個閉鎖)的使用

概念圖
  1. 假設計數器的值為 3
  2. 線程 A 調用了 await() 方法后呆瞻,當前線程 A 進入awaiting狀態(tài)台夺;
  3. 在其他進程的代碼里,每次執(zhí)行countDown()這個方法后痴脾,計數器的值就會減 1颤介;
  4. 當計數器從 3 主鍵變成 0 之后鹏倘,線程A就繼續(xù)執(zhí)行编丘;

CountDownLatch可以阻塞線程,并在達到一定條件后繼續(xù)執(zhí)行贾铝;

適合線程打到一定的條件后繼續(xù)其他的操作薯定;

Semphore

概念圖

字面意思:信號量始绍,類比交通工具-紅綠燈
可以阻塞進行,并且可以控制同一時間的并發(fā)量话侄;

適合控制線程的并發(fā)數亏推;

代碼拿來:
這里自定義了線程池学赛,以及自定義拒絕策略實現,這里為了測試在 add() 方法中添加了 sleep()等待

@Slf4j
@NotThreadSafe
public class CountExample1 {
    /**
     * 執(zhí)行總數吞杭,5000次加一操作
     */
    private static final int REQUEST_TOTAL = 5000;
    /**
     * 同一時間的并發(fā)總數
     */
    private static final int CONCURRENCY_COUNT = 20;
    private static final int MAXIMUM_POOL_SIZE = 100;
    private static int count = 0;

    public static void main(String[] args) throws Exception{
        // 所有請求執(zhí)行完畢之后統(tǒng)計我們的執(zhí)行結果盏浇,因此這里使用的是 REQUEST_TOTAL
        final CountDownLatch countDownLatch = new CountDownLatch(REQUEST_TOTAL);
        final Semaphore semaphore = new Semaphore(CONCURRENCY_COUNT);
        // 初始化一個線程池
        ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("con-%s").build();
        ExecutorService threadPoolExecutor = new ThreadPoolExecutor(CONCURRENCY_COUNT, MAXIMUM_POOL_SIZE, 30, TimeUnit.SECONDS, new ArrayBlockingQueue<>(30), threadFactory, new BlockingPolicy());

        for(int i = 0; i < REQUEST_TOTAL; i ++) {
            threadPoolExecutor.execute(() -> {
                try{
                    // 每個線程執(zhí)行前需要嘗試獲取信號量(是否允許被執(zhí)行,如果達到并發(fā)數芽狗,當前線程會被阻塞)
                    semaphore.acquire();
                    add();
                    // 執(zhí)行完畢之后釋放信號量
                    semaphore.release();
                }catch (Exception e){
                    log.error("caught some error", e);
                }
                // 線程執(zhí)行完畢后執(zhí)行次數 - 1
                countDownLatch.countDown();
                //countDownLatch.countDown();
            });
        }
        // 所有線程執(zhí)行完畢之后绢掰,輸出我們的結果
        countDownLatch.await();
        // 線程池執(zhí)行完畢之后關閉線程池
        threadPoolExecutor.shutdown();
        log.info(">>>>>>>>>>>> : count:{}", count);
    }

    private static void add() throws InterruptedException{
        TimeUnit.MILLISECONDS.sleep(100);
        count ++;
    }
}

上述測試了線程的隊列、線程池的拒接策略等問題童擎,實際中可將QueueSize 調整大于 5000滴劲,自定義拒絕策略中,把任務又重新放回了隊列中顾复;
不斷調整Sleep()時間大小班挖,越大,返回的count越小芯砸,因為每個線程執(zhí)行的時間加長萧芙,導致協會主存的count是同一個數的概率增大!

16:41:59.647 [main] INFO com.mmall.concurrency.example.count.bigd.CountExample1 - >>>>>>>>>>>> : count:4859

快使用起來吧~~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末假丧,一起剝皮案震驚了整個濱河市双揪,隨后出現的幾起案子,更是在濱河造成了極大的恐慌虎谢,老刑警劉巖盟榴,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異婴噩,居然都是意外死亡擎场,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門几莽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迅办,“玉大人,你說我怎么就攤上這事章蚣≌酒郏” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵纤垂,是天一觀的道長矾策。 經常有香客問我,道長峭沦,這世上最難降的妖魔是什么贾虽? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮吼鱼,結果婚禮上蓬豁,老公的妹妹穿的比我還像新娘绰咽。我一直安慰自己,他們只是感情好地粪,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布取募。 她就那樣靜靜地躺著,像睡著了一般蟆技。 火紅的嫁衣襯著肌膚如雪玩敏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天质礼,我揣著相機與錄音聊品,去河邊找鬼。 笑死几苍,一個胖子當著我的面吹牛,可吹牛的內容都是我干的陈哑。 我是一名探鬼主播妻坝,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惊窖!你這毒婦竟也來了刽宪?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤界酒,失蹤者是張志新(化名)和其女友劉穎圣拄,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體毁欣,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡庇谆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了凭疮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饭耳。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖执解,靈堂內的尸體忽然破棺而出寞肖,到底是詐尸還是另有隱情,我是刑警寧澤衰腌,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布新蟆,位于F島的核電站,受9級特大地震影響右蕊,放射性物質發(fā)生泄漏琼稻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一尤泽、第九天 我趴在偏房一處隱蔽的房頂上張望欣簇。 院中可真熱鬧规脸,春花似錦、人聲如沸熊咽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽横殴。三九已至被因,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衫仑,已是汗流浹背梨与。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留文狱,地道東北人粥鞋。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像瞄崇,于是被迫代替她去往敵國和親呻粹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,100評論 1 32
  • 前后端數據交互經常會碰到請求跨域苏研,什么是跨域等浊,以及有哪幾種跨域方式,這是本文要探討的內容摹蘑。 本文完整的源代碼請猛戳...
    零星小雨_c84a閱讀 404評論 0 1
  • 前陣子遇到幾個面試題都是關于對Java內存控制的,因此從網上找到這篇文章,希望自己對Java的內存分配有重新的認識...
    vpike閱讀 354評論 0 0
  • 什么是http和https協議: HTTP協議:全稱是HyperText Transfer Protocol筹燕,中文...
    a35f9c03b68e閱讀 365評論 0 0
  • “裴先生,這邊請衅鹿∪鲎伲”校長恭敬地迎著一個年輕人在黃昏的校園里漫步,而這個年輕人大渤,也是清俊逸雅之姿糠涛,引來不少女學生的驚...
    劷咩咩閱讀 612評論 1 5