zoukankan      html  css  js  c++  java
  • 压力测试工具ab

    搞互联网开发,压力测试必不可少。压力测试的工具很多,我用过ab和JMeter,今天主要讲ab的用法。

    1、ab是什么

    ab is a tool for benchmarking your Apache Hypertext Transfer Protocol (HTTP) server. It is designed to give you an impression of how your current Apache installation performs. This especially shows you how many requests per second your Apache installation is capable of serving.

    2、官网

    2.1、文档地址

    http://httpd.apache.org/docs/2.4/programs/ab.html

    2.2、如何找到文档

    2.3、下载安装

    3、用法

    3.1、测试GET请求

    D:Apache24in>ab -n 200 -c 100 http://www.baidu.com/
    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 www.baidu.com (be patient)
    Completed 100 requests
    Completed 200 requests
    Finished 200 requests
    
    
    Server Software:        BWS/1.1
    Server Hostname:        www.baidu.com
    Server Port:            80
    
    Document Path:          /
    Document Length:        114870 bytes
    
    Concurrency Level:      100
    Time taken for tests:   3.065 seconds
    Complete requests:      200
    Failed requests:        192
       (Connect: 0, Receive: 0, Length: 192, Exceptions: 0)
    Total transferred:      23169728 bytes
    HTML transferred:       22986269 bytes
    Requests per second:    65.25 [#/sec] (mean)
    Time per request:       1532.640 [ms] (mean)
    Time per request:       15.326 [ms] (mean, across all concurrent requests)
    Transfer rate:          7381.61 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        1   14   8.4     12      67
    Processing:    39 1183 540.3   1400    2163
    Waiting:        6  613 422.4    595    1368
    Total:         47 1198 539.8   1414    2168
    
    Percentage of the requests served within a certain time (ms)
      50%   1414
      66%   1514
      75%   1565
      80%   1603
      90%   1773
      95%   1865
      98%   2062
      99%   2074
     100%   2168 (longest request)
    
    D:Apache24in>
    D:Apache24in>ab -n 100 -c 50 http://localhost:8080/coupon/getByMechantId.json?merchantId=10002
    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 localhost (be patient).....done
    
    
    Server Software:
    Server Hostname:        localhost
    Server Port:            8080
    
    Document Path:          /coupon/getByMechantId.json?merchantId=10002
    Document Length:        1031 bytes
    
    Concurrency Level:      50
    Time taken for tests:   0.361 seconds
    Complete requests:      100
    Failed requests:        0
    Total transferred:      117500 bytes
    HTML transferred:       103100 bytes
    Requests per second:    276.97 [#/sec] (mean)
    Time per request:       180.527 [ms] (mean)
    Time per request:       3.611 [ms] (mean, across all concurrent requests)
    Transfer rate:          317.81 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    0   0.4      0       1
    Processing:    18   90  44.7     87     178
    Waiting:       18   87  45.0     83     177
    Total:         18   90  44.8     87     178
    
    Percentage of the requests served within a certain time (ms)
      50%     87
      66%     94
      75%    144
      80%    146
      90%    152
      95%    154
      98%    178
      99%    178
     100%    178 (longest request)
    
    D:Apache24in>

    3.2、测试POST请求

    D:Apache24in>ab -n 1000 -c 200 -p D:data.json -T application/json http://localhost:8080/coupon/save.json
    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 localhost (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:        localhost
    Server Port:            8080
    
    Document Path:          /coupon/save.json
    Document Length:        49 bytes
    
    Concurrency Level:      200
    Time taken for tests:   3.306 seconds
    Complete requests:      1000
    Failed requests:        0
    Total transferred:      191000 bytes
    Total body sent:        433000
    HTML transferred:       49000 bytes
    Requests per second:    302.52 [#/sec] (mean)
    Time per request:       661.121 [ms] (mean)
    Time per request:       3.306 [ms] (mean, across all concurrent requests)
    Transfer rate:          56.43 [Kbytes/sec] received
                            127.92 kb/s sent
                            184.35 kb/s total
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    0   0.5      0       5
    Processing:    18  589 432.2    603    2459
    Waiting:       18  588 432.3    602    2459
    Total:         19  589 432.2    603    2459
    
    Percentage of the requests served within a certain time (ms)
      50%    603
      66%    662
      75%    713
      80%    742
      90%   1210
      95%   1270
      98%   1805
      99%   1848
     100%   2459 (longest request)
    
    D:Apache24in>

    3.3、带Cookie

    D:Apache24in>ab -n 1000 -c 200 -C token=1234 -p D:data.json -T application/json http://localhost:8080/coupon/save.json

    data.json是这样的:

    {
        "merchantId": 10004,
        "couponName": "我妈最美",
        "couponType": 1,
        "parValue": 520,
        "quantity": 1000,
        "releaseStartTime": "2018-05-13 00:00:00",
        "releaseEndTime": "2018-05-13 23:59:59",
        "limitType": 1,
        "limitNum": 1,
        "remark": "妈妈,您辛苦了!"
    }

    4、Linux下使用ab

    yum install httpd-tools

    java -jar cjs-springboot-example.jar &

    用法没变

    5、代码

     1 package com.cjs.boot.controller;
     2 
     3 import com.cjs.boot.domain.entity.CouponInfo;
     4 import com.cjs.boot.response.RespResult;
     5 import com.cjs.boot.service.CouponInfoService;
     6 import org.springframework.beans.factory.annotation.Autowired;
     7 import org.springframework.stereotype.Controller;
     8 import org.springframework.validation.annotation.Validated;
     9 import org.springframework.web.bind.annotation.*;
    10 import org.springframework.web.servlet.ModelAndView;
    11 
    12 import javax.validation.constraints.NotNull;
    13 import java.util.List;
    14 
    15 
    16 @Controller
    17 @RequestMapping("/coupon")
    18 @Validated
    19 public class CouponController extends BaseController {
    20 
    21     @Autowired
    22     private CouponInfoService couponInfoService;
    23 
    24     @GetMapping("/detail.html")
    25     public ModelAndView detail(@NotNull(message = "ID不能为空") Long id) {
    26         ModelAndView modelAndView = new ModelAndView("coupon/detail");
    27         //  TODO 查询
    28         return modelAndView;
    29     }
    30 
    31     @GetMapping("/getByMechantId.json")
    32     @ResponseBody
    33     public RespResult<List<CouponInfo>> getByMechantId(Integer merchantId) {
    34         List<CouponInfo> list = couponInfoService.getByMerchantId(merchantId);
    35         return new RespResult<List<CouponInfo>>(list);
    36     }
    37 
    38     @GetMapping("/deleteByMechantId.json")
    39     @ResponseBody
    40     public RespResult<List<CouponInfo>> deleteByMerchantId(Integer merchantId) {
    41         couponInfoService.deleteByMerchantId(merchantId);
    42         return RespResult.success();
    43     }
    44 
    45     @GetMapping("/getById.json")
    46     @ResponseBody
    47     public RespResult<CouponInfo> getById(Long id) {
    48         CouponInfo couponInfo = couponInfoService.getById(id);
    49         return new RespResult<CouponInfo>(couponInfo);
    50     }
    51 
    52     @GetMapping("/deleteById.json")
    53     @ResponseBody
    54     public RespResult deleteById(Long id) {
    55         couponInfoService.deleteById(id);
    56         return RespResult.success();
    57     }
    58 
    59     @GetMapping("/add.html")
    60     public ModelAndView add() {
    61         return new ModelAndView("coupon/add");
    62     }
    63 
    64     @PostMapping("/save.json")
    65     @ResponseBody
    66     public RespResult save(@RequestBody CouponInfo couponInfo, @CookieValue(required = false) String token) {
    67         couponInfoService.save(couponInfo);
    68         return RespResult.success();
    69     }
    70 }
     1 package com.cjs.boot;
     2 
     3 import com.alibaba.fastjson.serializer.SerializerFeature;
     4 import com.alibaba.fastjson.support.config.FastJsonConfig;
     5 import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
     6 import com.cjs.boot.event.BlackListListener;
     7 import org.springframework.boot.SpringApplication;
     8 import org.springframework.boot.autoconfigure.SpringBootApplication;
     9 import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
    10 import org.springframework.boot.web.server.ErrorPage;
    11 import org.springframework.boot.web.server.ErrorPageRegistrar;
    12 import org.springframework.boot.web.server.ErrorPageRegistry;
    13 import org.springframework.cache.annotation.EnableCaching;
    14 import org.springframework.context.annotation.Bean;
    15 import org.springframework.http.HttpStatus;
    16 import org.springframework.http.MediaType;
    17 import org.springframework.scheduling.annotation.EnableAsync;
    18 
    19 import java.util.ArrayList;
    20 import java.util.List;
    21 
    22 //@MapperScan("com.cjs.boot.mapper")
    23 @EnableCaching
    24 @EnableAsync
    25 @SpringBootApplication
    26 public class CjsSpringbootExampleApplication {
    27 
    28     public static void main(String[] args) {
    29         SpringApplication.run(CjsSpringbootExampleApplication.class, args);
    30 
    31 //        SpringApplication springApplication = new SpringApplication(CjsSpringbootExampleApplication.class);
    32 //        springApplication.addListeners(new BlackListListener());
    33 //        springApplication.run(args);
    34 
    35     }
    36 
    37     @Bean
    38     public ErrorPageRegistrar errorPageRegistrar() {
    39         return new ErrorPageRegistrar() {
    40             @Override
    41             public void registerErrorPages(ErrorPageRegistry registry) {
    42                 registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400.html"));
    43                 registry.addErrorPages(new ErrorPage(HttpStatus.FORBIDDEN, "/403.html"));
    44                 registry.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404.html"));
    45                 registry.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/500.html"));
    46             }
    47         };
    48     }
    49 
    50     @Bean
    51     public HttpMessageConverters fastJsonHttpMessageConverters(){
    52         FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
    53         FastJsonConfig fastJsonConfig = new FastJsonConfig();
    54         fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
    55         List<MediaType> mediaTypes = new ArrayList<>();
    56         mediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
    57         mediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
    58         fastJsonHttpMessageConverter.setSupportedMediaTypes(mediaTypes);
    59         fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
    60 
    61         return new HttpMessageConverters(fastJsonHttpMessageConverter);
    62 
    63     }
    64 
    65 }

    参考

    https://www.cnblogs.com/EthanCai/archive/2014/05/11/3721656.html

    https://blog.csdn.net/wx19900503/article/details/56847264

    https://www.jianshu.com/p/e3793ae91a62

    https://blog.csdn.net/dreamer2020/article/details/52904686

    http://wetest.qq.com/

    http://wetest.qq.com/gaps/

  • 相关阅读:
    Avoiding the Backup of Online Redo Logs
    RMAN-20201: datafile not found in the recovery catalog
    ORA-15081: failed to submit an I/O operation to a disk
    字符串替换数字问题
    jstl换行符处理
    字符串匹配问题
    careercup题目20131013
    careercup题目20131010
    careercup题目201330928
    面试题(一)
  • 原文地址:https://www.cnblogs.com/cjsblog/p/9038838.html
Copyright © 2011-2022 走看看